Redis 集群的原理是什么?

2 个回答

  • 夜太
    明知不可为而为之就是我最大的诚意
    ## 什么是Redis集群? Redis从3.0开始就支持集群,节点之间使用gossip协议进行通信,实现了去中心化,集群中支持动态的添加和删除节点,动态迁移数据以及自动执行故障转移。 ![image.png](https://images.codewd.com/14fafecf52b43d517a2bc6fb8b9af679.jpg "image.png") ## 什么是数据Sharding? Redis Cluster 使用数据分片实现key的存储分布。 Redis Cluster将集群划分为16384个槽位,数据库中所有的key进行hash计算后,都会落到这16384个槽位中的其中一个槽位。那么key 是如何定位到哪个槽位的,可以通过公式进行计算:CRC16(key)%16384,得到的值就是槽位;16384个槽位全部分配给cluster中的节点,每个节点维护自己的槽位,同时每个节点也会存储其他节点维护的槽位信息。 当然你也可以指定到哪个槽位,这就涉及到了hash tag。 ### 什么是hash tag hash tag 是用来解决用户想要将一堆数据key全部放到一个槽位而提出来的,用户可以将key设置成这样:原始的key+{tag标签},当redis cluster碰到这样的key,就会提取{}里面值,进行槽位计算。 ### 集群中删除或新增节点,数据如何迁移? 假设cluster 目前有 四个节点 A,B,C,D 如何删除D节点,则会将D节点中的所有草味全部分配给ABC节点, 如果新增E节点,则会将ABC中的部分槽点移到D节点。 主要是在节点变化之后,每个节点所维护的槽位变化,然后将槽位挪到对应节点就好。 ## Redis集群如何使用gossip通信? ### 定义 gossip使得元数据分布存储,不做集中存放,实现了去中心化,当一个节点信息变更,就会触发集群中整个节点信息的更新,缺点就是更新会有延迟。 ### meet消息 用于在集群中通知新节点加入 ### ping消息 用于检测节点是否在线及交换每个节点之间的状态信息 ### pong消息 pong消息是用来回应其他节点向自己发的消息,还可以通过发此消息,让其他节点更新此节点的状态信息 ### fail消息(不是用gossip协议实现) 当集群里的主节点A将主节点B标记为下线时,**会通过集群广播一条关于主节点B的FAIL消息,所有接收到这条消息的节点(包括主从节点)都会将主节点B标记为下线** ![image.png](https://images.codewd.com/6535e9d24ea0ef0727d5e7f80feb8b67.jpg "image.png") ## 数据访问如何定位到具体的节点? ### 正常访问 ![image.png](https://images.codewd.com/9b3486e7a152d0d462c15899a7263b4d.jpg "image.png") ### 访问已被迁移至其他节点的数据 ![image.png](https://images.codewd.com/7a1afe98184c1a13409753747bb283ec.jpg "image.png")
    发布于 2025-04-13 05:30 •IP属地 西藏
    举报
    评论
    收藏

  • 龙腾
    态度本身也是答案的一部分。
    Redis 集群通过分片和分布式技术实现数据的高可用性和可扩展性。其核心原理包括以下几个方面: 1. **集群总线通信**: - **集群总线端口**:集群消息通信通过集群总线进行,集群总线端口是客户端服务端口 + 10000(固定值)。例如,Redis 实例的端口是 6379,则集群总线端口是 16379。 - **二进制协议**:节点与节点之间通过二进制协议进行通信,这种协议高效且紧凑,适合大规模数据传输。 2. **客户端与集群节点通信**: - **文本协议**:客户端和集群节点之间的通信使用常规的文本协议,类似于单节点 Redis 通信方式。 - **查询代理**:集群节点不会代理查询,客户端需要直接与相关的 Redis 节点通信。这意味着客户端需要支持 Redis Cluster 协议来处理节点的重定向。 3. **数据分布与哈希槽**: - **哈希槽(Hash Slot)**:Redis 集群内置了 16384 个哈希槽。当需要在 Redis 集群中放置一个 key-value 时,Redis 先对 key 使用 `crc16` 算法计算出一个结果,然后对 16384 求余数,这样每个 key 都会对应一个编号在 0~16383 之间的哈希槽。 - **槽映射**:Redis 会根据节点数量大致均等地将哈希槽映射到不同的节点上。每个节点负责一定范围的哈希槽。 4. **故障转移与高可用**: - **自动故障转移**:如果集群中的某个节点挂掉,Redis 集群会自动进行故障转移,将该节点的数据和请求重定向到备份节点(从节点)。 - **故障检测**:通过心跳机制和集群总线通信,集群节点可以实时监测彼此的状态,及时发现和处理故障。 5. **扩容与缩容**: - **平滑扩容/缩容**:Redis 集群支持相对平滑的节点扩容和缩容。当增加或删除节点时,集群可以自动调整哈希槽的分布,确保数据均衡分布在各个节点上。 - **数据迁移**:在扩容或缩容过程中,Redis 集群会自动进行数据迁移,将相关哈希槽的数据迁移到新的节点或从删除的节点迁移到其他节点。 #### Redis 集群的示例配置 1. **节点配置**: 配置 Redis 节点以启用集群模式: ```plaintext cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes ``` 2. **创建集群**: 使用 `redis-cli` 创建集群,将多个 Redis 节点组合成一个集群: ```bash redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1 ``` 3. **客户端操作**: 客户端使用 Redis 集群时,需要支持 Redis Cluster 协议,可以直接连接到任意一个集群节点,进行读写操作。 ### 总结 Redis 集群通过哈希槽机制将数据分布在多个节点上,实现数据的分布式存储和高可用性。集群中的节点通过集群总线通信,自动进行故障检测和故障转移,支持平滑的扩容和缩容。通过这些机制,Redis 集群能够在高并发和大数据量的场景下提供高效、可靠的分布式缓存和数据存储服务。
    发布于 2024-08-05 13:06 •IP属地 辽宁
    举报
    评论
    收藏