Redis的主从库与切片集群机制
Redis 的主从库和切片集群是两种重要的高可用与扩展性解决方案,分别解决不同场景下的需求:
一、主从库机制(Master-Slave Replication)
主从库是 Redis 实现数据备份和读写分离的基础机制,通过数据复制保证数据一致性。
核心原理
角色分工:
- 主库(Master):负责处理所有写操作(SET、HSET 等)和部分读操作。
- 从库(Slave):通过复制主库数据,仅处理读操作(GET、HGET 等),减轻主库压力。
数据复制流程:
- 初始化阶段:从库通过
SLAVEOF
命令连接主库,主库生成 RDB 快照并发送给从库,从库加载快照后,主库再将缓冲区的增量命令同步给从库。 - 增量同步:主库后续的写操作会实时同步到从库(通过 replication buffer 和 offset 保证数据不丢失)。
- 初始化阶段:从库通过
优势:
- 读写分离:读请求分摊到从库,提升系统吞吐量。
- 数据备份:从库作为主库的副本,避免单点数据丢失风险。
- 故障转移基础:主库故障时,可通过哨兵(Sentinel)将从库升级为主库。
注意事项:
- 主从复制默认是异步的,极端情况下可能存在数据短暂不一致。
- 从库默认只读(
slave-read-only yes
),避免直接写入从库导致数据混乱。
二、切片集群(Redis Cluster)
当单节点 Redis 无法满足海量数据存储需求时,切片集群(Redis Cluster)通过数据分片实现水平扩展。
核心原理
数据分片:
- 将数据按 哈希槽(Hash Slot) 分配到不同节点,共 16384 个槽(0-16383)。
- 键通过
CRC16(key) % 16384
计算所属槽位,每个节点负责一部分槽。
集群拓扑:
- 由多个主节点组成,每个主节点可挂载从节点(用于故障转移)。
- 节点间通过 Gossip 协议交换信息,维护集群状态(槽分配、节点健康等)。
请求路由:
- 客户端请求某键时,若当前节点不负责该键的槽,会返回
MOVED
重定向,指引客户端到正确节点。 - 支持
ASK
重定向(用于槽迁移过程中)。
- 客户端请求某键时,若当前节点不负责该键的槽,会返回
优势:
- 水平扩展:通过增加节点分摊存储和请求压力,突破单节点内存 / 性能瓶颈。
- 高可用:主节点故障时,其从节点会自动升级为主节点(基于 Raft 协议的投票机制)。
注意事项:
- 不支持跨槽的多键操作(如
MGET
包含多个槽的键),需手动保证键在同一槽(通过{tag}
哈希标签)。 - 集群最小配置为 3 主 3 从(保证高可用)。
- 不支持跨槽的多键操作(如
三、主从库与切片集群的区别与配合
维度 | 主从库 | 切片集群 |
---|---|---|
核心目标 | 读写分离、数据备份 | 数据分片、水平扩展 |
数据分布 | 主从数据完全一致 | 数据分片到不同节点 |
适用场景 | 读多写少、需要备份的场景 | 数据量大、需扩展存储的场景 |
配合使用:在切片集群中,每个主节点通常会配置从节点,既实现数据分片(集群),又通过主从保证单分片的高可用。
总结:主从库解决单节点的读写压力和备份问题,切片集群解决海量数据的存储和扩展问题,两者结合可构建高可用、高扩展的 Redis 系统。