如果 移除添加-节点,建议用 redis-trib.rb 命令,用 cluster 命令 有时会造成 集群建配置 不一致
CLUSTER info:打印集群的信息。 CLUSTER nodes:列出集群当前已知的所有节点(node)的相关信息。 CLUSTER meet <ip> <port>:将ip和port所指定的节点添加到集群当中。 CLUSTER addslots <slot> [slot ...]:将一个或多个槽(slot)指派(assign)给当前节点。 CLUSTER delslots <slot> [slot ...]:移除一个或多个槽对当前节点的指派。 CLUSTER slots:列出槽位、节点信息。 CLUSTER slaves <node_id>:列出指定节点下面的从节点信息。 CLUSTER replicate <node_id>:将当前节点设置为指定节点的从节点。 CLUSTER saveconfig:手动执行命令保存保存集群的配置文件,集群默认在配置修改的时候会自动保存配置文件。 CLUSTER keyslot <key>:列出key被放置在哪个槽上。 CLUSTER flushslots:移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 CLUSTER countkeysinslot <slot>:返回槽目前包含的键值对数量。 CLUSTER getkeysinslot <slot> <count>:返回count个槽中的键。 CLUSTER setslot <slot> node <node_id> 将槽指派给指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽,然后再进行指派。 CLUSTER setslot <slot> migrating <node_id> 将本节点的槽迁移到指定的节点中。 CLUSTER setslot <slot> importing <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。 CLUSTER setslot <slot> stable 取消对槽 slot 的导入(import)或者迁移(migrate)。 CLUSTER failover:手动进行故障转移。 CLUSTER forget <node_id>:从集群中移除指定的节点,这样就无法完成握手,过期时为60s,60s后两节点又会继续完成握手。 CLUSTER reset [HARD|SOFT]:重置集群信息,soft是清空其他节点的信息,但不修改自己的id,hard还会修改自己的id,不传该参数则使用soft方式。 CLUSTER count-failure-reports <node_id>:列出某个节点的故障报告的长度。 CLUSTER SET-CONFIG-EPOCH:设置节点epoch,只有在节点加入集群前才能设置。
redis-trib.rb用法(不带任何参数执行redis-trib.rb即显示用法):
$ ./redis-trib.rb Usage: redis-trib <command> <options> <arguments ...>
rebalance host:port --auto-weights --timeout <arg> --pipeline <arg> --use-empty-masters --weight <arg> --threshold <arg> --simulate add-node new_host:new_port existing_host:existing_port --slave --master-id <arg> reshard host:port --timeout <arg> --pipeline <arg> --yes --slots <arg> --to <arg> --from <arg> check host:port set-timeout host:port milliseconds call host:port command arg arg .. arg fix host:port --timeout <arg> info host:port create host1:port1 ... hostN:portN --replicas <arg> import host:port --replace --copy --from <arg> help (show this help) del-node host:port node_id
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具有以下功能:
1、create:创建集群
2、check:检查集群
3、info:查看集群信息
4、fix:修复集群
5、reshard:在线迁移slot
6、rebalance:平衡集群节点slot数量
7、add-node:将新节点加入集群
8、del-node:从集群中删除节点
9、set-timeout:设置集群节点间心跳连接的超时时间
10、call:在集群全部节点上执行命令
11、import:将外部redis数据导入集群
下面从redis-trib.rb使用和源码的角度详细介绍redis-trib.rb的每个功能。
redis-trib.rb主要有两个类:ClusterNode和RedisTrib。ClusterNode保存了每个节点的信息,RedisTrib则是redis-trib.rb各个功能的实现。
ClusterNode对象
先分析ClusterNode源码。ClusterNode有下面几个成员变量(ruby的类成员变量是以@开头的):
@r:执行redis命令的客户端对象。
@info:保存了该节点的详细信息,包括cluster nodes命令中自己这行的信息和cluster info的信息。
@dirty:节点信息是否需要更新,如果为true,我们需要把内存的节点更新信息到节点上。
@friends:保存了集群其他节点的info信息。其信息为通过cluster nodes命令获得的其他节点信息。
ClusterNode有下面一些成员方法:
initialize:ClusterNode的构造方法,需要传入节点的地址信息。
friends:返回@friends对象。
slots:返回该节点负责的slots信息。
has_flag?:判断节点info信息的的flags中是否有给定的flag。
to_s:类似java的toString方法,返回节点的地址信息。
connect:连接redis节点。
assert_cluster:判断节点开启了集群配置。
assert_empty:确定节点目前没有跟任何其他节点握手,同时自己的db数据为空。
load_info:通过cluster info和cluster nodes导入节点信息。
add_slots:给节点增加slot,该操作只是在内存中修改,并把dirty设置成true,等待flush_node_config将内存中的数据同步在节点执行。
set_as_replica:slave设置复制的master地址。dirty设置成true。
flush_node_config:将内存的数据修改同步在集群节点中执行。
info_string:简单的info信息。
get_config_signature:用来验证集群节点见的cluster nodes信息是否一致。该方法返回节点的签名信息。
info:返回@info对象,包含详细的info信息。
is_dirty?:判断@dirty。
r:返回执行redis命令的客户端对象。
有了ClusterNode对象,在处理集群操作的时候,就获得了集群的信息,可以进行集群相关操作。在此先简单介绍下redis-trib.rb脚本的使用,以create为例:
create host1:port1 ... hostN:portN
--replicas <arg>
host1:port1 ... hostN:portN表示子参数,这个必须在可选参数之后,--replicas <arg>是可选参数,带的表示后面必须填写一个参数,像--slave这样,后面就不带参数,掌握了这个基本规则,就能从help命令中获得redis-trib.rb的使用方法。
其他命令大都需要传递host:port,这是redis-trib.rb为了连接集群,需要选择集群中的一个节点,然后通过该节点获得整个集群的信息。