前言
之前我们搭建过redis-cluster高可用集群了,但是没有讨论集群的详细管理,本章我们主要对集群的缩容、扩容和数据迁移三个方面来讨论。 Redis Cluster 在5.0之后取消了ruby脚本 redis-trib.rb的支持(手动命令行添加集群的方式不变),集合到redis-cli里,避免了再安装ruby的相关环境。直接使用redis-clit的参数–cluster 来取代。如何使用redis-cl命令进行Cluster的创建和管理是我们必须掌握的,关于Cluster的相关说明可以查看官网或则Redis Cluster部署、管理和测试。
一、集群命令(redis-cli --cluster help)
redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 ... hostN:portN #创建集群
--cluster-replicas <arg> #从节点个数
check host:port #检查集群
--cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点
info host:port #查看集群状态
fix host:port #修复集群
--cluster-search-multiple-owners #修复槽的重复分配问题
reshard host:port #指定集群的任意一节点进行迁移slot,重新分slots
--cluster-from <arg> #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入
--cluster-to <arg> #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入
--cluster-slots <arg> #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。
--cluster-yes #指定迁移时的确认输入
--cluster-timeout <arg> #设置migrate命令的超时时间
--cluster-pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10
--cluster-replace #是否直接replace到目标节点
rebalance host:port #指定集群的任意一节点进行平衡集群节点slot数量
--cluster-weight <node1=w1...nodeN=wN> #指定集群节点的权重
--cluster-use-empty-masters #设置可以让没有分配slot的主节点参与,默认不允许
--cluster-timeout <arg> #设置migrate命令的超时时间
--cluster-simulate #模拟rebalance操作,不会真正执行迁移操作
--cluster-pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,默认值为10
--cluster-threshold <arg> #迁移的slot阈值超过threshold,执行rebalance操作
--cluster-replace #是否直接replace到目标节点
add-node new_host:new_port existing_host:existing_port #添加节点,把新节点加入到指定的集群,默认添加主节点
--cluster-slave #新节点作为从节点,默认随机一个主节点
--cluster-master-id <arg> #给新节点指定主节点
del-node host:port node_id #删除给定的一个节点,成功后关闭该节点服务
call host:port command arg arg .. arg #在集群的所有节点执行相关命令
set-timeout host:port milliseconds #设置cluster-node-timeout
import host:port #将外部redis数据导入集群
--cluster-from <arg> #将指定实例的数据导入到集群
--cluster-copy #migrate时指定copy
--cluster-replace #migrate时指定replace
help
二、管理实战
需要搭建一个redis集群来实战,如果对redis集群还不会搭建的参考《redis-cluster高可用集群实战(docker版本)》
1、 创建集群主节点
redis-cli -a 123456 --cluster create 192.168.252.128:7001 192.168.252.129:7001 192.168.252.130:7001
将(192.168.252.128:7001 192.168.252.129:7001 192.168.252.130:7001)构建一个简单的集群环境。
2、创建集群主从节点
redis-cli -a 123456 --cluster create 192.168.252.128:7001 192.168.252.128:7002 192.168.252.129:7001 192.168.252.129:7002 192.168.252.130:7001 192.168.252.130:7002 --cluster-replicas 1
-a 123456 登录密码为123456, --cluster-replicas 1 一个主节点一个从节点。该方式不能自定义主节点和从节点,都是由系统分配。 所以如果需要自定义的话,需要自己手动指定,先使用1或3创建好主节点后,再通过4来处理。
3、添加主节点
redis-cli -a 123456 --cluster add-node 192.168.252.128:7003 192.168.252.128:7001
严格按照 new_host:new_port existing_host:existing_port 格式,新增的节点必须在前面,后一个节点是集群里已存在的任何一个节点IP:PORT
4、添加从节点
redis-cli -a 123456 --cluster add-node 192.168.252.129:7003 192.168.252.128:7001 --cluster-slave --cluster-master-id 15e117b4869d1a185f0040d9dc49fb2a6654ee65
如果没有设置 --cluster-master-id ,将随机选一个master节点为主节点添加,新添加的节点必须为空,建议明确指定
5、删除节点
redis-cli -a 123456 --cluster del-node 192.168.252.129:7003 b324406764178a0479268a0f1381b580b22812e4
指定需要删除的节点的格式 host:port node_id。从节点直接删除对集群没有影响,但是直接删除主节点会影响整个集群(应为整个hash槽已经不完整,应该将数据和hash槽迁移到其他节点后再删除)
注意:当被删除掉的节点重新起来之后不能自动加入集群,但其和主的复制还是正常的,也可以通过该节点看到集群信息(通过其他正常节点已经看不到该被del-node节点的信息)。如果想要再次加入集群,则需要先在该节点执行cluster reset,再用add-node进行添加,进行增量同步复制。到此,目前整个集群的状态如下:
6、检查集群
redis-cli -a 123456 --cluster check 192.168.252.128:7001 --cluster-search-multiple-owners
任意连接一个集群节点,进行集群状态检查
7、集群信息查看
redis-cli -a 123456 --cluster info 192.168.252.128:7001
检查key、slots、从节点个数的分配情况
8、修复集群
redis-cli -a 123456 --cluster fix 192.168.252.128:7001 --cluster-search-multiple-owners
8、修复集群
redis-cli -a 123456 --cluster fix 192.168.252.128:7001 --cluster-search-multiple-owners
9、集群中执行相关命令
redis-cli -a 123456 --cluster call 192.168.252.128:7001 config set cluster-node-timeout 1000
可以用来在线修改配置文件等
10、在线迁移slot ,在线把集群的一些slot从集群原来slot节点迁移到新的节点,即可以完成集群的在线横向扩容和缩容。有2种方式进行迁移
(1) 一是根据提示来进行操作:
redis-cli -a cc --cluster reshard 192.168.252.128:7003
(2) 二是根据参数进行操作
redis-cli -a 123456 --cluster reshard 192.168.252.128:7001 --cluster-from 038040faf64af1297e3417b079bbf2091ce655ae --cluster-to 15e117b4869d1a185f0040d9dc49fb2a6654ee65 --cluster-slots 3000 --cluster-yes --cluster-timeout 5000 --cluster-pipeline 10 --cluster-replace
11、 平衡插槽(将16384个插槽平衡到所有master节点)
(1) 平衡集群中各个节点的slot数量
redis-cli -a 123456 --cluster rebalance 192.168.252.128:7003
(2) 根据集群中各个节点设置的权重等平衡slot数量
redis-cli -a 123456 --cluster rebalance --cluster-weight 15e117b4869d1a185f0040d9dc49fb2a6654ee65=3 589881971872fdde729eae3e43fec493b2f67925=2 038040faf64af1297e3417b079bbf2091ce655ae=1 c4c655cf497cdb913cffdbce65bf27ba434c9838=1 192.168.252.128:7003
12、外部数据导入集群
redis-cli --cluster import 192.168.252.131:6379 --cluster-from 192.168.252.128:7003 --cluster-replace
测试下来发现参数–cluster-replace没有用,如果集群中已经包含了某个key,在导入的时候会失败,不会覆盖,只有清空集群key才能导入, 并且发现如果集群设置了密码,也会导入失败,需要设置集群密码为空才能进行导入(call)。通过monitor(9021)的时候发现,在migrate的时候需要密码进行auth认证。
总结
实践出真知,自己动手吧!