Redis7 集群

2024-02-02 08:20
文章标签 集群 redis7

本文主要是介绍Redis7 集群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Redis集群

redis3.0以后推出的redis cluster 集群方案,redis cluster集群保证了高可用、高性能、高可扩展性。

Redis的集群策略

Redis-cluster架构图

在这里插入图片描述

架构细节:

  • (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
  • (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
  • (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  • (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<- >value

Redis 集群存储图解

Redis 集群中内置了 16384个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应 一个编号在 0-16383之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
在这里插入图片描述
在这里插入图片描述

Redis-cluster投票:容错

在这里插入图片描述

(1)节点失效判断:

集群中所有master参与投票,如果半数以上master节点与其中一个master节点通
信超过(cluster-node-timeout),认为该master节点挂掉.

(2)集群失效判断:

什么时候整个集群不可用(cluster_state:fail)?

  • 如果集群任意master挂掉,且当前master没有slave,则集群进入fail状态。也可以理解成集群的[0-16383]slot映射不完全时进入fail状态。
  • 如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态。

安装RedisCluster

Redis集群最少需要三台主服务器,三台从服务器。 端口号分别为:7001~7006

  • 第一步:创建7001实例,并编辑redis.conf文件,修改port为7001。
    注意:创建实例,即拷贝单机版安装时,生成的bin目录,为7001目录。
    在这里插入图片描述
  • 第二步:修改redis.conf配置文件,打开Cluster-enable yes
    在这里插入图片描述
  • 第三步:复制7001,创建7002~7006实例,注意端口修改。
  • 第四步:启动所有的实例
    vim start-cluster.sh
cd 7001 
./redis-server redis.conf 
cd .. 
cd 7002 
./redis-server redis.conf 
cd .. 
cd 7003 
./redis-server redis.conf 
cd .. 
cd 7004 
./redis-server redis.conf 
cd .. 
cd 7005 
./redis-server redis.conf 
cd .. 
cd 7006 
./redis-server redis.conf 
cd ..

chmod u+x start-cluster.sh

  • 第五步:创建Redis集群
./redis-cli --cluster create 192.168.10.135:7001 192.168.10.135:7002 192.168.10.135:7003 192.168.10.135:7004 192.168.10.135:7005 192.168.10.135:7006 --cluster-replicas 1 
>>> Creating cluster Connecting to node 192.168.10.133:7001: OK 
Connecting to node 192.168.10.133:7002: OK 
Connecting to node 192.168.10.133:7003: OK 
Connecting to node 192.168.10.133:7004: OK 
Connecting to node 192.168.10.133:7005: OK 
Connecting to node 192.168.10.133:7006: OK 
>>> Performing hash slots allocation on 6 nodes... 
Using 3 masters: 
192.168.10.133:7001
192.168.10.133:7002 
192.168.10.133:7003Adding replica 192.168.10.133:7004 to 192.168.10.133:7001 
Adding replica 192.168.10.133:7005 to 192.168.10.133:7002
Adding replica 192.168.10.133:7006 to 192.168.10.133:7003 
M: d8f6a0e3192c905f0aad411946f3ef9305350420 192.168.10.133:7001 
slots:0-5460 (5461 slots) master 
M: 7a12bc730ddc939c84a156f276c446c28acf798c 192.168.10.133:7002 
slots:5461-10922 (5462 slots) master 
M: 93f73d2424a796657948c660928b71edd3db881f 192.168.10.133:7003 
slots:10923-16383 (5461 slots) master 
S: f79802d3da6b58ef6f9f30c903db7b2f79664e61 192.168.10.133:7004 
replicates d8f6a0e3192c905f0aad411946f3ef9305350420 
S: 0bc78702413eb88eb6d7982833a6e040c6af05be 192.168.10.133:7005 
replicates 7a12bc730ddc939c84a156f276c446c28acf798c 
S: 4170a68ba6b7757e914056e2857bb84c5e10950e 192.168.10.133:7006 
replicates 93f73d2424a796657948c660928b71edd3db881f Can I set the above configuration? (type 'yes' to accept): yes>>> Nodes configuration updated 
>>> Assign a different config epoch to each node 
>>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join.... 
>>> Performing Cluster Check (using node 192.168.10.133:7001) 
M: d8f6a0e3192c905f0aad411946f3ef9305350420 192.168.10.133:7001 
slots:0-5460 (5461 slots) master 
M: 7a12bc730ddc939c84a156f276c446c28acf798c 192.168.10.133:7002 
slots:5461-10922 (5462 slots) master 
M: 93f73d2424a796657948c660928b71edd3db881f 192.168.10.133:7003 
slots:10923-16383 (5461 slots) master 
M: f79802d3da6b58ef6f9f30c903db7b2f79664e61 192.168.10.133:7004 
slots: (0 slots) master replicates d8f6a0e3192c905f0aad411946f3ef9305350420 
M: 0bc78702413eb88eb6d7982833a6e040c6af05be 192.168.10.133:7005 
slots: (0 slots) master replicates 7a12bc730ddc939c84a156f276c446c28acf798c 
M: 4170a68ba6b7757e914056e2857bb84c5e10950e 192.168.10.133:7006 
slots: (0 slots) master replicates 93f73d2424a796657948c660928b71edd3db881f 
[OK] All nodes agree about slots configuration. 
>>> Check for open slots... 
>>> Check slots coverage... 
[OK] All 16384 slots covered. 
[root@localhost-0723 redis]#

命令客户端连接集群

命令:

./redis-cli –h 127.0.0.1 –p 7001 –c

注意:-c 表示是以redis集群方式进行连接

./redis-cli -p 7006 -c 
127.0.0.1:7006> set key1 123 
-> Redirected to slot [9189] located at 127.0.0.1:7002 
OK
127.0.0.1:7002>

查看集群的命令

查看集群状态

127.0.0.1:7003> cluster info 
cluster_state:ok 
cluster_slots_assigned:16384 
cluster_slots_ok:16384 
cluster_slots_pfail:0 
cluster_slots_fail:0 
cluster_known_nodes:6 
cluster_size:3 
cluster_current_epoch:6 
cluster_my_epoch:3 
cluster_stats_messages_sent:926 
cluster_stats_messages_received:926

查看集群中的节点

127.0.0.1:7003> cluster nodes 
7a12bc730ddc939c84a156f276c446c28acf798c 127.0.0.1:7002 master - 0 
1443601739754 2 connected 5461-10922 
93f73d2424a796657948c660928b71edd3db881f 127.0.0.1:7003 myself,master - 0 0 3 
connected 10923-16383 
d8f6a0e3192c905f0aad411946f3ef9305350420 127.0.0.1:7001 master - 0 
1443601741267 1 connected 0-5460 
4170a68ba6b7757e914056e2857bb84c5e10950e 127.0.0.1:7006 slave 
93f73d2424a796657948c660928b71edd3db881f 0 1443601739250 6 connected 
f79802d3da6b58ef6f9f30c903db7b2f79664e61 127.0.0.1:7004 slave 
d8f6a0e3192c905f0aad411946f3ef9305350420 0 1443601742277 4 connected 
0bc78702413eb88eb6d7982833a6e040c6af05be 127.0.0.1:7005 slave 
7a12bc730ddc939c84a156f276c446c28acf798c 0 1443601740259 5 connected 
127.0.0.1:7003>

维护节点

集群创建成功后可以继续向集群中添加节点

添加主节点

  • 先创建7007节点
  • 添加7007结点作为新节点
  • 执行命令:

./redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001

hash槽重新分配(数据迁移)

添加完主节点需要对主节点进行hash槽分配,这样该主节才可以存储数据。

  • 查看集群中槽占用情况

cluster nodes

redis集群有16384个槽,集群中的每个结点分配自已槽,通过查看集群结点可以看到槽占用情况。

给刚添加的7007结点分配槽

  • 第一步:连接上集群(连接集群中任意一个可用结点都行)
./redis-cli --cluster reshard 127.0.0.1:7007
  • 第二步:输入要分配的槽数量
./redis-trib.rb reshard 192.168.101.3:7001

输入给目标节点要分配的槽

How many slots do you want to movefrom 1 to 16384)
  • 第三步:输入接收槽的结点id
What is the receiving node ID?

输入15b809eadae88955e36bcdbb8144f61bbbaf38fb

PS:这里准备给7007分配槽,通过cluster nodes查看7007结点id为: 15b809eadae88955e36bcdbb8144f61bbbaf38fb

  • 第四步:输入源结点id
Source node #1:all

输入源节点id,槽将从源节点中拿,分配后的槽在源节点中就不存在了,输入all 从所有源节点中获取槽,输入done取消分配。

  • 第五步:输入yes开始移动槽到目标结点id
Do you want to proceed with the proposed reshard plan (yes/no)?

输入:yes

添加从节点

添加7008从结点,将7008作为7007的从结点

命令:

./redis-cli --cluster add-node 新节点的ip和端口 旧节点ip和端口 --cluster-slave --cluster-master-id 主节点id

例如:

./redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id d1ba0092526cdfe66878e8879d446acfdcde25d8

d1ba0092526cdfe66878e8879d446acfdcde25d8是7007结点的id,可通过cluster nodes查看

注意:
如果原来该结点在集群中的配置信息已经生成到cluster-config-file指定的配置文件中(如果cluster-config-file没有指定则默认为nodes.conf),这时可能会报错:

[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

  • 解决方法是删除生成的配置文件nodes.conf,删除后再执行./redis-trib.rb add-node指令

  • 查看集群中的结点,刚添加的7008为7007的从节点:

删除结点

命令:

 ./redis-cli --cluster del-node 127.0.0.1:7008 41592e62b83a8455f07f7797f1d5c071cffedb50

删除已经占有hash槽的结点会失败,报错如下:

[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.

需要将该结点占用的hash槽分配出去(参考hash槽重新分配章节)

Jedis连接集群

需要开启防火墙,或者直接关闭防火墙。

service iptables stop

代码实现

创建JedisCluster类连接redis集群。

@Test 
public void testJedisCluster() throws Exception { //创建一连接,JedisCluster对象,在系统中是单例存在 Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("192.168.10.133", 7001));nodes.add(new HostAndPort("192.168.10.133", 7002)); nodes.add(new HostAndPort("192.168.10.133", 7003)); nodes.add(new HostAndPort("192.168.10.133", 7004)); nodes.add(new HostAndPort("192.168.10.133", 7005)); nodes.add(new HostAndPort("192.168.10.133", 7006)); JedisCluster cluster = new JedisCluster(nodes);//执行JedisCluster对象中的方法,方法和redis一一对应。 cluster.set("cluster-test", "my jedis cluster test"); String result = cluster.get("cluster-test"); System.out.println(result); //程序结束时需要关闭JedisCluster对象 cluster.close();
}

使用spring

配置applicationContext.xml

<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><!-- 最大连接数 --><property name="maxTotal" value="30" /><!-- 最大空闲连接数 --><property name="maxIdle" value="10" /><!-- 每次释放连接的最大数目 --><property name="numTestsPerEvictionRun" value="1024" /><!-- 释放连接的扫描间隔(毫秒) --><property name="timeBetweenEvictionRunsMillis" value="30000" /><!-- 连接最小空闲时间 --><property name="minEvictableIdleTimeMillis" value="1800000" /><!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 --><property name="softMinEvictableIdleTimeMillis" value="10000" /><!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 --><property name="maxWaitMillis" value="1500" /><!-- 在获取连接的时候检查有效性, 默认false --><property name="testOnBorrow" value="true" /><!-- 在空闲时检查有效性, 默认false --><property name="testWhileIdle" value="true" /><!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true --><property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis集群 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"><constructor-arg index="0"><set><bean class="redis.clients.jedis.HostAndPort"><constructor-arg index="0" value="192.168.101.3"></constructor-arg><constructor-arg index="1" value="7001"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg index="0" value="192.168.101.3"></constructor-arg><constructor-arg index="1" value="7002"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg index="0" value="192.168.101.3"></constructor-arg><constructor-arg index="1" value="7003"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg index="0" value="192.168.101.3"></constructor-arg><constructor-arg index="1" value="7004"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg index="0" value="192.168.101.3"></constructor-arg><constructor-arg index="1" value="7005"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg index="0" value="192.168.101.3"></constructor-arg><constructor-arg index="1" value="7006"></constructor-arg></bean></set></constructor-arg><constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg>
</bean> 35363738394041424344454647484950515253545556

测试代码

private ApplicationContext applicationContext; @Before public void init() { applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); }// redis集群 @Test public void testJedisCluster() { JedisCluster jedisCluster = (JedisCluster) applicationContext .getBean("jedisCluster"); jedisCluster.set("name", "zhangsan"); String value = jedisCluster.get("name"); System.out.println(value); }

这篇关于Redis7 集群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/670065

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

kubernetes集群部署Zabbix监控平台

一、zabbix介绍 1.zabbix简介 Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件。可以监视各种系统与设备的参数,保障服务器及设备的安全运营。 2.zabbix特点 (1)安装与配置简单。 (2)可视化web管理界面。 (3)免费开源。 (4)支持中文。 (5)自动发现。 (6)分布式监控。 (7)实时绘图。 3.zabbix的主要功能

laravel框架实现redis分布式集群原理

在app/config/database.php中配置如下: 'redis' => array('cluster' => true,'default' => array('host' => '172.21.107.247','port' => 6379,),'redis1' => array('host' => '172.21.107.248','port' => 6379,),) 其中cl

VMware8实现高可用(HA)集群

陈科肇 =========== 操作系统:中标麒麟高级操作系统V6 x86-64 实现软件:中标麒麟高可用集群软件 ======================== 1.环境的规划与配置 硬件要求 服务器服务器至少需要 2 台,每台服务器至少需要 2 块网卡以做心跳与连接公网使用存储环境 建议使用一台 SAN/NAS/ISCSI 存储作为数据共享存储空间 软

用Cri-O,Sealos CLI,Kubeadm方式部署K8s高可用集群

3.6 Cri-O方式部署K8s集群 注意:基于Kubernetes基础环境 3.6.1 所有节点安装配置cri-o [root@k8s-all ~]# VERSION=1.28[root@k8s-all ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensu