博客
关于我
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/

    你可能感兴趣的文章
    Oracle中的rownum 和rowid的用法和区别
    查看>>
    oracle中的大小写、字符、dual、数字、处理、日期、函数、显/隐式、时间、条件表达式case、decode、to_date、to_char、sysdate
    查看>>
    oracle中表和视图的区别,oracle中常用表和视图
    查看>>
    oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)
    查看>>
    Oracle从11g导出后导入10g
    查看>>
    oracle从备份归档日志的方法集中回收
    查看>>
    oracle优化器analyzed,Oracle 学习之 性能优化(十三) 索引
    查看>>
    Oracle修改字段类型
    查看>>
    Oracle修改表或者字段的注释
    查看>>
    oracle典型安装失败,安装oracle 10失败
    查看>>
    Oracle内存结构详解(四)--Oracle SGA其他组成部分
    查看>>
    Oracle函数与存储过程和程序包
    查看>>
    Oracle分析函数之LEAD和LAG
    查看>>
    Oracle分组取前n条记录
    查看>>
    Oracle分页sql
    查看>>
    Oracle创建database link(dblink)和同义词(synonym)
    查看>>
    oracle创建数据库的步骤
    查看>>
    Oracle创建用户、角色、授权、建表
    查看>>
    Oracle创建用户与授予表空间与权限
    查看>>
    oracle创建表(并且实现ID自增)
    查看>>