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. 新餐厅加入:"
阅读全文