Redis-trib.rb解析-创新互联

Redis-trib.rb –create源码解析

一、 介绍

Redis-trib.rb为主流的Redis管理工具,对Redis一系列命令进行了封装通过ruby客户端完成Create Cluster,Reshard Cluster,Add Slave,Remove Node等功能。下面我们来看下Create Cluster建立cluster集群是如何实现的。

创新互联是专业的天涯网站建设公司,天涯接单;提供做网站、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行天涯网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

二、 流程概览图

Redis-trib.rb解析

三、 节点可用性检测

 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解析

四、 主从预分配以及节点预分配

说明:Redis-trib.rb create可以尽可能的将主库的不同节点分配到不同的机器并且可以将主从库物理机分离,此功能的实现调用了alloc_slots函数,我们截取了部分进行分析。

Redis-trib.rb解析
第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的客户端进行配置集群

  1. 对主节点进行slot分配(addslots),cluster_state become ok and cluster_slots_assigned become not null
  2. 为每个节点设置不同的config_epoch(set-config-epoch)
  3. 节点加入集群(CLUSTER MEET)
  4. 主从配置(replicate)
  5. 等待所有节点都有相同的集群配置信息

六、 集群状态检测

  1. 检查是否有open slot
    Openslot定义为slot信息为migrating或者importing,标示为->-。
    2.检查slot是否全覆盖

Redis-trib.rb –reshard源码解析

一、概述

在新主节点被加入集群后,他没有任何slot数据,需要通过reshard从其他节点中迁移些slot到新节点。

二、 流程图

Redis-trib.rb解析

三、 关键步骤解析

说明:compute_reshard_table方法主要用来智能计算每个目标节点需要迁移多少slot

Redis-trib.rb解析
775行 通过slot个数对源节点进行排序,slot多的排在前面
776行-778行 计算源节点的slot总个数
779行-785行 可以看到按照节点占slot总数的百分比来迁移slot,及slot个数越多的节点将被迁移更多。还可以看到slot节点最多的节点会为slot的大整数
786行-791行 将slot的分派到节点的信息插入moved变量中

说明:在migrate节点之前需要设置slot importing状态和migrating状态

Redis-trib.rb解析
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用于剔除集群中的节点。

二、流程图

Redis-trib.rb解析

三、关键步骤

说明:get_master_with_least_replicas方法如果delete node有从库,他将指定他的从库去其他主节点。

Redis-trib.rb解析
337行 选出集群中的master
338行-341行 根据master的slave个数排序,取出最少slave的master作为目标从库的新master

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前标题:Redis-trib.rb解析-创新互联
路径分享:http://ybzwz.com/article/hpjed.html