前言

在redis源码编译的时候,在src目录下会有一个redis-trib.rb的脚本,这个脚本是ruby写的,用于管理redis cluster。

打开网易新闻 查看精彩图片

安装系统依赖包

yum -y install epel-release

yum -y install ruby rubygem-redis

redis-trib.rb

/opt/redis/bin/redis-trib.rb

查看一下帮助

Usage: redis-trib <command> <options> <arguments ...>

create host1:port1 ... hostN:portN

--replicas <arg>

check host:port

info host:port

fix host:port

--timeout <arg>

reshard host:port

--from <arg>

--to <arg>

--slots <arg>

--yes

--timeout <arg>

--pipeline <arg>

rebalance host:port

--weight <arg>

--auto-weights

--use-empty-masters

--timeout <arg>

--simulate

--pipeline <arg>

--threshold <arg>

add-node new_host:new_port existing_host:existing_port

--slave

--master-id <arg>

del-node host:port node_id

set-timeout host:port milliseconds

call host:port command arg arg .. arg

import host:port

--from <arg>

--copy

--replace

help (show this help)

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

从上面可以知道redis-trib.rb具有以下功能:

create:创建集群 --replicas可以指定从节点个数

check:检查集群

info:查看集群信息

fix:修复集群

reshard:在线迁移slot

rebalance:平衡集群节点slot数量

add-node:将新节点加入集群

del-node:从集群中删除节点

set-timeout:设置集群节点间心跳连接的超时时间

call:在集群全部节点上执行命令

import:将外部redis数据导入集群

常用例子

1、create创建集群:create命令可选replicas参数,replicas表示需要有几个slave。

/opt/redis/bin/redis-trib.rb create --replicas 1 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 127.0.0.1:8006

2、info查看集群:info命令用来查看集群的信息。info命令也是先执行load_cluster_info_from_node获取完整的集群信息。

/opt/redis/bin/redis-trib.rb info 127.0.0.1:8001

3、check检查集群:检查集群状态的命令,没有其他参数,只需要选择一个集群中的一个节点即可。

/opt/redis/bin/redis-trib.rb check 127.0.0.1:8001

4、fix修复集群:fix命令的流程跟check的流程很像,显示加载集群信息,然后在check_cluster方法内传入fix为

true的变量,会在集群检查出现异常的时候执行修复流程。目前fix命令能修复两种异常,一种是集群有处于迁移中的slot的节点,一种是slot未完全分配的异常。

/opt/redis/bin/redis-trib.rb fix 127.0.0.1:8001

5、reshard在线迁移slot:reshard命令可以在线把集群的一些slot从集群原来slot负责节点迁移到新的节点,利用reshard可以完成集群的在线横向扩容和缩容。

/opt/redis/bin/redis-trib.rb reshard 127.0.0.1:8001

(然后根据提示操作就可以了,也可以根据参数直接设置完成)

6、rebalance平衡集群节点slot数量:rebalance命令可以根据用户传入的参数平衡集群节点的slot数量,rebalance功能非常强大,可以传入的参数很多。

host:port:这个是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口。

--weight :节点的权重,格式为node_id=weight,如果需要为多个节点分配权重的话,需要添加多个–weight 参数,即--weight a44dd3ede3f=5 --weight 8e60b3a1=5,node_id可为节点名称的前缀,只要保证前缀位数能唯一区分该节点即可。没有传递–weight的节点的权重默认为1。

--auto-weights:这个参数在rebalance流程中并未用到。

--threshold :只有节点需要迁移的slot阈值超过threshold,才会执行rebalance操作。具体计算方法可以参考下面的rebalance命令流程的第四步。

--use-empty-masters:rebalance是否考虑没有节点的master,默认没有分配slot节点的master是不参与rebalance的,设置--use-empty-masters可以让没有分配slot的节点参与rebalance。

--timeout :设置migrate命令的超时时间。

--simulate:设置该参数,可以模拟rebalance操作,提示用户会迁移哪些slots,而不会真正执行迁移操作。

--pipeline :与reshar的pipeline参数一样,定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10。

/opt/redis/bin/redis-trib.rb rebalance --threshold 1 127.0.0.1:8001

7、add-node将新节点加入集群:add-node命令可以将新节点加入集群,节点可以为master,也可以为某个master节点的slave。

--slave:设置该参数,则新节点以slave的角色加入集群

--master-id:这个参数需要设置了–slave才能生效,–master-id用来指定新节点的master节点。如果不设置该参数,则会随机为节点选择master节点。

/opt/redis/bin/redis-trib.rb add-node --slave --master-id b12f7ab5c229fdf817aa7b5a4c534463ce223c62 127.0.0.1:8007

8、del-node从集群中删除节点:del-node可以把某个节点从集群中删除。del-node只能删除没有分配slot的节点。

/opt/redis/bin/redis-trib.rb del-node 127.0.0.1:8001 7ec63a08d2355448d16a84b502974832c52359e1

9、set-timeout设置集群节点间心跳连接的超时时间:set-timeout用来设置集群节点间心跳连接的超时时间,单位是毫秒,不得小于100毫秒,因为100毫秒对于心跳时间来说太短了。

/opt/redis/bin/redis-trib.rb set-timeout 127.0.0.1:8001 30000

10、call在集群全部节点上执行命令:call命令可以用来在集群的全部节点执行相同的命令。call命令也是需要通过集群的一个节点地址,连上整个集群,然后在集群的每个节点执行该命令。

/opt/redis/bin/redis-trib.rb call 127.0.0.1:8001 get key

11、import将外部redis数据导入集群:import命令可以把外部的redis节点数据导入集群。

总结

redis cluster集群有了这个脚本就轻松多了,不需要通过redis-cli一个个操作。