本文共 2185 字,大约阅读时间需要 7 分钟。
Redis 集群通过 gossip 协议实现节点间的通信,确保集群内所有节点的数据保持一致。与集中式中间件相比,gossip 协议的优势在于能分散元数据更新的压力,但也伴随着数据更新的延迟。以下将从基础通信原理、端口配置、信息交换、gossip 协议的具体实现以及高可用性切换等方面详细阐述。
Redis 集群采用 gossip 协议进行节点间的通信,每个节点都维护自身的状态信息。集群内的元数据(如节点信息、故障状态等)通过 gossip 协议在节点间广播,确保所有节点保持一致。与集中式中间件(如Zookeeper)相比,gossip 协议的优势在于元数据更新压力分散,更新请求会陆续发送至所有节点,降低了单点压力。
集中式:
gossip:
两者的优缺点相互对应,选择取决于具体场景需求。
在 Redis 集群中,每个节点都配置了一个专门用于节点间通信的端口,计算方式为服务端口号 + 10000。例如,如果节点的服务端口是 7001,则用于通信的端口为 17001。
每个节点定期向其他节点发送 ping 消息,并接收 pong 响应,确保网络连接正常。ping 消息中携带节点状态信息和元数据,用于保持节点间的数据一致性。
节点间通过 gossip 协议交换的信息包括:
gossip 协议包含多种消息类型,主要包括:
每个节点每秒会发送 10 次 ping 消息,每次选择通信延迟最长的 5 个节点。若发现某节点通信延迟超过 cluster_node_timeout / 2,会立即发送 ping 确保数据同步。例如,若 cluster_node_timeout 为 10 分钟,则延迟超过 5 分钟会触发 ping。
每次 ping 消息至少携带 3 个节点信息,最多携带总节点数 - 2 个节点信息,确保数据交换的全面性。
Jedis 是 Redis Java 客户端,支持 Redis 集群。其工作原理基于 Redis 集群的特性,通过智能客户端(Smart Client)实现高效的节点间通信。
Redis 提供了 redis-cli -c 命令,支持自动请求重定向。Jedis 客户端同样采用这种机制:
hash slot 的计算基于 CRC16 算法,将 CRC16 值对 16384 取模,确定目标节点。用户可通过 hash tag 手动指定 key 的 slot,确保数据分布合理。
节点间通过 gossip 协议交换 hash slot 与节点的映射关系,确保每个 hash slot 都知晓其所属节点。
Jedis 集群客户端维护本地 cache,存储 hash slot 到节点的映射关系。大部分情况下直接访问缓存即可,减少了请求重定向带来的性能消耗。
当 hash slot 迁移时,节点返回 ask 重定向指令。Jedis 客户端接收后,会重新定位目标节点执行命令。由于 ask 请求发生在迁移过程中,客户端不会更新本地 cache,直到迁移完成后再进行 cache 更新。
Redis 集群的高可用性机制类似于哨兵,主要包括以下步骤:
判断节点宕机:
从节点过滤:
从节点选举:
主备切换:
Redis 集群集成了哨兵的功能,实现了高可用性与主备切换。两者的原理相似,主要区别在于 Redis 集群无需额外部件,集成更为紧密。
转载地址:http://pqxyz.baihongyu.com/