Redis Cli Cluster

redis-cli –cluster

Redis Cluster 在 5.0 之后取消了 ruby 脚本 redis-trib.rb 的支持,集合到了 redis-cli 里,直接使用 redis-cli--cluster 参数来取代

redis-cli –cluster help

$ redis-cli --cluster help

Cluster Manager Commands:
  create         host1:port1 ... hostN:portN          # 参与创建集群的所有节点
                 --cluster-replicas <arg>             # 从节点个数
                 
                 
  check          host:port                            # 检查集群,host:port 为任意集群节点
                 --cluster-search-multiple-owners     # 检查是否有槽同时被分配给了多个节点
  
  
  info           host:port                            # 查看集群信息,host:port 为任意集群节点
  
  
  fix            host:port                            # 修复集群,host:port 为任意集群节点
                 --cluster-search-multiple-owners     # 修复槽的重复分配问题
                 
                 
  reshard        host:port                            # Slot 迁移,host:port 为任意集群节点
                 --cluster-from <node-id>,<node-id>   # 需要从哪些源节点上迁移 slot
                                                      # 可从多个源节点完成迁移,以逗号隔开
                                                      # 还可以直接传递 --from all,这样源节点就是集群的所有节点
                                                      # 不传递该参数的话,则会在迁移过程中提示用户输入
                 --cluster-to <node-id>               # Slot 迁移的的目标节点,只能有一个
                 --cluster-slots <arg>                # 需要迁移的 Slot 数量
                 --cluster-yes                        # 迁移时的确认输入
                 --cluster-timeout <arg>              # 设置 migrate 命令的超时时间
                 --cluster-pipeline <arg>             # cluster getkeysinslot 命令一次取出的key数量,默认值为10
                 --cluster-replace                    # 是否直接 replace 到目标节点
                 
                 

 rebalance      host:port                               # 平衡集群节点 slot 数量,host:port 为任意集群节点
                 --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 host: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


创建集群 - 同时添加主从节点

# 创建 3 主 3从 的集群
$ redis-cli --cluster create \
	192.168.163.132:6379 192.168.163.132:6380 192.168.163.132:6381 \
	192.168.163.132:6382 192.168.163.132:6383 192.168.163.132:6384 \
	--cluster-replicas 1

集群扩容 - 添加主从节点

# 添加 1个 主节点
$ redis-cli --cluster add-node 10.10.17.203:6006 10.10.17.203:6000

# 查看节点信息
$ redis-cli --cluster check 10.10.17.203:6000
10.10.17.203:6006 (63d2b260...) -> 0 keys | 0 slots | 0 slaves.
10.10.17.203:6004 (b7af4517...) -> 2 keys | 5462 slots | 1 slaves.
10.10.17.203:6003 (ed4b1f51...) -> 4239 keys | 5461 slots | 1 slaves.
10.10.17.203:6005 (e33f7544...) -> 2 keys | 5461 slots | 1 slaves.
...
M: 63d2b26085cbe1dc0ff9591649e6141f71f97a51 10.10.17.203:6006
   slots: (0 slots) master
...


# 为某个主节点指定从节点
$ redis-cli --cluster add-node 10.10.17.203:6007 10.10.17.203:6000  \
		--cluster-slave \
		--cluster-master-id 63d2b26085cbe1dc0ff9591649e6141f71f97a51

# 查看状态(新的节点没有任何槽位)
$ redis-cli --cluster check 10.10.17.203:6000
...
S: 9af827b66529e2c69616e5b1b1857a63a3b13a33 10.10.17.203:6007
   slots: (0 slots) slave
   replicates 63d2b26085cbe1dc0ff9591649e6141f71f97a51
M: 63d2b26085cbe1dc0ff9591649e6141f71f97a51 10.10.17.203:6006
   slots: (0 slots) master
   1 additional replica(s)
...

# 重平衡,让新的(空的) master 节点参与
$ redis-cli --cluster rebalance 10.10.17.203:6000 --cluster-use-empty-masters
Moving 1366 slots from 10.10.17.203:6004 to 10.10.17.203:6006
##############...
Moving 1365 slots from 10.10.17.203:6005 to 10.10.17.203:6006
##############...
Moving 1365 slots from 10.10.17.203:6003 to 10.10.17.203:6006
##############...

# 查看重平衡后的集群状态
$ redis-cli --cluster check 10.10.17.203:6000
10.10.17.203:6003 (ed4b1f51...) -> 2874 keys | 4096 slots | 1 slaves.
10.10.17.203:6005 (e33f7544...) -> 2 keys | 4096 slots | 1 slaves.
10.10.17.203:6004 (b7af4517...) -> 2 keys | 4096 slots | 1 slaves.
10.10.17.203:6006 (63d2b260...) -> 1365 keys | 4096 slots | 1 slaves.
...

集群缩容 - 删除主从节点

#
# 先删除 6007 从节点(成功)
$ redis-cli --cluster del-node 10.10.17.203:6000 9af827b66529e2c69616e5b1b1857a63a3b13a33
#
# 再删除 6006 主节点(失败,因为接点有 Slot 持有,需要先 reshard 把节点迁走)
$ redis-cli --cluster del-node 10.10.17.203:6000 63d2b26085cbe1dc0ff9591649e6141f71f97a51
[ERR] Node 10.10.17.203:6006 is not empty! Reshard data away and try again
#
# 查看集群状态
$ redis-cli --cluster check 10.10.17.203:6000
...
M: 63d2b26085cbe1dc0ff9591649e6141f71f97a51 10.10.17.203:6006
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
M: b7af451787be60449df781670748e1414b3def2e 10.10.17.203:6004
   slots:[6827-10922] (4096 slots) master
M: ed4b1f514faffc6e30b51b72255e7dd5c781b5d0 10.10.17.203:6003
   slots:[1365-5460] (4096 slots) master
M: e33f7544f2ad4435446776eff4300250674f1baa 10.10.17.203:6005
   slots:[12288-16383] (4096 slots) master
#
# Slot 迁移,把 6006 的所有 Slot 迁到 6004
$ redis-cli --cluster reshard 10.10.17.203:6000 \
            --cluster-from 63d2b26085cbe1dc0ff9591649e6141f71f97a51 \
            --cluster-to b7af451787be60449df781670748e1414b3def2e \
            --cluster-slots 1000000
# 迁移过程是一个一个 Slot 迁移的
Moving slot 234 from 10.10.17.203:6006 to 10.10.17.203:6004: .
...

#
# 当节点为空后,再删除节点,可以删除成功
$ redis-cli --cluster del-node 10.10.17.203:6000 63d2b26085cbe1dc0ff9591649e6141f71f97a51
>>> Removing node 63d2b26085cbe1dc0ff9591649e6141f71f97a51 from cluster 10.10.17.203:6000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted no

# 重平衡 Slot 
$ redis-cli --cluster rebalance 10.10.17.203:6000

Read More