谈谈redis cluster集群原理,客户端是怎样知道该访问哪个分片的?

1 个回答

  • 天魁
    我最喜欢自己仁至义尽后心安理得的无情无义。
    Redis Cluster 的核心思想是将数据分片存储在多个节点上,提供高性能、高可用、可扩展的解决方案。具体原理以及客户端如何访问对应分片节点的流程如下: ## 一、Redis Cluster 集群的原理 ### 1. 数据分片原理 Redis Cluster 使用**哈希槽 (Hash Slot)** 的方式分片数据: - 集群中共有 **16384** 个哈希槽(编号从 `0` 到 `16383`)。 - 每个节点负责一部分哈希槽,数据的存取通过以下公式决定: ``` CRC16(key) % 16384 = 哈希槽编号 ``` 通过这种方式,每个 key 都映射到一个固定的槽上,进而明确该数据由哪个节点负责。 ### 2. 节点类型与通信机制 Redis Cluster 节点分为: - **主节点 (Master)**:存储数据,负责处理客户端请求。 - **从节点 (Slave)**:备份主节点数据,当主节点故障时,实现自动故障转移。 节点之间通过专用的 TCP 通道(默认端口基础上 +10000,如6379对应16379)互相通信,交换槽位和节点状态等信息,形成完整的拓扑结构。 ## 二、客户端如何知道访问哪个分片? ### 1. 客户端首次连接集群时: - 客户端连接到 Redis 集群中的**任意一个节点**。 - 集群节点向客户端返回当前集群的**槽位分配情况**(slots allocation)。 - 客户端缓存这个槽位映射表。 例如,Redis 集群会返回类似的结构给客户端: ```json [ [0, 5460, ["127.0.0.1", 7000]], [5461, 10922, ["127.0.0.1", 7001]], [10923, 16383, ["127.0.0.1", 7002]] ] ``` 客户端根据返回的哈希槽分配情况,缓存这个映射关系。 ### 2. 客户端请求数据时: - 客户端对 key 执行上述 `CRC16(key) % 16384` 计算得出对应槽位。 - 根据本地缓存的槽位映射关系,直接定位到该槽位对应的 Redis 节点,发起请求。 - 请求直接发送到对应分片的主节点,无需经过任何代理节点或中间件,效率高。 ### 3. 集群拓扑发生变化时: - 如果客户端请求了错误的节点(例如槽位迁移了),Redis 节点会返回一个特殊的响应: ``` -MOVED 1234 127.0.0.1:7001 ``` - 客户端收到 `MOVED` 指令后,更新自己的槽位缓存表,并重新发送请求到正确节点。 - 这种机制叫做 **客户端重定向**。 ## 三、小结 Redis Cluster 核心原理与客户端访问流程总结为: - 通过 16384 个哈希槽将数据分片。 - 客户端缓存槽位到节点的映射关系。 - 客户端自行计算 key 对应槽位,从而精确定位对应的 Redis 节点。 - Redis 节点会通过 MOVED 指令及时纠正客户端的缓存,确保准确访问。 这种方案保证了 Redis Cluster 可以提供稳定高效的数据访问与故障转移机制。
    发布于 2025-03-20 03:27 •IP属地 安徽
    举报
    评论
    收藏