一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
Redis Cluster集群管理
1. redis-trib.rb集群管理工具
在Redis4.x及之前版本,需要安装redis-trib模块管理集群,因为绝大部分集群功能需要依赖redis-trib模块实现。
1. 创建集群
若是Redis 5.x及以上版本,可采用redis-cli工具部署,因为Redis 5.x及以上版本彻底抛弃了ruby,将集群管理功能集成到了redis-cli工具中,
语法:redis-trib.rb create --replicas 1 redis_host1:redis_port1 redis_host2:redis_port2 redis_host3:redis_port3 ... redis_hostn:redis_portn
特别注意,–replicas选项值代表指定几个从库。
2. 查看集群信息
1. 通过redis-trib.rb检查集群配置
可以检查集群的配置是否正确,以及全部16384个槽是否已经全部指派给了主节点:
语法:redis-trib.rb check existing_host:existing_port
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口。
# 示例1:检查Redis节点192.168.111.111:2011所在集群的配置
# redis-trib.rb check 192.168.111.111:2011
Performing Cluster Check (using node 192.168.111.111:2011)
M: 7b5f21f124373b7d99edafaab01b90afdcfe8592 192.168.111.111:2011
slots:0-2730 (2731 slots) master
1 additional replica(s)
M: 81757eeb491059021c8e2468f361245764800c05 192.168.111.112:2011
slots:2731-5460 (2730 slots) master
1 additional replica(s)
M: 1e94fb4e201b9e7c4eccc207a6f8bae883d1dff1 192.168.111.111:2012
slots:8192-10922 (2731 slots) master
1 additional replica(s)
M: cf118efd950061ae013c52539f66f7ff1779100f 192.168.111.112:2012
slots:10923-13652 (2730 slots) master
1 additional replica(s)
S: b9de42bb24a48cc6a8b6fc72f2c38f43057bf459 192.168.111.113:2014
slots: (0 slots) slave
replicates cf118efd950061ae013c52539f66f7ff1779100f
S: 79187b202bdb436e26d5a7b16e1e91bff0584dc1 192.168.111.111:2014
slots: (0 slots) slave
replicates 8bcaa25b6d0c61fedf1b181971f5eb7f4da7380d
S: 12874ba078047ad747e6123f68c32ddd94c752bc 192.168.111.112:2013
slots: (0 slots) slave
replicates 7b5f21f124373b7d99edafaab01b90afdcfe8592
S: 722ee8a5d3508df3eb6afeff60550de9b5b524be 192.168.111.113:2013
slots: (0 slots) slave
replicates 81757eeb491059021c8e2468f361245764800c05
M: 8bcaa25b6d0c61fedf1b181971f5eb7f4da7380d 192.168.111.113:2011
slots:5461-8191 (2731 slots) master
1 additional replica(s)
S: 7a5c454dfecc3ed53c6bd8cc29a01c3114ee0067 192.168.111.111:2013
slots: (0 slots) slave
replicates 15595bdf3cccc20eb25faf7993608b20967a8673
S: 2c24ba35f85e185b98c66ead9f3ce1a444839fb8 192.168.111.112:2014
slots: (0 slots) slave
replicates 1e94fb4e201b9e7c4eccc207a6f8bae883d1dff1
M: 15595bdf3cccc20eb25faf7993608b20967a8673 192.168.111.113:2012
slots:13653-16383 (2731 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
Check for open slots...
Check slots coverage...
[OK] All 16384 slots covered.
注:如上提示均OK,则表示检查集群的配置正确,以及全部16384个槽已经全部指派给了主节点。
2. 通过redis-cli查看集群信息
# 示例1:查看Redis实例192.168.111.111:2011所在集群信息
# redis-cli -h 192.168.111.111 -p 2011 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:12
cluster_size:6
cluster_current_epoch:12
cluster_my_epoch:1
cluster_stats_messages_ping_sent:57
cluster_stats_messages_pong_sent:77
cluster_stats_messages_sent:134
cluster_stats_messages_ping_received:66
cluster_stats_messages_pong_received:57
cluster_stats_messages_meet_received:11
cluster_stats_messages_received:134
注:上面cluster_state指标为OK代表集群处于在线状态,cluster_slots_assigned指标为16384、cluster_slots_ok指标为16384、cluster_slots_pfail指标为0、cluster_slots_fail为0则代表16384个槽全部处于在线状态,没有下线的槽。如果当前redis发现有failed的slots,默认会把cluster_state从ok转为fail,写入命令会失败。
3. 查看节点信息
1. 通过redis-trib.rb检查集群节点
可以检查集群的配置是否正确,以及全部16384个槽是否已经全部指派给了主节点:
语法:redis-trib.rb check existing_host:existing_port
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口。
# 示例1:检查Redis节点192.168.111.111:2011所在集群的配置
# redis-trib.rb check 192.168.111.111:2011
Performing Cluster Check (using node 192.168.111.111:2011)
M: 7b5f21f124373b7d99edafaab01b90afdcfe8592 192.168.111.111:2011
slots:0-2730 (2731 slots) master
1 additional replica(s)
M: 81757eeb491059021c8e2468f361245764800c05 192.168.111.112:2011
slots:2731-5460 (2730 slots) master
1 additional replica(s)
M: 1e94fb4e201b9e7c4eccc207a6f8bae883d1dff1 192.168.111.111:2012
slots:8192-10922 (2731 slots) master
1 additional replica(s)
M: cf118efd950061ae013c52539f66f7ff1779100f 192.168.111.112:2012
slots:10923-13652 (2730 slots) master
1 additional replica(s)
S: b9de42bb24a48cc6a8b6fc72f2c38f43057bf459 192.168.111.113:2014
slots: (0 slots) slave
replicates cf118efd950061ae013c52539f66f7ff1779100f
S: 79187b202bdb436e26d5a7b16e1e91bff0584dc1 192.168.111.111:2014
slots: (0 slots) slave
replicates 8bcaa25b6d0c61fedf1b181971f5eb7f4da7380d
S: 12874ba078047ad747e6123f68c32ddd94c752bc 192.168.111.112:2013
slots: (0 slots) slave
replicates 7b5f21f124373b7d99edafaab01b90afdcfe8592
S: 722ee8a5d3508df3eb6afeff60550de9b5b524be 192.168.111.113:2013
slots: (0 slots) slave
replicates 81757eeb491059021c8e2468f361245764800c05
M: 8bcaa25b6d0c61fedf1b181971f5eb7f4da7380d 192.168.111.113:2011
slots:5461-8191 (2731 slots) master
1 additional replica(s)
S: 7a5c454dfecc3ed53c6bd8cc29a01c3114ee0067 192.168.111.111:2013
slots: (0 slots) slave
replicates 15595bdf3cccc20eb25faf7993608b20967a8673
S: 2c24ba35f85e185b98c66ead9f3ce1a444839fb8 192.168.111.112:2014
slots: (0 slots) slave
replicates 1e94fb4e201b9e7c4eccc207a6f8bae883d1dff1
M: 15595bdf3cccc20eb25faf7993608b20967a8673 192.168.111.113:2012
slots:13653-16383 (2731 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
Check for open slots...
Check slots coverage...
[OK] All 16384 slots covered.
注:如上提示均OK,则表示检查集群的配置正确,以及全部16384个槽已经全部指派给了主节点。
2. 通过redis-cli查看节点状态
# 示例1:查看Redis实例192.168.111.111:2011所在集群的各节点状态
# redis-cli -h 192.168.111.111 -p 2011 cluster nodes
81757eeb491059021c8e2468f361245764800c05 192.168.111.112:2011@12011 master - 0 1615276888103 5 connected 2731-5460
1e94fb4e201b9e7c4eccc207a6f8bae883d1dff1 192.168.111.111:2012@12012 master - 0 1615276889104 2 connected 8192-10922
cf118efd950061ae013c52539f66f7ff1779100f 192.168.111.112:2012@12012 master - 0 1615276889000 6 connected 10923-13652
b9de42bb24a48cc6a8b6fc72f2c38f43057bf459 192.168.111.113:2014@12014 slave cf118efd950061ae013c52539f66f7ff1779100f 0 1615276888000 12 connected
79187b202bdb436e26d5a7b16e1e91bff0584dc1 192.168.111.111:2014@12014 slave 8bcaa25b6d0c61fedf1b181971f5eb7f4da7380d 0 1615276890105 9 connected
7b5f21f124373b7d99edafaab01b90afdcfe8592 192.168.111.111:2011@12011 myself,master - 0 1615276887000 1 connected 0-2730
12874ba078047ad747e6123f68c32ddd94c752bc 192.168.111.112:2013@12013 slave 7b5f21f124373b7d99edafaab01b90afdcfe8592 0 1615276887101 7 connected
722ee8a5d3508df3eb6afeff60550de9b5b524be 192.168.111.113:2013@12013 slave 81757eeb491059021c8e2468f361245764800c05 0 1615276886000 11 connected
8bcaa25b6d0c61fedf1b181971f5eb7f4da7380d 192.168.111.113:2011@12011 master - 0 1615276885000 9 connected 5461-8191
7a5c454dfecc3ed53c6bd8cc29a01c3114ee0067 192.168.111.111:2013@12013 slave 15595bdf3cccc20eb25faf7993608b20967a8673 0 1615276889000 10 connected
2c24ba35f85e185b98c66ead9f3ce1a444839fb8 192.168.111.112:2014@12014 slave 1e94fb4e201b9e7c4eccc207a6f8bae883d1dff1 0 1615276888000 8 connected
15595bdf3cccc20eb25faf7993608b20967a8673 192.168.111.113:2012@12012 master - 0 1615276884000 10 connected 13653-16383
注:上面cluster_state指标为OK代表集群处于在线状态,cluster_slots_assigned指标为16384、cluster_slots_ok指标为16384、cluster_slots_pfail指标为0、cluster_slots_fail为0则代表16384个槽全部处于在线状态,没有下线的槽。如果当前redis发现有failed的slots,默认会把cluster_state从ok转为fail,写入命令会失败。
4. 添加节点
可以通过执行以下命令,将给定的节点添加至当前节点所在的集群中:
1. 添加从节点
语法:redis-trib add-node --slave --master-id master-node-id new_host:new_port existing_host:existing_port
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口,new_host:new_port为新添加节点的IP和端口信息,master-node-id用于设置从节点将要复制的主节点的运行ID。
若不指定“–master-id master-node-id”,此时会为从节点随机选择主节点。
2. 添加主节点
如果添加的是主节点,只需指定源节点和目标节点的地址即可:
语法:redis-trib.rb add-node new_host:new_port existing_host:existing_port
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口,new_host:new_port为新添加节点的IP和端口信息。
5. 删除节点
1. 删除从节点
当不再需要集群中的某个从节点时,可以通过执行以下命令将其移除:
语法:redis-trib.rb del-node existing_host:existing_port slave_node_id
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口,slave_node_id是被删除的从节点的运行ID。
2. 删除主节点
不同于删除从节点,删除主节点前需要将主节点上的所有槽迁移至其他节点上。
通过如下命令,将待删除主节点的槽全部分配到其他主节点:
redis-trib.rb reshard existing_host:existing_port
将待删除主节点上的槽全部移走之后,可以通过执行以下命令将其移除:
语法:redis-trib.rb del-node existing_host:existing_port master_node_id
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口,master_node_id是被删除的主节点的运行ID。
6. 为新主节点分配槽
可以将指定数量的槽从原节点迁移至目标节点,被迁移的槽将交由后者负责,并且槽中已有的数据也会陆续从原节点转移至目标节点。
语法:redis-trib.rb reshard existing_host:existing_port
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口。
可以手动指定为新主节点分配多少个槽,并且可以选择从所有的master节点重新分配或从指定的master节点提取指定数量的槽给新主节点。
7. 负载均衡以均匀各节点的槽数量
可通过重分片均匀分配槽,提供任一节点信息,作为集群入口:
语法:redis-trib.rb rebalance existing_host:existing_port --use-empty-masters
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口。
8. 故障转移(即主从切换)
1. 非强制故障转移
故障转移不需要redis-trib工具操作,因为故障转移是对其中一组主从命令进行操作。
连接从节点slave_host:slave_port执行以下命令,让它发起一次对自身主节点的故障转移操作:
语法:redis-cli -h slave_host -p slave_port -c cluster failover
因为接收到该命令的从节点会先将自身的数据库更新至与主节点完全一致,然后再执行后续的故障转移操作,所以这个过程不会丢失任何数据。
2. 强制故障转移
可以通过向从节点发送以下命令,让它发起一次对自身主节点的强制故障转移操作:
语法:redis-cli -h slave_host -p slave_port -c cluster failover [force|takeover]
需要注意的是,即使给定了FORCE选项,从节点对主节点的故障转移操作仍然要经过集群中大多数主节点的同意才能够真正执行。但如果给定了TAKEOVER选项,那么从节点将在不询问集群中其他节点意见的情况下,直接对主节点实施故障转移。
2. redis-cli集群管理工具
Redis 5.0彻底抛弃了ruby,将集群管理功能全部集成到完全用C写的redis-cli中。
1. 创建集群
cluster选项的create子命令允许用户根据已有的节点创建出一个集群。用户只需要在命令中依次给出各个节点的IP地址和端口号,命令就会将它们聚合到同一个集群中,并根据节点的数量将槽平均地指派给它们负责:
语法:redis-cli --cluster create <ip1>:<port1> ... <ipN>:<portN>
create命令首先会检查给定的所有节点,然后根据节点的数量以及我们指定的从节点数量划归出一个集群配置并将其打印出来。
2. 查看集群信息
语法:redis-cli --cluster info existing_host:existing_port
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口。
返回结果包含主节点的地址以及运行ID、它们存储的键数量以及负责的槽数量、以及它们拥有的从节点数量,并且返回集群包含的数据库键数量以及主节点数量,以及每个槽平均存储的键数量。
3. 检查集群
可以检查集群的配置是否正确,以及全部16384个槽是否已经全部指派给了主节点。
语法:redis-cli --cluster check existing_host:existing_port
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口。
4. 添加节点
1. 添加主节点
将给定的新节点添加到已有的集群当中,只需要依次给定新节点的地址以及集群中某个节点的地址即可,在默认情况下,添加的新节点将作为主节点存在。
语法:redis-cli --cluster add-node new_host:new_port existing_host:existing_port
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口。
2. 添加从节点
语法:redis-cli --cluster add-node --cluster-slave
--cluster-master-id master-node-id new_host:new_port existing_host:existing_port
existing_host:existing_port可以为Redis Cluster集群中任意一个节点的地址,作为访问集群的入口,new_host:new_port为新添加节点的IP和端口信息,master-node-id用于设置从节点将要复制的主节点的运行ID。