Redis集群是如何实现其复杂原理的?
摘要:Redis集群原理:就像外卖平台的多店铺配送系统 🚚 一、整体比喻:外卖平台如何运作? 想象美团外卖平台: 多个餐厅:每个餐厅负责一部分菜品(数据分片) 配送中心:协调订单分配(集群管理) 骑手网络:互相传递
Redis集群原理:就像外卖平台的多店铺配送系统 🚚
一、整体比喻:外卖平台如何运作?
想象美团外卖平台:
多个餐厅:每个餐厅负责一部分菜品(数据分片)
配送中心:协调订单分配(集群管理)
骑手网络:互相传递信息(节点通信)
备用厨房:主厨病了,副厨顶上(主从复制)
Redis集群就是这样一个"分布式外卖系统"!
二、Redis集群的核心原理
1. 数据分片:每个餐厅只做自己的拿手菜 🍔
# Redis集群把数据分成16384个"菜品槽"(slots)
# 就像把全城分成16384个配送区域
# 假设有3个餐厅(Redis节点):
节点A: 负责槽 0-5460 # 做汉堡薯条
节点B: 负责槽 5461-10922 # 做披萨意面
节点C: 负责槽 10923-16383 # 做中餐
# 用户点"宫保鸡丁" → 系统计算:hash("宫保鸡丁") % 16384 = 12000
# 12000属于中餐区 → 自动派单给节点C(中餐餐厅)
原理:
每个键通过CRC16算法计算哈希值
对16384取模,得到槽位
数据存储到负责该槽的节点
2. 集群架构:餐厅联盟的三种角色 👥
┌─────────────────┐
│ 客户端App │
└────────┬────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 主节点A │ │ 主节点B │ │ 主节点C │
│ (主厨) │ │ (主厨) │ │ (主厨) │
│ 槽0-5460 │ │5461-10922│ │10923-16383│
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ 从节点A1 │ │ 从节点B1 │ │ 从节点C1 │
│ (副厨) │ │ (副厨) │ │ (副厨) │
└─────────┘ └─────────┘ └─────────┘
节点类型:
主节点:存储数据,处理读写请求(主厨)
从节点:复制主节点数据,只读(副厨)
哨兵节点:监控节点健康(餐厅卫生监督员)
3. 节点通信:餐厅经理们的微信群 📱
# 节点间通过Gossip协议通信(就像微信群聊)
# 每个节点都知道其他节点的:槽分配、在线状态、地址
# 通信内容:
1. "我是餐厅A,负责汉堡区,我健康!"
2. "餐厅C好像掉线了?有谁联系得上?"
3. "新开了餐厅D,接手了披萨区一部分"
# Gossip协议特点:
# - 定期广播(每100ms)
# - 最终一致性(消息慢慢传开)
# - 容错性强(几个餐厅掉线不影响)
4. 故障转移:主厨病了,副厨顶上 🚑
场景:主节点A(汉堡主厨)突然心脏病发作(宕机)
流程:
1. 从节点A1发现主厨失联:"主厨10秒没回我消息了!"
2. 向其他餐厅确认:"你们联系得上汉堡主厨吗?"
3. 多数餐厅确认失联:"我们也联系不上"
4. 选举新主厨:所有副厨投票,A1得票最多
5. A1晋升为主厨:"我来接管汉堡区!"
6. 更新微信群名片:A1改为主节点A
技术实现:
# Redis哨兵(Sentinel)监控机制
1. 主观下线(SDOWN):一个哨兵认为主节点不可用
2. 客观下线(ODOWN):超过半数哨兵认为不可用
3. 选举领头哨兵:Raft算法选举
4. 故障转移:领头哨兵选择最合适的从节点升级
# Redis Cluster内置的故障检测
1. 每个节点定期ping其他节点
2. 标记疑似下线(PFAIL)
3. 广播下线信息,其他节点确认
4. 标记为已下线(FAIL)
5. 从节点开始选举
5. 集群扩容:开新分店 🏪
场景:生意太好,要开第四家餐厅(节点D)
流程:
1. 新餐厅加入:"
