当前位置: 首页 > news >正文

Redis 集群:连锁银行的 “多网点智能协作系统”

目录

一、集群组建:网点 “握手结盟”

二、槽位分片:网点 “划分服务区域”

三、槽位指派:网点 “认领服务区域”

四、客户端访问:“自动找对网点”

五、扩缩容:网点 “动态调整服务区域”

六、高可用:“网点故障自动换班”

七、节点通信与故障检测:“网点间互相查岗”

八、与主从、哨兵的衔接:集群的 “进阶协作”

九、总结:集群的 “连锁银行哲学”


如果把 Redis 主从、哨兵比作 “单银行的总 - 分公司 + 安保团队”,那Redis 集群就是 “连锁银行的多网点协作体系”—— 多家银行网点(集群节点)分工存储客户账户,通过 “区域划分(槽位 slot)” 保证每个账户有专属网点,同时支持故障转移、动态扩缩容。

一、集群组建:网点 “握手结盟”

连锁银行的各个独立网点(初始独立的 Redis 节点),需要 “握手结盟” 才能组成集群。比如有 3 个网点(端口 7000、7001、7002),7000 网点向 7001、7002 发 “结盟请求(CLUSTER MEET命令)”,过程像

  1. 7000 网点(节点 A)给 7001 网点(节点 B)发 “结盟信(MEET 消息)”,声明 “我是 7000,想和你结盟”;

  2. 7001 网点收到信,给 7000 回 “收到结盟信(PONG 消息)”;

  3. 7000 再回 “确认收到你的回复(PING 消息)”,双方 “握手成功”,加入同一集群。
    对应 Redis 节点通过CLUSTER MEET建立连接,互相同步 “集群节点列表(clusterState.nodes字典)”,记录所有结盟网点。

二、槽位分片:网点 “划分服务区域”

连锁银行要给每个网点划分 “服务区域”,保证每个客户账户(键)都属于某一区域。Redis 集群把 “账户区域” 抽象为16384 个槽位(slot),用算法给每个账户(键)分配槽位:

  • 计算方式:槽位 = CRC16(账户名) & 16383(将账户名哈希后,取 0~16383 的编号,确保每个键对应唯一槽位)。

  • 区域分配:比如 7000 网点负责 “0~5000 号槽位”,7001 负责 “5001~10000 号槽位”,7002 负责 “10001~16383 号槽位”。

        客户 “张三” 的账户名哈希后对应槽位 10086,属于 7002 网点的 “10001~16383 号区域”,因此 7002 网点负责处理张三的存款、取款。

三、槽位指派:网点 “认领服务区域”

每个网点要 “认领自己的服务区域(槽位)”,通过CLUSTER ADDSLOTS命令声明。比如 7000 网点执行CLUSTER ADDSLOTS 0 ... 5000,表示 “我负责 0 到 5000 号槽位”。

  • 节点内部记录:每个节点用  二进制位数组(slots数组)标记负责的槽位(如槽位 0 对应数组第 0 位,值为 1 表示 “该槽位归我管”)。

  • 集群全局记录:整个集群的clusterState.slots数组,每个槽位对应 “负责节点的指针”(如槽位 10086 的指针指向 7002 节点,所有节点都能查这张 “全局区域分配表”)。

        银行总部的 “区域分配表” 里,10086 号区域的负责人是 7002 网点,所有网点都能通过这张表,知道每个区域该找哪家网点。

四、客户端访问:“自动找对网点”

客户(客户端)要办业务(执行命令)时,流程像:

  1. 客户先找任意一个网点(比如 7000),说 “我要给张三存钱”;

  2. 7000 网点计算张三的槽位是 10086,发现 “这不是我的区域”,就告诉客户:“张三的业务归 7002 网点,你去127.0.0.1:7002办理(返回MOVED 10086 127.0.0.1:7002)”;

  3. 客户转向 7002 网点,重新发起请求,成功办理。

        这就是 Redis 的MOVED重定向机制,保证客户端最终能找到 “负责该键的节点”。

五、扩缩容:网点 “动态调整服务区域”

如果连锁银行要开新网点(如 7003),需要重新分片(调整槽位分配),由 “集群管理工具(redis-trib)” 自动完成,过程类似:

  1. 新网点 7003 向目标网点(比如 7002)声明 “我要接管部分区域(槽位)”;

  2. 7002 网点把 “自己负责的部分槽位(如 12000~13000)” 的账户,原子迁移到 7003(确保迁移过程中业务不中断);

  3. 迁移完成后,集群更新 “全局区域分配表”,让 12000~13000 号槽位的负责人变成 7003。

        银行把 7002 网点的 “12000~13000 号区域客户” 整体转移到新网点 7003,客户后续业务直接找 7003,无需感知迁移。

六、高可用:“网点故障自动换班”

集群中的每个网点有 “主网点(master)”“备用网点(slave)”。比如 7000 主网点有 7004、7005 两个备用网点:

  • 若 7000 主网点故障,备用网点会竞选 “新主网点”;

  • 当选的新主网点(比如 7004)会 “接管原主网点的所有槽位”,继续处理对应区域的业务;

  • 故障主网点恢复后,会变成新主网点的 “备用网点”。

        7000 网点临时停业,7004 网点自动升级为 “新主网点”,接管 7000 的所有区域客户,客户办业务时无感知。

七、节点通信与故障检测:“网点间互相查岗”

集群节点之间每秒互相发送 PING/PONG 消息,检测对方是否在线:

  • 若某网点长时间不回 PONG,会被标记为 “疑似下线(PFAIL)”;

  • 超过半数主网点都认为该网点 “疑似下线”,则标记为 “已下线(FAIL)”,触发故障转移。

        银行网点互相打电话查岗,若多数网点都联系不上某网点,就判定它 “停业了”,立刻启动备用网点。

八、与主从、哨兵的衔接:集群的 “进阶协作”

  • 集群的 “主从节点” 复用了主从复制的同步逻辑(从节点复制主节点数据);

  • 集群的 “故障转移” 比哨兵更自动化(无需单独哨兵进程,节点间自主协商选举新主);

  • 槽位分片是集群独有的特性,解决了 “单主节点内存 / 写能力受限” 的问题(主从、哨兵仅解决 “高可用”,不解决 “数据分片”)。

九、总结:集群的 “连锁银行哲学”

Redis 集群就像 “智能连锁银行”:

  • 槽位分片实现 “多网点分工存储”,突破单节点的内存、性能瓶颈;

  • 节点握手组成 “协作网络”,共享全局槽位分配;

  • 主从 + 故障转移保证 “单点故障不影响业务”;

  • 动态重分片支持 “网点(节点)的扩缩容”。

这套机制让 Redis 能支撑更大规模的业务(海量数据、高并发),同时保持高可用,如同连锁银行能服务更多客户,且某一网点停业不影响整体服务。

http://www.xdnf.cn/news/1471699.html

相关文章:

  • 2025 IT行业含金量超高的8大证书推荐
  • PAT 1096 Consecutive Factors
  • 十大常用算法(待更新)
  • 【QT 5.12.12 打包-Windows 平台下】
  • GitHub每日最火火火项目(9.5)
  • 【Agent开发】部署IndexTTS
  • 1.进程与线程:区别、通信方式、同步方式
  • 怎么告别信息收集难题?
  • 使用海康威视 SDK 实现软触发拍照(C语言完整示例 + 中文注释)
  • 不上融资、不炒概念,它却成了全球AI“全明星”中国独苗!
  • 实战记录:H3C路由器IS-IS Level-1邻居建立与路由发布
  • 智慧公厕系统使用说明书,布线规范全解析
  • 深入理解 APPLY:写出更可读、更高性能的相关子查询
  • 原子工程用AC6编译不过问题
  • Linux ARM64 内核/用户虚拟空间地址映射
  • GMT——用于人形全身控制的通用运动跟踪:两阶段师生训练框架下,全身基于单一策略,且自适应采样、MoE架构
  • 【LLM的后训练之对齐人类篇】SFT、RLHF(RM+PPO)、DPO task09
  • Linux应用(2)——标准/目录IO
  • DPO算法
  • C++中虚函数与构造/析构函数的深度解析
  • 标注格式转换csv转xml
  • 【Hot100】回溯
  • 遇到“指责型人格”别硬碰硬!3个反拿捏技巧,让他从挑刺变闭嘴
  • 【前端教程】JavaScript DOM 操作实战案例详解
  • javafx笔记
  • 有序数组,距离目标最近的k个数 二分查找
  • 2025 年高教社杯全国大学生数学建模竞赛C 题 NIPT 的时点选择与胎儿的异常判定详解(一)
  • 数据库基础知识——聚合函数、分组查询
  • ResNet 迁移学习---加速深度学习模型训练
  • 瑞芯微RV1126目标识别算法Yolov8的部署应用