Redis集群搭建中,数据如何在节点分布的原理,下面来介绍一下节点之间是如何进行通信(节点握手)

在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障等状态信息。常见的元数据维护方式分为:集中式和P2P方式。Redis集群采用P2P的Gossip(流言)协议,Gossip协议工作原理就是节点彼此不断通信交换信息,一段时间后所有的节点都会知道集群完整的信息,这种方式类似流言传播

节点之间通信示意图

集群中的每个节点都会单独开辟一个TCP通道,用于节点之间彼此通信,通信端口号在基础端口上加10000

每个节点在固定周期内通过特定规则选择几个节点发送ping消息

接收到ping消息的节点用pong消息作为响应

集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以正常通信,最终它们会达到一致的状态。当节点出故障、新节点加入、主从角色变化、槽信息变更等事件发生时,通过不断的ping/pong消息通信,经过一段时间后所有的节点都会知道整个集群全部节点的最新状态,从而达到集群状态同步的目的。

Gossip消息

Gossip协议的主要职责就是信息交换。信息交换的载体就是节点彼此发送的Gossip消息,常用的Gossip消息可分为:ping消息、pong消息、meet消息、fail消息

meet消息:用于通知新节点加入。消息发送者通知接收者加入到当前集群,meet消息通信正常完成后,接收节点会加入到集群中并进行周期性的ping、pong消息交换

ping消息:集群内交换最频繁的消息,集群内每个节点每秒向多个其他节点发送ping消息,用于检测节点是否在线和交换彼此状态信息。ping消息发送封装了自身节点和部分其他节点的状态数据

pong消息:当接收到ping、meet消息时,作为响应消息回复给发送方确认消息正常通信。pong消息内部封装了自身状态数据。节点也可以向集群内广播自身的pong消息来通知整个集群对自身状态进行更新

fail消息:当节点判定集群内另一个节点下线时,会向集群内广播一个fail消息,其他节点接收到fail消息之后把对应节点更新为下线状态

接收节点会解析消息内容并根据自身的识别情况做出相应处理,对应流程

解析消息头过程:消息头包含了发送节点的信息,如果发送节点是新节点且消息是meet类型,则加入到本地节点列表;如果是已知节点,则尝试更新发送节点的状态,如槽映射关系、主从角色等状态

解析消息体过程:如果消息体的clusterMsgDataGossip数组包含的节点是新节点,则尝试发起与新节点的meet握手流程;如果是已知节点,则根据cluster MsgDataGossip中的flags字段判断该节点是否下线,用于故障转移

节点选择

由于内部需要频繁地进行节点信息交换,而ping/pong消息会携带当前节点和部分其他节点的状态数据,势必会加重带宽和计算的负担。Redis集群内节点通信采用固定频率(定时任务每秒执行10次)。因此节点每次选择需要通信的节点列表变得非常重要。通信节点选择过多虽然可以做到信息及时交换但成本过高。节点选择过少会降低集群内所有节点彼此信息交换频率,从而影响故障判定、新节点发现等需求的速度。因此Redis集群的Gossip协议需要兼顾信息交换实时性和成本开销,

选择发送消息的节点数量

集群内每个节点维护定时任务默认每秒执行10次,每秒会随机选取5个节点找出最久没有通信的节点发送ping消息,用于保证Gossip信息交换的随机性。每100毫秒都会扫描本地节点列表,如果发现节点最近一次接受pong消息的时间大于cluster_node_timeout/2,则立刻发送ping消息,防止该节点信息太长时间未更新。根据以上规则得出每个节点每秒需要发送ping消息的数量=1+10*num(node.pong_received>cluster_node_timeout/2),因此cluster_node_timeout参数对消息发送的节点数量影响非常大。当我们的带宽资源紧张时,可以适当调大这个参数,如从默认15秒改为30秒来降低带宽占用率。过度调大cluster_node_timeout会影响消息交换的频率从而影响故障转移、槽信息更新、新节点发现的速度。因此需要根据业务容忍度和资源消耗进行平衡。同时整个集群消息总交换量也跟节点数成正比。

消息数据量

每个ping消息的数据量体现在消息头和消息体中,其中消息头主要占用空间的字段是myslots[CLUSTER_SLOTS/8],占用2KB,这块空间占用相对固定。消息体会携带一定数量的其他节点信息用于信息交换,消息体携带数据量跟集群的节点数息息相关,更大的集群每次消息通信的成本也就更高,因此对于Redis集群来说并不是大而全的集群更好

Redis集群的节点通信原理相关推荐

  1. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  2. redis db0 到 db15_深入剖析Redis系列: Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  3. redis集群添加节点报错Either the node already knows other nodes (check with CLUSTER NODES) or contains some k

    [README] redis集群添加节点报错 [ERR] Node 192.168.163.202:6380 is not empty. Either the node already knows o ...

  4. Redis集群添加节点

    Redis集群添加节点 1:首先把需要添加的节点启动 cd /usr/local/cluster/ mkdir 7006 cp /usr/local/cluster/redis.conf  /usr/ ...

  5. Redis集群master节点挂掉之后的处理方式

    大家好,今天分享Redis集群master节点挂掉之后的处理方式 我们前面做的主从复制 是这样的一个结构 要改成这样 将6303的主节点接到6302 127.0.0.1:6303> SLAVEO ...

  6. shell脚本遍历redis集群所有节点日志,并入库到hadoop中,进行数据分析

    shell脚本遍历redis集群所有节点,并入库到hadoop中的数据库中,进行数据分析,在此留存,以备他用 [AAAAAAnilRedis@FXYY-FS-redis2 ~]$ cat /home/ ...

  7. 【Redis集群专题】「集群技术三部曲」介绍一下常用的Redis集群机制方案的原理和指南(入门篇)

    集群化的方案 Redis的Sentinel解决了主从复制故障不能自动迁移的问题,但是主节点的写性能和存储能力依然是受到了Redis单机容量有限的限制,所以使用Redis集群去解决这个问题,将Redis ...

  8. Redis集群架构搭建和原理

    Redis集群架构教程 Redis常见的架构有主从.哨兵.高可用集群,接下来的文章分四章分别介绍linux安装redis.主从架构搭建.哨兵模式搭建.集群架构搭建 第一章 Redis的安装 我的cen ...

  9. Redis集群方案:redis-cluste原理与搭建

    一.Redis集群方式介绍 3.0版本之前的redis是不支持集群的,只支持单实例模式,虽然支持主从模式.哨兵模式部署来解决单点故障,但是想要集群得用中间件.不适合大型数据. 常见集群方案: (1)官 ...

  10. redis集群模式的工作原理

    redis cluster原理 redis cluster(多master + 读写分离 + 高可用) 我们只基于redis cluster去搭建redis集群即可,不需要手工去搭建replicati ...

最新文章

  1. 浅析Linux IO
  2. LaTeX如何让两张图并排显示
  3. 读取Webpage表中的内容
  4. OpenJudge/Poj 1915 Knight Moves
  5. 在windows实现和smtp交互发送邮件
  6. 21天Jmeter打卡day15 配置元件之用户定义的变量
  7. java sort排序函数
  8. java前后端接口文档_细说API - 文档和前后端协作
  9. python 多线程ping_Python快速多线程ping实现
  10. transition天坑
  11. python初步判断车牌
  12. android 通知栏图标变白色方格
  13. 爬虫就是python吗_python就是爬虫吗
  14. Linux快速入门之 静态库和动态库 (07)
  15. java安装报错循环冗余检查_SQLSERVER2012备份日志报错:”读取失败: 23(数据错误(循环冗余检查)。)”...
  16. echarts地图生成
  17. 【Rust日报】2022-02-09 热议帖 - 我TM的做开源没有得到任何资助
  18. 图形化mysql监控_mysql_monitor
  19. 【U8】U8.11(8.12) access版本如何升级到用友T3及U8
  20. 深入解读 Spark 宽依赖和窄依赖(ShuffleDependency NarrowDependency)

热门文章

  1. 以树之名,诉春之情--F1503005班团改金
  2. 各种学习网址总结-程序猿值得拥有 持更
  3. PLC网关 PLC远程控制调试
  4. AC_automaton 模板
  5. linux 如何把文件夹压缩文件,如何在Ubuntu桌面中将文件/文件夹压缩为.zip,tar.xz和7z格式...
  6. hdu 1212 Big Number
  7. 微信公众平台可以修改微信号了,微信号怎么设置好
  8. MySQL修改数据表中的字段名_MySQL修改数据表中的字段名
  9. oracle某字段所在的表,在oracle中怎么通过字段名查询其所在的表
  10. OpenCV 之 角点检测