深入解析redis cluster gossip机制
协议解析
typedef struct {char sig[4]; /* Signature "RCmb" (Redis Cluster message bus). */uint32_t totlen; /* Total length of this message */uint16_t ver; /* Protocol version, currently set to 1. */uint16_t port; /* TCP base port number. */uint16_t type; /* Message type */ uint16_t count; /* Only used for some kind of messages. */uint64_t currentEpoch; /* The epoch accordingly to the sending node. */uint64_t configEpoch; /* The config epoch if it's a master, or the lastepoch advertised by its master if it is aslave. */uint64_t offset; /* Master replication offset if node is a master orprocessed replication offset if node is a slave. */char sender[CLUSTER_NAMELEN]; /* Name of the sender node */unsigned char myslots[CLUSTER_SLOTS/8];char slaveof[CLUSTER_NAMELEN];char myip[NET_IP_STR_LEN]; /* Sender IP, if not all zeroed. */char notused1[34]; /* 34 bytes reserved for future usage. */uint16_t cport; /* Sender TCP cluster bus port */uint16_t flags; /* Sender node flags */unsigned char state; /* Cluster state from the POV of the sender */unsigned char mflags[3]; /* Message flags: CLUSTERMSG_FLAG[012]_... */union clusterMsgData data;
} clusterMsg;
- nodename:
- ping_sent:最近一次sender节点给该节点发送ping的时间点。收到pong回复后ping_sent会被赋值为0
这里作者用了一个技巧去减少gossip通信带宽。如果receiver节点上关于该节点的ping_sent=0 并且没有任何节点正在failover&该节点没有fail&receiver节点上关于该节点的pong_received<sender上的pong_received并且sender的pong_received大于receiver节点内核时间的500ms内,则将receiver节点关于该节点的pong_received时间设置为和sender节点一致,复用sender节点的pong_received。那么received节点则会减少对该节点发送ping。参考issue:https://github.com/antirez/redis/issues/3929
- pong_received:最近一次sender节点收到该节点发送pong的时间点
- ip:
- port:
- cport:
- flags:对应clusterMsg的flags,只不过存储的其他节点的
- configEpoch:receiver节点中保存的sender节点的configepoch
- nodename:receiver节点中保存的sender节点的nodename
- slots:receiver节点中保存的sender节点的slots列表
运转机制
握手联结
- CLUSTER_NODE_HANDSHAKE:表示节点Y正处于握手状态,只有收到来自节点Y的ping、pong、meet其中一种消息后该状态才会被清除
- CLUSTER_NODE_MEET:表示还未给节点Y发送meet消息,一旦发送该状态清除,不管是否成功
- nodename相同:
- nodename不同:
健康检测及failover
状态更新及冲突解决
- configEpoch: 每个分片有唯一的epoch值,主备epoch应该一致
- currentEpoch:集群当前的epoch,=集群中最大分片的epoch
- 如果sender认为自己是master,但是在receiver被标记为slave,则receiver节点在集群视图中将sender标记为master。
- 如果sender认为自己是slave,但是在receiver被标记为master, 则在receiver的集群视图中将sender标记为slave, 加入到sender标记的master中,并且删除sender在reciver集群视图中的slots信息。
结束语
深入解析redis cluster gossip机制相关推荐
- Redis Cluster Gossip 协议详解
Redis Cluster Gossip 协议 大家好,我是历小冰,今天来讲一下 Reids Cluster 的 Gossip 协议和集群操作,文章的思维导图如下所示. 集群模式和 Gossip 简介 ...
- 算法高级(18)-Redis Cluster选举机制
Redis集群是一个distribute.fault-tolerant的Redis实现,主要设计目标是达到线性可扩展性.可用性.数据一致性. 一.一些特性 线性拓展 官方推荐最大的节点数量为1000, ...
- 一万字详解 Redis Cluster Gossip 协议
大家好,我是历小冰,今天来讲一下 Reids Cluster 的 Gossip 协议和集群操作,文章的思维导图如下所示. 集群模式和 Gossip 简介 对于数据存储领域,当数据量或者请求流量大到一定 ...
- Redis Cluster集群知识学习总结
Redis集群解决方案有两个: 1) Twemproxy: 这是Twitter推出的解决方案,简单的说就是上层加个代理负责分发,属于client端集群方案,目前很多应用者都在采用的解决方案.Twem ...
- 算法高级(19)-不得不懂的Redis Cluster数据分片机制
亲爱的同学们,你是否使用过Redis集群呢?那Redis集群的原理又是什么呢?记住下面两句话: Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续 ...
- Java中高级核心知识全面解析——Redis(集群【概述{主从复制、哨兵、集群化}、数据分区方案、节点通信机制、数据结构简析】)5
目录 一.[集群]入门实践教程 1.Redis 集群概述 1)Redis 主从复制 2)Redis 哨兵 3)Redis 集群化 2.主从复制 1)主从复制主要的作用 2)快速体验 ①.第一步:本地启 ...
- 全面剖析Redis Cluster原理和应用 (good)
redis redis cluster注意的问题 : 1.'cluster-require-full-coverage'参数的设置.该参数是redis配置文件中cluster模式的一个参数,从字面上基 ...
- 如何开发一个高性能的redis cluster proxy
背景 redis cluster简介 Redis cluster是redis官方提供集群方案,设计上采用非中心化的架构,节点之间通过gossip协议交换互相的状态,redis cluster使用数据分 ...
- 开源|如何开发一个高性能的redis cluster proxy?
文|曹佳俊 网易云信资深服务端开发工程师 背 景 redis cluster简介 Redis cluster是redis官方提供集群方案,设计上采用非中心化的架构,节点之间通过gossip协 ...
最新文章
- Leetcode 199.二叉树的右视图 (每日一题 20210628 同类型题)
- Rainmeter 天气
- c#服务器后台搭建_【环境搭建】Docker简明安装教程
- 关于用iframe大框架覆盖小框架的问题
- 教你摆脱低级程序猿 项目中cocopads的安装使用
- C++并发与多线程(二) 创建多个线程、数据共享问题分析、案例代码
- gp3688写频线制作_摩托罗拉GP3688对讲机写频软件(摩托罗拉对讲机写频工具) 官方版...
- python 画图十大工具_python实现画图工具
- 显示风场的某一局部区域,实现多分辨率
- IDEA 不检查语法错误问题
- 用linux安装包装ftp,Linux 安装vsftpd和ftp客户端
- WBS(Work Breakdown Structure)
- 基于物理的渲染技术(PBR)系列一
- 几个好玩有趣的Python入门实例
- 关于应用安全可控信息技术加强银行业网络安全和信息化建设的指导意见
- delete 后加 limit
- 【转】用天文方法计算二十四节气(上)
- 【翻译】Real Shading in Unreal Engine 4
- easymock 图片_用easymock来mock数据
- ORACLE存储过程使用数组
热门文章
- CUDA Samples: green ball
- 设计模式之单例模式(Singleton)摘录
- window7系统中64位安装matalbR2009b后出现乱码的解决方案
- 华为鸿蒙手机官网价格表,曝下半年华为将推出两款鸿蒙手机:国内独享,价格良心...
- layui如何存在多个弹窗_layui常见弹窗使用方法
- 计算机应用 含升学方向,对口升学《计算机应用基础》复习资料总汇(含答案))讲述.doc...
- kudu接受kafka消息_Kafka 在车好多
- python解压_python解压缩
- r语言手动算两个C指数p值,如何用R语言进行Pvalue显著性标记?
- linux shell for 循环变量,shell for循环总结