设为首页 收藏本站
查看: 1162|回复: 0

[经验分享] Redis-trib.rb解析

[复制链接]

尚未签到

发表于 2018-11-2 14:14:30 | 显示全部楼层 |阅读模式
Redis-trib.rb –create源码解析

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

二、  流程概览图
DSC0000.jpg


三、  节点可用性检测
  

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信息
  如:
DSC0001.jpg


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

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

  第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到新节点。

二、  流程图
DSC0003.jpg


三、  关键步骤解析

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

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

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

   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用于剔除集群中的节点。

二、流程图
DSC0006.jpg


三、关键步骤

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

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629935-1-1.html 上篇帖子: Redis初步了解 下篇帖子: Redis 高可用部署
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表