博客
关于我
redis cluster 的核心原理分析:gossip 通信、jedis smart 定位、主备切换
阅读量:438 次
发布时间:2019-03-06

本文共 2185 字,大约阅读时间需要 7 分钟。

Redis 集群节点间的内部通信机制

Redis 集群通过 gossip 协议实现节点间的通信,确保集群内所有节点的数据保持一致。与集中式中间件相比,gossip 协议的优势在于能分散元数据更新的压力,但也伴随着数据更新的延迟。以下将从基础通信原理、端口配置、信息交换、gossip 协议的具体实现以及高可用性切换等方面详细阐述。

基础通信原理

Redis 集群采用 gossip 协议进行节点间的通信,每个节点都维护自身的状态信息。集群内的元数据(如节点信息、故障状态等)通过 gossip 协议在节点间广播,确保所有节点保持一致。与集中式中间件(如Zookeeper)相比,gossip 协议的优势在于元数据更新压力分散,更新请求会陆续发送至所有节点,降低了单点压力。

集中式与gossip的对比

  • 集中式

    • 优点:元数据更新及时,读取时效性好。一旦元数据发生变更,更新会立即生效。
    • 缺点:元数据更新压力集中在单一节点,可能导致存储压力过大。
  • gossip

    • 优点:元数据更新压力分散,更新请求分散到多个节点,降低了单点压力。
    • 缺点:元数据更新存在延迟,可能导致集群操作滞后。

两者的优缺点相互对应,选择取决于具体场景需求。

10000 端口配置

在 Redis 集群中,每个节点都配置了一个专门用于节点间通信的端口,计算方式为服务端口号 + 10000。例如,如果节点的服务端口是 7001,则用于通信的端口为 17001。

每个节点定期向其他节点发送 ping 消息,并接收 pong 响应,确保网络连接正常。ping 消息中携带节点状态信息和元数据,用于保持节点间的数据一致性。

信息交换内容

节点间通过 gossip 协议交换的信息包括:

  • 故障信息:当某节点失效时,其他节点会立即通过 fail 消息通知集群。
  • 节点状态:包括节点是否在线、是否为主节点等。
  • hash slot 信息:用于 Redis 集群的 keys 分配,确保数据分布合理。

gossip 协议详解

gossip 协议包含多种消息类型,主要包括:

  • meet:用于新节点加入集群时的欢迎消息,通知新节点开始与其他节点通信。
  • ping:频繁发送的节点状态消息,携带自身信息和其他节点信息,用于元数据交换。
  • pong:对应 ping 消息的确认响应,用于信息广播和状态同步。
  • fail:通知其他节点某节点失效。

ping 消息深入

每个节点每秒会发送 10 次 ping 消息,每次选择通信延迟最长的 5 个节点。若发现某节点通信延迟超过 cluster_node_timeout / 2,会立即发送 ping 确保数据同步。例如,若 cluster_node_timeout 为 10 分钟,则延迟超过 5 分钟会触发 ping。

每次 ping 消息至少携带 3 个节点信息,最多携带总节点数 - 2 个节点信息,确保数据交换的全面性。

jedis 内部实现原理

Jedis 是 Redis Java 客户端,支持 Redis 集群。其工作原理基于 Redis 集群的特性,通过智能客户端(Smart Client)实现高效的节点间通信。

基于重定向的客户端

Redis 提供了 redis-cli -c 命令,支持自动请求重定向。Jedis 客户端同样采用这种机制:

  • 客户端随机选择一个 Redis 节点发送命令。
  • 节点接收命令后,计算 key 的 hash slot。
  • 若 key 在本地处理,直接完成;否则返回 moved ,通知客户端进行重定向。

hash slot 计算

hash slot 的计算基于 CRC16 算法,将 CRC16 值对 16384 取模,确定目标节点。用户可通过 hash tag 手动指定 key 的 slot,确保数据分布合理。

hash slot 查找

节点间通过 gossip 协议交换 hash slot 与节点的映射关系,确保每个 hash slot 都知晓其所属节点。

smart jedis 优化

Jedis 集群客户端维护本地 cache,存储 hash slot 到节点的映射关系。大部分情况下直接访问缓存即可,减少了请求重定向带来的性能消耗。

hash slot 迁移与 ask 重定向

当 hash slot 迁移时,节点返回 ask 重定向指令。Jedis 客户端接收后,会重新定位目标节点执行命令。由于 ask 请求发生在迁移过程中,客户端不会更新本地 cache,直到迁移完成后再进行 cache 更新。

高可用性与主备切换

Redis 集群的高可用性机制类似于哨兵,主要包括以下步骤:

  • 判断节点宕机

    • 节点主观宕机(pfail):接收到的 ping 超时。
    • 节点客观宕机(fail):多个节点确认同一节点失效。
  • 从节点过滤

    • 检查从节点与主节点的连接时间,超过阈值的节点被过滤。
  • 从节点选举

    • 根据 slave priority、offset、run id 等因素排序。
    • 大多数主节点投票选举,新的从节点成为主节点。
  • 主备切换

    • 故障节点的从节点切换为主节点,确保集群高可用。
  • 与哨兵的比较

    Redis 集群集成了哨兵的功能,实现了高可用性与主备切换。两者的原理相似,主要区别在于 Redis 集群无需额外部件,集成更为紧密。

    转载地址:http://pqxyz.baihongyu.com/

    你可能感兴趣的文章
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>
    NUMPY矢量化np.prod不能构造具有超过32个操作数的ufunc
    查看>>
    Numpy矩阵与通用函数
    查看>>
    numpy绘制热力图
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    Numpy闯关100题,我闯了95关,你呢?
    查看>>
    nump模块
    查看>>
    Nutch + solr 这个配合不错哦
    查看>>
    NuttX 构建系统
    查看>>
    NutUI:京东风格的轻量级 Vue 组件库
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NutzWk 5.1.5 发布,Java 微服务分布式开发框架
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    Nuxt Time 使用指南
    查看>>
    NuxtJS 接口转发详解:Nitro 的用法与注意事项
    查看>>
    NVDIMM原理与应用之四:基于pstore 和 ramoops保存Kernel panic日志
    查看>>
    NVelocity标签使用详解
    查看>>
    NVelocity标签设置缓存的解决方案
    查看>>
    Nvidia Cudatoolkit 与 Conda Cudatoolkit
    查看>>