redis-cluster集群安装

Redis-cluster集群

概念

Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。

redis-cluster集群安装

结构特点

  1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
  2. 节点的fail是通过集群中超过半数的节点检测失效时才生效。
  3. 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
  4. redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。
  5. Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。

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。

怎样判定节点不可用

  1. 如果集群任意master挂掉,且当前master没有slave(副本).集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态。
  2. 如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态,当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。

总结

简单的理解一下,redis-cluster集群是将主从模式和Sentinel模式的整合实现。

集群搭建

环境准备

主机ip 端口
192.168.1.251 7001,7002
192.168.1.252 7001,7002
192.168.1.253 7001,7002

安装redis

从官网下载redis的tar包,并解压安装

# 解压
tar -zxvf redis-5.0.14.tar.gz
# 进入文件夹
cd redis-5.0.14
# 编译
make
# 安装
make install

测试启动

redis-server redis.conf

redis-cluster集群安装

修改配置文件

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

启动成功后结果如下:

redis-cluster集群安装

从上可知:

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

重新分配hash槽

# 重新分配
# 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]# 

模拟master节点挂掉

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

节点已经删除,并切已经停止了

上一篇:C++的顺序容器比较


下一篇:【网站汇总】论文相关