一、简介
事先说明一下,本篇文章不涉及对redis-trib.rb源代码的分析,只是从使用的角度来阐述一下,对第一次使用的人来说很重要。redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。这个文件可以在src这个目录下使用,也可以像redis-cli等命令一样,可以拷贝到单独目录,方便使用。redis-trib.rb是redis作者用ruby写成的,为了看懂redis-trib.rb的源码,我还要花一些时间来学学ruby。ruby这门语言我是在老赵的教程里面最早听说的,认为这个语言和我关系不大,当初也就没有在意,自然也就没学了。现在看来不行了,所以我就特意花了一个月的时间学习了一下ruby这门语言,同时也被ruby语言的简洁、明了所吸引。阅读本文需要对redis集群功能有一定的了解。关于redis集群功能的介绍,可以参考本人的另两篇文章,第一篇是《》,第二篇是《》。二、Redis-trib.rb详细介绍 Redis-Trib.rb这个脚本文件的功能很强大,使用起来也很方便,我们就由浅入深来探讨这个脚本文件的使用吧。我们先来看看他的帮助信息吧,这个最简单,学习一门新技术的时候,也应该先看看帮助的东西。1、#ruby redis-trib.rb help (Redis-Trib.rb的帮助信息)
2 3 [root@linux redis]# ruby redis-trib.rb help 4 Usage: redis-trib5 6 create host1:port1 ... hostN:portN 7 --replicas 8 check host:port 9 info host:port10 fix host:port11 --timeout 12 reshard host:port13 --from 14 --to 15 --slots 16 --yes17 --timeout 18 --pipeline 19 rebalance host:port20 --weight 21 --auto-weights22 --use-empty-masters23 --timeout 24 --simulate25 --pipeline 26 --threshold 27 add-node new_host:new_port existing_host:existing_port28 --slave29 --master-id 30 del-node host:port node_id31 set-timeout host:port milliseconds32 call host:port command arg arg .. arg33 import host:port34 --from 35 --copy36 --replace37 help (show this help)38 39 For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
[root@linux redis]# ruby redis-trib.rb create 192.168.127.129:7000 192.168.127.129:7001 192.168.127.129:7002 >>> Creating cluster >>> Performing hash slots allocation on 3 nodes... Using 3 masters: 192.168.127.129:7000 192.168.127.129:7001 192.168.127.129:7002 M: 454e7e2ca5e70103ae19926e139dc212ad084637 192.168.127.129:7000 slots:0-5460 (5461 slots) master M: d16665971f9a1f5715fd7365314436c99ba6e7ef 192.168.127.129:7001 slots:5461-10922 (5462 slots) master M: 7e41f26c96c796c6ad546df836b93d2aadf9e13c 192.168.127.129:7002 slots:10923-16383 (5461 slots) master Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join. >>> Performing Cluster Check (using node 192.168.127.129:7000) M: 454e7e2ca5e70103ae19926e139dc212ad084637 192.168.127.129:7000 slots:0-5460 (5461 slots) master 0 additional replica(s) M: d16665971f9a1f5715fd7365314436c99ba6e7ef 192.168.127.129:7001 slots:5461-10922 (5462 slots) master 0 additional replica(s) M: 7e41f26c96c796c6ad546df836b93d2aadf9e13c 192.168.127.129:7002 slots:10923-16383 (5461 slots) master 0 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
[root@linux redis]# ruby redis-trib.rb check 192.168.127.130:7000 >>> Performing Cluster Check (using node 192.168.127.130:7000) M: a44081c39e7978c731a5c64476f4dc64e8d10c20 192.168.127.130:7000 slots:66-5460 (5395 slots) master 1 additional replica(s) S: be14cfa7cc064e75977ec8517c1eccf96e92aebf 192.168.127.130:7005 slots: (0 slots) slave replicates 3b025b3ecfa65f462de639c7a412be443cf1dd1c M: bafe517c084aadaacb0b0249dac1e706f24bc21f 192.168.127.130:7001 slots:5528-10922 (5395 slots) master 1 additional replica(s) S: b04d39427329b256fcb9b851e02d4b814314b280 192.168.127.130:7004 slots: (0 slots) slave replicates bafe517c084aadaacb0b0249dac1e706f24bc21f M: 3b025b3ecfa65f462de639c7a412be443cf1dd1c 192.168.127.130:7002 slots:0-65,5461-5527,10923-16383 (5594 slots) master 1 additional replica(s) S: b96aac031170a2aa42c619fbc08450bb51af372c 192.168.127.130:7003 slots: (0 slots) slave replicates a44081c39e7978c731a5c64476f4dc64e8d10c20 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
[root@linux redis]# ruby redis-trib.rb info 192.168.127.130:7000 192.168.127.130:7000 (a44081c3...) -> 3 keys | 5395 slots | 1 slaves. 192.168.127.130:7001 (bafe517c...) -> 1 keys | 5395 slots | 1 slaves. 192.168.127.130:7002 (3b025b3e...) -> 1 keys | 5594 slots | 1 slaves. [OK] 5 keys in 3 masters. 0.00 keys per slot on average.
[root@linux redis]# ruby redis-trib.rb fix 192.168.127.130:7002 >>> Performing Cluster Check (using node 192.168.127.130:7002) M: 3b025b3ecfa65f462de639c7a412be443cf1dd1c 192.168.127.130:7002 slots:0-65,5461-5527,10923-16383 (5594 slots) master 1 additional replica(s) M: bafe517c084aadaacb0b0249dac1e706f24bc21f 192.168.127.130:7001 slots:5528-10922 (5395 slots) master 1 additional replica(s) S: b96aac031170a2aa42c619fbc08450bb51af372c 192.168.127.130:7003 slots: (0 slots) slave replicates a44081c39e7978c731a5c64476f4dc64e8d10c20 S: b04d39427329b256fcb9b851e02d4b814314b280 192.168.127.130:7004 slots: (0 slots) slave replicates bafe517c084aadaacb0b0249dac1e706f24bc21f M: a44081c39e7978c731a5c64476f4dc64e8d10c20 192.168.127.130:7000 slots:66-5460 (5395 slots) master 1 additional replica(s) S: be14cfa7cc064e75977ec8517c1eccf96e92aebf 192.168.127.130:7005 slots: (0 slots) slave replicates 3b025b3ecfa65f462de639c7a412be443cf1dd1c [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. [root@linux redis]# ruby redis-trib.rb fix 192.168.127.130:7005 >>> Performing Cluster Check (using node 192.168.127.130:7005) S: be14cfa7cc064e75977ec8517c1eccf96e92aebf 192.168.127.130:7005 slots: (0 slots) slave replicates 3b025b3ecfa65f462de639c7a412be443cf1dd1c S: b96aac031170a2aa42c619fbc08450bb51af372c 192.168.127.130:7003 slots: (0 slots) slave replicates a44081c39e7978c731a5c64476f4dc64e8d10c20 M: 3b025b3ecfa65f462de639c7a412be443cf1dd1c 192.168.127.130:7002 slots:0-65,5461-5527,10923-16383 (5594 slots) master 1 additional replica(s) M: a44081c39e7978c731a5c64476f4dc64e8d10c20 192.168.127.130:7000 slots:66-5460 (5395 slots) master 1 additional replica(s) S: b04d39427329b256fcb9b851e02d4b814314b280 192.168.127.130:7004 slots: (0 slots) slave replicates bafe517c084aadaacb0b0249dac1e706f24bc21f M: bafe517c084aadaacb0b0249dac1e706f24bc21f 192.168.127.130:7001 slots:5528-10922 (5395 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.
执行代码实例:
[root@linux redis]# ruby redis-trib.rb reshard --from all --to 34aff9de9f005b23dc1ae090d1791edb6277b255 --slots 200 --yes 192.168.127.129:7000 >>> Performing Cluster Check (using node 192.168.127.129:7000) M: 454e7e2ca5e70103ae19926e139dc212ad084637 192.168.127.129:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 30a872bdf2ec16fabbd8fcb7e08514dffec09364 192.168.127.129:7005 slots: (0 slots) slave replicates 7e41f26c96c796c6ad546df836b93d2aadf9e13c M: 7e41f26c96c796c6ad546df836b93d2aadf9e13c 192.168.127.129:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 69ada8a4fe3784597480bd8bddbeb57ab08a8f34 192.168.127.129:7004 slots: (0 slots) slave replicates d16665971f9a1f5715fd7365314436c99ba6e7ef M: d16665971f9a1f5715fd7365314436c99ba6e7ef 192.168.127.129:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: 34aff9de9f005b23dc1ae090d1791edb6277b255 192.168.127.129:7006 slots: (0 slots) master 0 additional replica(s) S: ee0e0688c0258c34f9673a44e5bc97374abaeb5d 192.168.127.129:7003 slots: (0 slots) slave replicates 454e7e2ca5e70103ae19926e139dc212ad084637 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. Ready to move 200 slots. Source nodes: M: 454e7e2ca5e70103ae19926e139dc212ad084637 192.168.127.129:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) M: 7e41f26c96c796c6ad546df836b93d2aadf9e13c 192.168.127.129:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: d16665971f9a1f5715fd7365314436c99ba6e7ef 192.168.127.129:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) Destination node: M: 34aff9de9f005b23dc1ae090d1791edb6277b255 192.168.127.129:7006 slots: (0 slots) master 0 additional replica(s) Resharding plan: Moving slot 5461 from d16665971f9a1f5715fd7365314436c99ba6e7ef Moving slot 5462 from d16665971f9a1f5715fd7365314436c99ba6e7ef Moving slot 5463 from d16665971f9a1f5715fd7365314436c99ba6e7ef Moving slot 5464 from d16665971f9a1f5715fd7365314436c99ba6e7ef Moving slot 5465 from d16665971f9a1f5715fd7365314436c99ba6e7ef //省略。。。。 Moving slot 10943 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10977 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10978 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10979 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10980 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10981 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10982 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10983 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10984 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10985 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10986 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10987 from 192.168.127.129:7002 to 192.168.127.129:7006: Moving slot 10988 from 192.168.127.129:7002 to 192.168.127.129:7006:
迁移的流程如下: 1、通过load_cluster_info_from_node方法装载集群信息。 2、执行check_cluster方法检查集群是否健康。只有健康的集群才能进行迁移。 3、获取需要迁移的slot数量,用户没传递--slots参数,则提示用户手动输入。 4、获取迁移的目的节点,用户没传递--to参数,则提示用户手动输入。此处会检查目的节点必须为master节点。 5、获取迁移的源节点,用户没传递--from参数,则提示用户手动输入。此处会检查源节点必须为master节点。--from all的话,源节点就是除了目的节点外的全部master节点。这里为了保证集群slot分配的平均,建议传递--from all。 6、执行compute_reshard_table方法,计算需要迁移的slot数量如何分配到源节点列表,采用的算法是按照节点负责slot数量由多到少排序,计算每个节点需要迁移的slot的方法为:迁移slot数量 * (该源节点负责的slot数量 / 源节点列表负责的slot总数)。这样算出的数量可能不为整数,这里代码用了下面的方式处理: n = (numslots/source_tot_slots*s.slots.length) if i == 0 n = n.ceil else n = n.floor 这样的处理方式会带来最终分配的slot与请求迁移的slot数量不一致,这个BUG已经在github上提给作者, https://github.com/antirez/redis/issues/2990。 7、打印出reshard计划,如果用户没传--yes,就提示用户确认计划。 8、根据reshard计划,一个个slot的迁移到新节点上,迁移使用move_slot方法,该方法被很多命令使用,具体可以参见下面的迁移流程。move_slot方法传递dots为true和pipeline数量。 9、至此,就完成了全部的迁移任务。 move_slot方法可以在线将一个slot的全部数据从源节点迁移到目的节点,fix、reshard、rebalance都需要调用该方法迁移slot。 move_slot接受下面几个参数, 1、pipeline:设置一次从slot上获取多少个key。 2、quiet:迁移会打印相关信息,设置quiet参数,可以不用打印这些信息。 3、cold:设置cold,会忽略执行importing和migrating。 4、dots:设置dots,则会在迁移过程打印迁移key数量的进度。 5、update:设置update,则会更新内存信息,方便以后的操作。 move_slot流程如下: 1、如果没有设置cold,则对源节点执行cluster importing命令,对目的节点执行migrating命令。fix的时候有可能importing和migrating已经执行过来,所以此种场景会设置cold。 2、通过cluster getkeysinslot命令,一次性获取远节点迁移slot的pipeline个key的数量. 3、对这些key执行migrate命令,将数据从源节点迁移到目的节点。 4、如果migrate出现异常,在fix模式下,BUSYKEY的异常,会使用migrate的replace模式再执行一次,BUSYKEY表示目的节点已经有该key了,replace模式可以强制替换目的节点的key。不是fix模式就直接返回错误了。 5、循环执行cluster getkeysinslot命令,直到返回的key数量为0,就退出循环。 6、如果没有设置cold,对每个节点执行cluster setslot命令,把slot赋给目的节点。 7、如果设置update,则修改源节点和目的节点的slot信息。 8、至此完成了迁移slot的流程。 7、Rebalance平衡集群节点slot数量 命令格式:ruby redis-trib.rb rebalance --weight <arg> host:port【此地址可以是集群中任何一个节点的地址,相当于获取集群信息的入口】 --auto-weights --threshold <arg> --use-empty-masters --timeout <arg> --simulate --pipeline <arg> rebalance命令可以根据用户传入的参数平衡集群节点的slot数量,rebalance功能非常强大,可以传入的参数很多。
以下是rebalance的参数列表和命令示例。
# ruby redis-trib.rb rebalance --threshold 1 --weight b31e3a2e=5 --weight 60b8e3a1=5 --use-empty-masters --simulate 10.180.157.199:6379 下面也先一一解释下每个参数的用法: host:port:这个是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口。 --weight <arg>:节点的权重,格式为node_id=weight,如果需要为多个节点分配权重的话,需要添加多个--weight <arg>参数,即--weight b31e3a2e=5 --weight 60b8e3a1=5,node_id可为节点名称的前缀,只要保证前缀位数能唯一区分该节点即可。没有传递 –weight的节点的权重默认为1。 --auto-weights:这个参数在rebalance流程中并未用到。 --threshold <arg>:只有节点需要迁移的slot阈值超过threshold,才会执行rebalance操作。具体计算方法可以参考下面的rebalance命令流程的第四步。 --use-empty-masters:rebalance是否考虑没有节点的master,默认没有分配slot节点的master是不参与rebalance的,设置--use-empty-masters可以让没有分配slot的节点参与rebalance。 --timeout <arg>:设置migrate命令的超时时间。 --simulate:设置该参数,可以模拟rebalance操作,提示用户会迁移哪些slots,而不会真正执行迁移操作。 --pipeline <arg>:与reshar的pipeline参数一样,定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10。 rebalance命令流程如下: 1、load_cluster_info_from_node方法先加载集群信息。 2、计算每个master的权重,根据参数--weight <arg>,为每个设置的节点分配权重,没有设置的节点,则权重默认为1。 3、根据每个master的权重,以及总的权重,计算自己期望被分配多少个slot。计算的方式为:总slot数量 * (自己的权重 / 总权重)。 4、计算每个master期望分配的slot是否超过设置的阈值,即--threshold <arg>设置的阈值或者默认的阈值。计算的方式为:先计算期望移动节点的阈值,算法为:(100-(100.0*expected/n.slots.length)).abs,如果计算出的阈值没有超出设置阈值,则不需要为该节点移动slot。只要有一个master的移动节点超过阈值,就会触发rebalance操作。 5、如果触发了rebalance操作。那么就开始执行rebalance操作,先将每个节点当前分配的slots数量减去期望分配的slot数量获得balance值。将每个节点的balance从小到大进行排序获得sn数组。 6、用dst_idx和src_idx游标分别从sn数组的头部和尾部开始遍历。目的是为了把尾部节点的slot分配给头部节点。 sn数组保存的balance列表排序后,负数在前面,正数在后面。负数表示需要有slot迁入,所以使用dst_idx游标,正数表示需要有slot迁出,所以使用src_idx游标。理论上sn数组各节点的balance值加起来应该为0,不过由于在计算期望分配的slot的时候只是使用直接取整的方式,所以可能出现balance值之和不为0的情况,balance值之和不为0即为节点不平衡的slot数量,由于slot总数有16384个,不平衡数量相对于总数,基数很小,所以对rebalance流程影响不大。 7、获取sn[dst_idx]和sn[src_idx]的balance值较小的那个值,该值即为需要从sn[src_idx]节点迁移到sn[dst_idx]节点的slot数量。 8、接着通过compute_reshard_table方法计算源节点的slot如何分配到源节点列表。这个方法在reshard流程中也有调用,具体步骤可以参考reshard流程的第六步。 9、如果是simulate模式,则只是打印出迁移列表。 10、如果没有设置simulate,则执行move_slot操作,迁移slot,传入的参数为:quiet=>true,:dots=>false,:update=>true。 11、迁移完成后更新sn[dst_idx]和sn[src_idx]的balance值。如果balance值为0后,游标向前进1。 12、直到dst_idx到达src_idx游标,完成整个rebalance操作。 8、add-node将新节点加入集群 命令格式:ruby redis-trib.rb add-node --slave new_host:new_port existing_host:existing_port【此地址可以是集群中任何一个节点的地址,相当于获取集群信息的入口】 --master-id <arg> add-node命令可以将新节点加入集群,节点可以为master,也可以为某个master节点的slave。 add-node有两个可选参数: --slave:设置该参数,则新节点以slave的角色加入集群 --master-id:这个参数需要设置了--slave才能生效,--master-id用来指定新节点的master节点。如果不设置该参数,则会随机为节点选择master节点。这两个参数(--slave,--master-id)并没有先后顺序,但是这两个参数必须在 add-node 之后,new_host:new_port existing_host:existing_port参数之前。
可以看下add-node命令的执行示例(我们将192.168.127.129:7003作为192.168.127.129:7000的从节点增加进集群):[root@linux redis]# ruby redis-trib.rb add-node --slave --master-id 454e7e2ca5e70103ae19926e139dc212ad084637 192.168.127.129:7003 192.168.127.129:7000 >>> Adding node 192.168.127.129:7003 to cluster 192.168.127.129:7000 >>> Performing Cluster Check (using node 192.168.127.129:7000) M: 454e7e2ca5e70103ae19926e139dc212ad084637 192.168.127.129:7000 slots:0-5460 (5461 slots) master 0 additional replica(s) M: d16665971f9a1f5715fd7365314436c99ba6e7ef 192.168.127.129:7001 slots:5461-10922 (5462 slots) master 0 additional replica(s) M: 7e41f26c96c796c6ad546df836b93d2aadf9e13c 192.168.127.129:7002 slots:10923-16383 (5461 slots) master 0 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 192.168.127.129:7003 to make it join the cluster. Waiting for the cluster to join. >>> Configure node as replica of 192.168.127.129:7000. [OK] New node added correctly.
可以看下add-node命令的执行示例(我们将192.168.127.129:7004作为192.168.127.129:7001的从节点增加进集群):
[root@linux redis]# ruby redis-trib.rb add-node --slave --master-id d16665971f9a1f5715fd7365314436c99ba6e7ef 192.168.127.129:7004 192.168.127.129:7001 >>> Adding node 192.168.127.129:7004 to cluster 192.168.127.129:7001 >>> Performing Cluster Check (using node 192.168.127.129:7001) M: d16665971f9a1f5715fd7365314436c99ba6e7ef 192.168.127.129:7001 slots:5461-10922 (5462 slots) master 0 additional replica(s) S: ee0e0688c0258c34f9673a44e5bc97374abaeb5d 192.168.127.129:7003 slots: (0 slots) slave replicates 454e7e2ca5e70103ae19926e139dc212ad084637 M: 454e7e2ca5e70103ae19926e139dc212ad084637 192.168.127.129:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) M: 7e41f26c96c796c6ad546df836b93d2aadf9e13c 192.168.127.129:7002 slots:10923-16383 (5461 slots) master 0 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 192.168.127.129:7004 to make it join the cluster. Waiting for the cluster to join. >>> Configure node as replica of 192.168.127.129:7001. [OK] New node added correctly. [root@linux redis]#
可以看下add-node命令的执行示例(我们将192.168.127.129:7005作为192.168.127.129:7000的从节点增加进集群,此时7000已有从节点,但是7005并没有作为7000的从节点,而是作为7002的从节点,因为当时7002没从节点):
[root@linux redis]# ruby redis-trib.rb add-node --master-id 454e7e2ca5e70103ae19926e139dc212ad084637 --slave 192.168.127.129:7005 192.168.127.129:7000 >>> Adding node 192.168.127.129:7005 to cluster 192.168.127.129:7000 >>> Performing Cluster Check (using node 192.168.127.129:7000) M: 454e7e2ca5e70103ae19926e139dc212ad084637 192.168.127.129:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) M: 7e41f26c96c796c6ad546df836b93d2aadf9e13c 192.168.127.129:7002 slots:10923-16383 (5461 slots) master 0 additional replica(s) S: 69ada8a4fe3784597480bd8bddbeb57ab08a8f34 192.168.127.129:7004 slots: (0 slots) slave replicates d16665971f9a1f5715fd7365314436c99ba6e7ef M: d16665971f9a1f5715fd7365314436c99ba6e7ef 192.168.127.129:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: ee0e0688c0258c34f9673a44e5bc97374abaeb5d 192.168.127.129:7003 slots: (0 slots) slave replicates 454e7e2ca5e70103ae19926e139dc212ad084637 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 192.168.127.129:7005 to make it join the cluster. Waiting for the cluster to join. >>> Configure node as replica of 192.168.127.129:7000. [OK] New node added correctly.
[root@linux redis]# ruby redis-trib.rb del-node 192.168.127.129:7006 34aff9de9f005b23dc1ae090d1791edb6277b255 >>> Removing node 34aff9de9f005b23dc1ae090d1791edb6277b255 from cluster 192.168.127.129:7006 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.
[root@linux redis]# ruby redis-trib.rb set-timeout 192.168.127.130:7000 15000 >>> Reconfiguring node timeout in every cluster node... *** New timeout set for 192.168.127.130:7000 *** New timeout set for 192.168.127.130:7002 *** New timeout set for 192.168.127.130:7003 *** New timeout set for 192.168.127.130:7005 *** New timeout set for 192.168.127.130:7004 *** New timeout set for 192.168.127.130:7001 >>> New node timeout set. 6 OK, 0 ERR.
[root@linux redis]# ruby redis-trib.rb call 192.168.127.130:7000 get key >>> Calling GET key 192.168.127.130:7000: MOVED 12539 192.168.127.130:7002 192.168.127.130:7002: 192.168.127.130:7003: MOVED 12539 192.168.127.130:7002 192.168.127.130:7005: MOVED 12539 192.168.127.130:7002 192.168.127.130:7004: MOVED 12539 192.168.127.130:7002 192.168.127.130:7001: MOVED 12539 192.168.127.130:7002
[root@linux redis]# ruby redis-trib.rb import --from 192.168.127.130:7006 192.168.127.129:7000
上面的命令是把 192.168.127.130:7006(redis 4.8)上的数据导入到 192.168.127.129:7000 这个节点所在的集群
import命令可以把外部的redis节点数据导入集群。导入的流程如下: 1、通过load_cluster_info_from_node方法转载集群信息,check_cluster方法检查集群是否健康。 2、连接外部redis节点,如果外部节点开启了cluster_enabled,则提示错误。 3、通过scan命令遍历外部节点,一次获取1000条数据。 4、遍历这些key,计算出key对应的slot。 5、执行migrate命令,源节点是外部节点,目的节点是集群slot对应的节点,如果设置了--copy参数,则传递copy参数,如果设置了--replace,则传递replace参数。 6、不停执行scan命令,直到遍历完全部的key。 7、至此完成整个迁移流程 这中间如果出现异常,程序就会停止。没使用--copy模式,则可以重新执行import命令,使用--copy的话,最好清空新的集群再导入一次。 import命令更适合离线的把外部redis数据导入,在线导入的话最好使用更专业的导入工具,以slave的方式连接redis节点去同步节点数据应该是更好的方式。三、总结 好了,今天就写到这里,有关redis-trib.rb脚步文件的内容还很多,以后再补充进来吧。这个脚本文件对我们很重要,集群的操作很多功能都可以通过这个脚本文件来完成。