? Redis-trib.rb为主流的Redis管理工具,对Redis一系列命令进行了封装通过ruby客户端完成Create Cluster,Reshard Cluster,Add Slave,Remove Node等功能。下面我们来看下Create Cluster建立cluster集群是如何实现的。
1. 节点连通性
2. 是否配置了cluster模式(if cluster_enabled==1?)
3. 是否已经为其他集群成员(if cluster_known_nodes==1?)
4. 检查至少有三个可用节点
5. 获取节点信息:
通过cluster nodes 命令获得统计信息
name,addr,flags,master_id, ping_sent,ping_recv,config_epoch,link_status,slot信息
如:
第559行-562行:将节点根据ip进行归类,dict的key为ip,value为这个ip所对应的节点信息。
第566行-577行:循环ip,每次抽取ip的一个节点放到interleaved里。这可以尽可能让相同节点的分开
第578行:截取interleaved里前几个节点作为masters_count,master_count是根据节点参数个数以及replacas个数决定的。
第585行-594行:根据节点的个数,对每个master节点所对应的slot范围进行计算。
Redis-trib通过ruby连redis的客户端进行配置集群
在新主节点被加入集群后,他没有任何slot数据,需要通过reshard从其他节点中迁移些slot到新节点。
775行 通过slot个数对源节点进行排序,slot多的排在前面
776行-778行 计算源节点的slot总个数
779行-785行 可以看到按照节点占slot总数的百分比来迁移slot,及slot个数越多的节点将被迁移更多。还可以看到slot节点最多的节点会为slot的最大整数
786行-791行 将slot的分派到节点的信息插入moved变量中
?redis支持动态迁移。当slot被设置为状态migrating状态后,当redis client查询节点这个slot所对应的key时,如果节点发现这个key存在直接返回值,如果发现这个key不存在自己的slot里他会发送asking 请求告诉客户端去迁移的目标节点查并且不更改客户端维护的slot分布信息,当客户端请求目标节点时该slot时都是refuse并重定向的,当请求包含asking时他就会接受这个请求并读取key。当迁移完成,他会设置setslot node ,这个操作将会把slot迁移状态清除并设置该slot的新的目标节点。
del-node用于剔除集群中的节点。
337行 选出集群中的master
338行-341行 根据master的slave个数排序,取出最少slave的master作为目标从库的新master
原文:http://blog.51cto.com/10574662/2090514