Redis-trib.rb –create源码解析
一、 介绍
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信息
如:
四、 主从预分配以及节点预分配
说明:Redis-trib.rb create可以尽可能的将主库的不同节点分配到不同的机器并且可以将主从库物理机分离,此功能的实现调用了alloc_slots函数,我们截取了部分进行分析。
第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分配(addslots),cluster_state become ok and cluster_slots_assigned become not null
- 为每个节点设置不同的config_epoch(set-config-epoch)
- 节点加入集群(CLUSTER MEET)
- 主从配置(replicate)
- 等待所有节点都有相同的集群配置信息
六、 集群状态检测
- 检查是否有open slot
Openslot定义为slot信息为migrating或者importing,标示为->-。
2.检查slot是否全覆盖
Redis-trib.rb –reshard源码解析
一、概述
在新主节点被加入集群后,他没有任何slot数据,需要通过reshard从其他节点中迁移些slot到新节点。
二、 流程图
三、 关键步骤解析
说明:compute_reshard_table方法主要用来智能计算每个目标节点需要迁移多少slot
775行 通过slot个数对源节点进行排序,slot多的排在前面
776行-778行 计算源节点的slot总个数
779行-785行 可以看到按照节点占slot总数的百分比来迁移slot,及slot个数越多的节点将被迁移更多。还可以看到slot节点最多的节点会为slot的最大整数
786行-791行 将slot的分派到节点的信息插入moved变量中
说明:在migrate节点之前需要设置slot importing状态和migrating状态
redis支持动态迁移。当slot被设置为状态migrating状态后,当redis client查询节点这个slot所对应的key时,如果节点发现这个key存在直接返回值,如果发现这个key不存在自己的slot里他会发送asking 请求告诉客户端去迁移的目标节点查并且不更改客户端维护的slot分布信息,当客户端请求目标节点时该slot时都是refuse并重定向的,当请求包含asking时他就会接受这个请求并读取key。当迁移完成,他会设置setslot node ,这个操作将会把slot迁移状态清除并设置该slot的新的目标节点。
Redis-trib.rb --del-node
一、概述
del-node用于剔除集群中的节点。
二、流程图
三、关键步骤
说明:get_master_with_least_replicas方法如果delete node有从库,他将指定他的从库去其他主节点。
337行 选出集群中的master
338行-341行 根据master的slave个数排序,取出最少slave的master作为目标从库的新master