Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
现在我们是三个主节点分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:
节点A覆盖0-5460;
节点B覆盖5461-10922;
节点C覆盖10923-16383.
如果存入一个值,按照redis cluster哈希槽的算法: CRC16(‘key’)384 = 6782。 那么就会把这个key 的存储分配到 B 上了。同样,当我连接(A,B,C)任何一个节点想获取’key’这个key时,也会这样的算法,然后内部跳转到B节点上获取数据
以上参考
投票过程是集群中所有master参与,如果半数以上master节点与当前master节点通信超过cluster-node-timeout
设置的时间,认为当前master节点挂掉。
如果其中一个节点的master挂了,它的slave就会替换之前master的位置成为新的master,之前的恢复后就会变成slave。
简单的理解一下,redis-cluster集群是将主从模式和Sentinel模式的整合实现。
主机ip | 端口 |
---|---|
192.168.1.251 | 7001,7002 |
192.168.1.252 | 7001,7002 |
192.168.1.253 | 7001,7002 |
从官网下载redis的tar包,并解压安装
# 解压 tar -zxvf redis-5.0.14.tar.gz # 进入文件夹 cd redis-5.0.14 # 编译 make # 安装 make install
测试启动
redis-server redis.conf
mkdir /usr/local/redis-5.0.14/cluster cp /usr/local/redis-5.0.14/redis.conf /usr/local/redis-5.0.14/cluster/redis_7001.conf cp /usr/local/redis-5.0.14/redis.conf /usr/local/redis-5.0.14/cluster/redis_7002.conf chown -R 777 /usr/local/redis-5.0.14 mkdir -p /data1/redis/cluster/{redis_7001,redis_7002} && chown -R 777 /data1/redis
redis_7001.conf
# vim /usr/local/redis-5.0.14/cluster/redis_7001.conf bind 192.168.1.251 port 7001 daemonize yes pidfile "/var/run/redis_7001.pid" logfile "/usr/local/redis-5.0.14/cluster/redis_7001.log" dir "/data1/redis/cluster/redis_7001" masterauth 123456 requirepass 123456 appendonly yes cluster-enabled yes cluster-config-file nodes_7001.conf cluster-node-timeout 15000
redis_7002.conf
# vim /usr/local/redis-5.0.14/cluster/redis_7002.conf bind 192.168.1.251 port 7002 daemonize yes pidfile "/var/run/redis_7002.pid" logfile "/usr/local/redis-5.0.14/cluster/redis_7002.log" dir "/data1/redis/cluster/redis_7002" masterauth "123456" requirepass "123456" appendonly yes cluster-enabled yes cluster-config-file nodes_7002.conf cluster-node-timeout 15000
其他机器配置一致
启动redis服务
redis-server /usr/local/redis-5.0.14/cluster/redis_7001.conf tail -f /usr/local/redis-5.0.14/cluster/redis_7001.log redis-server /usr/local/redis-5.0.14/cluster/redis_7002.conf tail -f /usr/local/redis-5.0.14/cluster/redis_7002.log
如果redis版本比较低,则需要安装ruby。任选一台机器安装ruby即可
在redis-5中redis-trib.rb的功能被集成到了redis-cli中,大大简化了redis的集群部署,加快了进群部署的速度,也方便后期维护与扩容。
redis-cli -a 123456 --cluster create 192.168.1.251:7001 192.168.1.251:7002 192.168.1.252:7001 192.168.1.252:7002 192.168.1.253:7001 192.168.1.253:7002 --cluster-replicas 1
启动成功后结果如下:
从上可知:
192.168.1.251:7001 master 它的slave为 192.168.1.252:7002 192.168.1.252:7001 master 它的slave为 192.168.1.253:7002 192.168.1.253:7001 master 它的slave为 192.168.1.251:7002
# -c,使用集群方式登录 redis-cli -c -h 192.168.1.251 -p 7001 -a 123456
# 集群状态 192.168.1.251:7001> 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:1 cluster_stats_messages_ping_sent:526 cluster_stats_messages_pong_sent:541 cluster_stats_messages_sent:1067 cluster_stats_messages_ping_received:536 cluster_stats_messages_pong_received:526 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:1067
# 列出节点信息 192.168.1.251:7001> CLUSTER NODES e8ac4af0dd93b558260f1068b960d10df639ff5b 192.168.1.252:7001@17001 master - 0 1639652443264 3 connected 5461-10922 5d752d97d761a154989132841eabb1e12a46531f 192.168.1.253:7001@17001 master - 0 1639652444267 5 connected 10923-16383 63821c34dc1da011cd018731688e85a508391bdc 192.168.1.252:7002@17002 slave e6db21fdc82d444e5958d446a66a9c76d0ea60cc 0 1639652442000 4 connected 2c763d241297ea8778f76d497632a9e8b7bf8e9b 192.168.1.253:7002@17002 slave e8ac4af0dd93b558260f1068b960d10df639ff5b 0 1639652441257 6 connected e6db21fdc82d444e5958d446a66a9c76d0ea60cc 192.168.1.251:7001@17001 myself,master - 0 1639652442000 1 connected 0-5460 cd785a8263f97b26e1437095726a514e7f69d616 192.168.1.251:7002@17002 slave 5d752d97d761a154989132841eabb1e12a46531f 0 1639652442259 5 connected
192.168.1.252:7001> set key1 one OK 192.168.1.252:7001> set key2 211 -> Redirected to slot [4998] located at 192.168.1.251:7001 OK 192.168.1.253:7001> get key1 -> Redirected to slot [9189] located at 192.168.1.252:7001 "one" 192.168.1.252:7001> get key2 -> Redirected to slot [4998] located at 192.168.1.251:7001 "211"
可以看出redis cluster集群是去中心化的,每个节点都是平等的,连接哪个节点都可以获取和设置数据。
slave节点根本不提供服务,只是作为对应master节点的一个备份。
在192.168.1.251上增加1个节点7003
# vim /usr/local/redis-5.0.14/cluster/redis_7003.conf bind 192.168.1.251 port 7003 daemonize yes pidfile "/var/run/redis_7003.pid" logfile "/usr/local/redis-5.0.14/cluster/redis_7003.log" dir "/data1/redis/cluster/redis_7003" masterauth "123456" requirepass "123456" appendonly yes cluster-enabled yes cluster-config-file nodes_7003.conf cluster-node-timeout 15000 # mkdir /data1/redis/cluster/redis_7003 # redis-server /usr/local/redis-5.0.14/cluster/redis_7003.conf
在192.168.1.252上增加1个节点7003
# vim /usr/local/redis-5.0.14/cluster/redis_7003.conf bind 192.168.1.252 port 7003 daemonize yes pidfile "/var/run/redis_7003.pid" logfile "/usr/local/redis-5.0.14/cluster/redis_7003.log" dir "/data1/redis/cluster/redis_7003" masterauth "123456" requirepass "123456" appendonly yes cluster-enabled yes cluster-config-file nodes_7003.conf cluster-node-timeout 15000 # mkdir /data1/redis/cluster/redis_7003 # redis-server /usr/local/redis-5.0.14/cluster/redis_7003.conf
集群中增加节点:
192.168.1.251:7001> CLUSTER MEET 192.168.1.251 7003 OK 192.168.1.251:7001> CLUSTER NODES e8ac4af0dd93b558260f1068b960d10df639ff5b 192.168.1.252:7001@17001 master - 0 1639653625000 3 connected 5461-10922 5d752d97d761a154989132841eabb1e12a46531f 192.168.1.253:7001@17001 master - 0 1639653628000 5 connected 10923-16383 63821c34dc1da011cd018731688e85a508391bdc 192.168.1.252:7002@17002 slave e6db21fdc82d444e5958d446a66a9c76d0ea60cc 0 1639653627000 4 connected 2c763d241297ea8778f76d497632a9e8b7bf8e9b 192.168.1.253:7002@17002 slave e8ac4af0dd93b558260f1068b960d10df639ff5b 0 1639653629480 6 connected e6db21fdc82d444e5958d446a66a9c76d0ea60cc 192.168.1.251:7001@17001 myself,master - 0 1639653626000 1 connected 0-5460 20f69b6053f05aec6b3a4e006115b19752c41a78 192.168.1.251:7003@17003 master - 0 1639653629000 0 connected cd785a8263f97b26e1437095726a514e7f69d616 192.168.1.251:7002@17002 slave 5d752d97d761a154989132841eabb1e12a46531f 0 1639653628000 5 connected
192.168.1.251:7001> CLUSTER MEET 192.168.1.252 7003 OK 192.168.1.251:7001> CLUSTER NODES e8ac4af0dd93b558260f1068b960d10df639ff5b 192.168.1.252:7001@17001 master - 0 1639653675000 3 connected 5461-10922 16cd75f2b35423220330eee59ec6958e0d802b8f 192.168.1.252:7003@17003 master - 0 1639653677000 7 connected 5d752d97d761a154989132841eabb1e12a46531f 192.168.1.253:7001@17001 master - 0 1639653677000 5 connected 10923-16383 63821c34dc1da011cd018731688e85a508391bdc 192.168.1.252:7002@17002 slave e6db21fdc82d444e5958d446a66a9c76d0ea60cc 0 1639653677000 4 connected 2c763d241297ea8778f76d497632a9e8b7bf8e9b 192.168.1.253:7002@17002 slave e8ac4af0dd93b558260f1068b960d10df639ff5b 0 1639653678644 6 connected e6db21fdc82d444e5958d446a66a9c76d0ea60cc 192.168.1.251:7001@17001 myself,master - 0 1639653675000 1 connected 0-5460 20f69b6053f05aec6b3a4e006115b19752c41a78 192.168.1.251:7003@17003 master - 0 1639653677640 0 connected cd785a8263f97b26e1437095726a514e7f69d616 192.168.1.251:7002@17002 slave 5d752d97d761a154989132841eabb1e12a46531f 0 1639653678000 5 connected
新增的节点都是以master身份加入集群的
将新增的192.168.1.252:7003节点身份改为192.168.1.251:7003的slave
redis-cli -c -h 192.168.1.252 -p 7003 -a 123456 cluster replicate 20f69b6053f05aec6b3a4e006115b19752c41a78
# 查看集群状态 192.168.1.251:7001> CLUSTER NODES e8ac4af0dd93b558260f1068b960d10df639ff5b 192.168.1.252:7001@17001 master - 0 1639654051000 3 connected 5461-10922 16cd75f2b35423220330eee59ec6958e0d802b8f 192.168.1.252:7003@17003 slave 20f69b6053f05aec6b3a4e006115b19752c41a78 0 1639654054906 7 connected 5d752d97d761a154989132841eabb1e12a46531f 192.168.1.253:7001@17001 master - 0 1639654053000 5 connected 10923-16383 63821c34dc1da011cd018731688e85a508391bdc 192.168.1.252:7002@17002 slave e6db21fdc82d444e5958d446a66a9c76d0ea60cc 0 1639654051000 4 connected 2c763d241297ea8778f76d497632a9e8b7bf8e9b 192.168.1.253:7002@17002 slave e8ac4af0dd93b558260f1068b960d10df639ff5b 0 1639654052898 6 connected e6db21fdc82d444e5958d446a66a9c76d0ea60cc 192.168.1.251:7001@17001 myself,master - 0 1639654052000 1 connected 0-5460 20f69b6053f05aec6b3a4e006115b19752c41a78 192.168.1.251:7003@17003 master - 0 1639654053901 0 connected cd785a8263f97b26e1437095726a514e7f69d616 192.168.1.251:7002@17002 slave 5d752d97d761a154989132841eabb1e12a46531f 0 1639654052000 5 connected 192.168.1.251:7001>
查看相应的nodes.conf文件,可以发现有更改,它记录当前集群的节点信息
# cat /data1/redis/cluster/redis_7001/nodes_7001.conf e6db21fdc82d444e5958d446a66a9c76d0ea60cc 192.168.1.251:7001@17001 master - 0 1639653914000 1 connected 0-5460 63821c34dc1da011cd018731688e85a508391bdc 192.168.1.252:7002@17002 slave e6db21fdc82d444e5958d446a66a9c76d0ea60cc 0 1639653913000 4 connected 2c763d241297ea8778f76d497632a9e8b7bf8e9b 192.168.1.253:7002@17002 slave e8ac4af0dd93b558260f1068b960d10df639ff5b 0 1639653913076 6 connected 16cd75f2b35423220330eee59ec6958e0d802b8f 192.168.1.252:7003@17003 slave 20f69b6053f05aec6b3a4e006115b19752c41a78 0 1639653915080 7 connected 20f69b6053f05aec6b3a4e006115b19752c41a78 192.168.1.251:7003@17003 master - 0 1639653912000 0 connected 5d752d97d761a154989132841eabb1e12a46531f 192.168.1.253:7001@17001 master - 0 1639653912073 5 connected 10923-16383 e8ac4af0dd93b558260f1068b960d10df639ff5b 192.168.1.252:7001@17001 myself,master - 0 1639653912000 3 connected 5461-10922 cd785a8263f97b26e1437095726a514e7f69d616 192.168.1.251:7002@17002 slave 5d752d97d761a154989132841eabb1e12a46531f 0 1639653914078 5 connected vars currentEpoch 7 lastVoteEpoch 0
# 重新分配 # redis-cli -c -h 192.168.1.251 -p 7001 -a 123456 --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 192.168.1.251:7001 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Performing Cluster Check (using node 192.168.1.251:7001) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Rebalancing across 4 nodes. Total weight = 4.00 Moving 1366 slots from 192.168.1.252:7001 to 192.168.1.251:7003 ###################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################### Moving 1365 slots from 192.168.1.253:7001 to 192.168.1.251:7003 ##################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################### Moving 1365 slots from 192.168.1.251:7001 to 192.168.1.251:7003 ##################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################### [root@node1 cluster]#
192.168.1.251
[root@node1 redis_7001]# netstat -lntp |grep 7003 tcp 0 0 192.168.1.251:7003 0.0.0.0:* LISTEN 13662/redis-server tcp 0 0 192.168.1.251:17003 0.0.0.0:* LISTEN 13662/redis-server # kill 13662
可以看到slave节点192.168.1.252:7003变成了master
192.168.1.252:7003> CLUSTER NODES e8ac4af0dd93b558260f1068b960d10df639ff5b 192.168.1.252:7001@17001 master - 0 1639656794000 3 connected 6827-10922 cd785a8263f97b26e1437095726a514e7f69d616 192.168.1.251:7002@17002 slave 5d752d97d761a154989132841eabb1e12a46531f 0 1639656796000 5 connected 16cd75f2b35423220330eee59ec6958e0d802b8f 192.168.1.252:7003@17003 myself,master - 0 1639656794000 9 connected 0-1364 5461-6826 10923-12287 63821c34dc1da011cd018731688e85a508391bdc 192.168.1.252:7002@17002 slave e6db21fdc82d444e5958d446a66a9c76d0ea60cc 0 1639656796000 1 connected 2c763d241297ea8778f76d497632a9e8b7bf8e9b 192.168.1.253:7002@17002 slave e8ac4af0dd93b558260f1068b960d10df639ff5b 0 1639656795472 3 connected e6db21fdc82d444e5958d446a66a9c76d0ea60cc 192.168.1.251:7001@17001 master - 0 1639656797480 1 connected 1365-5460 5d752d97d761a154989132841eabb1e12a46531f 192.168.1.253:7001@17001 master - 0 1639656796476 5 connected 12288-16383 20f69b6053f05aec6b3a4e006115b19752c41a78 192.168.1.251:7003@17003 master,fail - 1639656777897 1639656775391 8 disconnected
现在测试重启刚刚挂掉的master节点
可以看到master节点恢复后变成了slave节点
192.168.1.252:7003> CLUSTER NODES e8ac4af0dd93b558260f1068b960d10df639ff5b 192.168.1.252:7001@17001 master - 0 1639657537000 3 connected 6827-10922 cd785a8263f97b26e1437095726a514e7f69d616 192.168.1.251:7002@17002 slave 5d752d97d761a154989132841eabb1e12a46531f 0 1639657535264 5 connected 16cd75f2b35423220330eee59ec6958e0d802b8f 192.168.1.252:7003@17003 myself,master - 0 1639657537000 9 connected 0-1364 5461-6826 10923-12287 63821c34dc1da011cd018731688e85a508391bdc 192.168.1.252:7002@17002 slave e6db21fdc82d444e5958d446a66a9c76d0ea60cc 0 1639657537000 1 connected 2c763d241297ea8778f76d497632a9e8b7bf8e9b 192.168.1.253:7002@17002 slave e8ac4af0dd93b558260f1068b960d10df639ff5b 0 1639657539273 3 connected e6db21fdc82d444e5958d446a66a9c76d0ea60cc 192.168.1.251:7001@17001 master - 0 1639657538270 1 connected 1365-5460 5d752d97d761a154989132841eabb1e12a46531f 192.168.1.253:7001@17001 master - 0 1639657537000 5 connected 12288-16383 20f69b6053f05aec6b3a4e006115b19752c41a78 192.168.1.251:7003@17003 slave 16cd75f2b35423220330eee59ec6958e0d802b8f 0 1639657537268 9 connected
现在我将刚才添加的两个7003节点删除
先删除slave节点
# redis-cli -c -h 192.168.1.251 -p 7001 -a 123456 --cluster del-node 192.168.1.251:7003 20f69b6053f05aec6b3a4e006115b19752c41a78 192.168.1.252:7003> CLUSTER NODES e8ac4af0dd93b558260f1068b960d10df639ff5b 192.168.1.252:7001@17001 master - 0 1639658067000 3 connected 6827-10922 cd785a8263f97b26e1437095726a514e7f69d616 192.168.1.251:7002@17002 slave 5d752d97d761a154989132841eabb1e12a46531f 0 1639658065000 5 connected 16cd75f2b35423220330eee59ec6958e0d802b8f 192.168.1.252:7003@17003 myself,master - 0 1639658064000 9 connected 0-1364 5461-6826 10923-12287 63821c34dc1da011cd018731688e85a508391bdc 192.168.1.252:7002@17002 slave e6db21fdc82d444e5958d446a66a9c76d0ea60cc 0 1639658066000 1 connected 2c763d241297ea8778f76d497632a9e8b7bf8e9b 192.168.1.253:7002@17002 slave e8ac4af0dd93b558260f1068b960d10df639ff5b 0 1639658062000 3 connected e6db21fdc82d444e5958d446a66a9c76d0ea60cc 192.168.1.251:7001@17001 master - 0 1639658066000 1 connected 1365-5460 5d752d97d761a154989132841eabb1e12a46531f 192.168.1.253:7001@17001 master - 0 1639658067827 5 connected 12288-16383
清空master节点中的hash槽
将hash槽分配给其他的master节点
redis-cli -c -h 192.168.1.251 -p 7001 -a 123456 --cluster reshard 192.168.1.252:7003 --cluster-from 16cd75f2b35423220330eee59ec6958e0d802b8f --cluster-to e8ac4af0dd93b558260f1068b960d10df639ff5b --cluster-slots 1024 --cluster-yes redis-cli -c -h 192.168.1.251 -p 7001 -a 123456 --cluster reshard 192.168.1.252:7003 --cluster-from 16cd75f2b35423220330eee59ec6958e0d802b8f --cluster-to e6db21fdc82d444e5958d446a66a9c76d0ea60cc --cluster-slots 1024 --cluster-yes redis-cli -c -h 192.168.1.251 -p 7001 -a 123456 --cluster reshard 192.168.1.252:7003 --cluster-from 16cd75f2b35423220330eee59ec6958e0d802b8f --cluster-to 5d752d97d761a154989132841eabb1e12a46531f
删除master节点
#redis-cli -c -h 192.168.1.251 -p 7001 -a 123456 --cluster del-node 192.168.1.252:7003 16cd75f2b35423220330eee59ec6958e0d802b8f 192.168.1.252:7001> CLUSTER NODES e6db21fdc82d444e5958d446a66a9c76d0ea60cc 192.168.1.251:7001@17001 master - 0 1639658525000 11 connected 1024-6143 63821c34dc1da011cd018731688e85a508391bdc 192.168.1.252:7002@17002 slave e6db21fdc82d444e5958d446a66a9c76d0ea60cc 0 1639658525345 11 connected 2c763d241297ea8778f76d497632a9e8b7bf8e9b 192.168.1.253:7002@17002 slave e8ac4af0dd93b558260f1068b960d10df639ff5b 0 1639658524344 10 connected 5d752d97d761a154989132841eabb1e12a46531f 192.168.1.253:7001@17001 master - 0 1639658526348 12 connected 6144-6826 10923-16383 e8ac4af0dd93b558260f1068b960d10df639ff5b 192.168.1.252:7001@17001 myself,master - 0 1639658525000 10 connected 0-1023 6827-10922 cd785a8263f97b26e1437095726a514e7f69d616 192.168.1.251:7002@17002 slave 5d752d97d761a154989132841eabb1e12a46531f 0 1639658525000 12 connected
节点已经删除,并切已经停止了