Redis - 集群
主从复制针对读操作进行并发量和可用性的提高。一个节点作为主节点另外的节点作为从节点。主节点对数据有任何修改都会将修改同步到从节点上主节点和从节点上的数据是一致的。读取从节点就相当于读取主节点。所以可以将客户端的读请求路由到不同的节点以增加redis服务的并发量。配置建立复制可以通过修改配置文件来实现在结尾添加以下字段然后修改从节点的配置目录/dir重启后生效slaveof {masterHost} {masterPort}从节点后面也可以接从节点查看配置相关信息在客户端内执行info replication断开复制在从节点的客户端内执行slaveof no one断开与主节点的复制关系并且成为主节点并不会抛弃原有数据。还可以执行slaveof {newMasterIp} {newMasterPort}实现从节点更换主节点更换主节点的流程断开与旧主节点的复制关系然后与新主节点建立连接删除从节点当前所有数据从新主节点进行复制操作只读默认情况下从节点使用slave-read-onlyyes配置为只读模式由于主节点无法同步从节点的数据所以不建议将其关闭防止出现数据不一致的情况传输延迟主从节点一般部署到不同的机器上不可避免的会存在网络延迟可通过 repl-disable-tcp-nodelay配置项来选择是否开启tcp-nodelay 功能关闭降延迟增带宽主节点产生的命令数据无论大小都会即时发送给从节点。适用于要求强一致性或者同机房部署开启(默认)增延迟降带宽主节点会合并比较小的数据包从而节省带宽发送消息的时间间隔取决于Linux系统内核。适用于弱一致性或者跨机房部署拓扑结构一主一从最简单的主从复制结构从节点提供分散请求以及故障转移支持。当服务器写命令并发量较高且需要持久化时可以只在从节点上开启AOF这样既可以持久化数据又可以降低主节点的压力。当主节点重启时要主动拉取从节点的AOF文件以同步数据一主多从可以实现读写分离主节点专门处理写命令从节点负责处理读命令。当从节点过多时主节点每次修改都需要同步到很多的从节点增加了主节点的压力树形主从结构降低了主节点同步数据的压力但是增加了数据同步的延迟执行流程保存主节点的IP和端口号与主节点建立TCP连接发送ping命令验证是否能从主节点读写数据权限验证如果主节点设置了 requirepass 参数则需要密码验证从节点通过配置 masterauth 参数来设置密码两者相同则验证通过同步数据集首次建立连接时主节点将全部数据发送给从节点命令持续复制当从节点复制了主节点所有的数据之后针对修改命令主节点会持续将命令发送给从节点数据同步psync当主节点和从节点建立连接后从节点自动执行 PSYNC replicationid offset以从主节点拉取数据replicationid/replid (复制id)主节点生成的复制id从节点晋升称为主节点也会生成统一节点重启前后的replid不一致这里有两个参数一般情况下master-replid保存的是主节点的replid。当主从节点通信出现网络抖动从节点判断主节点挂了。此时从节点变为主节点并为自己生成一个replid保存到master-replid将原来主节点的replid保存到master-replid2。当后续网络恢复从节点可以根据master-replid2再次找到主节点主从节点只是网络通信异常主节点没有重启所以replid不改变offset (偏移量)主节点的offset处理完写命令后将写命令的字节长度累加到offset保存到master_repl_offset从节点的offset表示从节点的数据同步到哪了从节点接收到主节点的命令后就会将字长累加到offset保存到slave_repl_offset中。从节点每秒钟会给主节点上报自身的偏移量当主从偏移量一致表示主从数据同步全量复制当从节点首次与主节点进行数据同步或者主节点不方便进行部分复制时进行全量复制从节点发送psync命令给主节点进行数据同步由于是第一次进行复制从节点没有主节点的运行id和 偏移量所以发送psync ? -1主节点根据命令解析出要进行全量复制回复FULLRESYNC响应从节点对主节点的信息进行保存主节点执行bgsave进行RDB文件持久化主节点发送RDB文件给从节点从节点保存RDB数据到本地硬盘从节点清空自身原有的旧数据从节点加载RDB文件主节点将生成RDB生成阶段执行的写命令写入缓冲区从节点加载完RDB文件之后主节点将缓冲区内的命令发送给从节点。从节点直接在内存中执行这些命令执行bgrewrite操作 得到最近的AOF文件无磁盘复制默认情况下是主节点将RDB文件保存到磁盘中然后再把磁盘上的RDB文件通过网络发送给从节点。无磁盘复制下主节点不会生成RDB文件到磁盘中而是直接把生成的RDB数据通过网络发送给从节点。这样就节省了一系列IO操作的开销部分复制从节点之前连接过主节点并且从节点已经保存了绝大部分数据主从节点之间出现网络中断时如果超过repl-timeout主节点会认为从节点故障并终止连接主从连接断开的期间主节点正常接收数据并将这些数据暂存到复制积压缓冲区中主从节点网络恢复从节点将之前保存的replicationId和offset作为psync的参数发送给主节点请求进行部分复制replicationId与主节点相同则进行部分复制否则进行全量复制根据offset判断从节点未同步数据的进度是否在复制积压缓冲区内如果在则进行部分复制否则进行全量复制根据offset去积压缓冲区内查找合适的数据并响应CONTINUE给从节点主节点将需要进行同步的数据发送给从节点复制积压缓冲区复制积压缓冲区是保存在主节点上一个固定长度的队列当主节点连接从节点时创建主节点不仅会将命令发送给从节点还会写入复制积压缓冲区实时复制主从节点通过TCP长连接的方式源源不断的将指令同步给从节点从节点会根据这些请求来同时修改自身的数据从而保持主从节点的数据一致性。这样的长连接通过心跳包维持连接状态主节点每隔10s对从节点发送ping命令判断从节点的存活性和连接状态从节点每隔1s向主节点上报自身当前的复制偏移量如果主节点发现从节点通信延迟超过repl-timeout则判定从节点下线。此时断开复制客户端连接从节点恢复连接之后心跳机制继续进行哨兵哨兵节点单独的redis-sentinel进程不负责存储数据只是对其他redis-server进程起到监控的效果。当主节点故障时哨兵节点能够自动完成故障发现和故障转移并通知应用方以实现高可用原理执行流程运行多个redis-sentinel进程这若干个哨兵进程会与主从节点建立TCP长连接定期发送心跳包来判断节点是否正常运行哨兵节点发现主节点故障(主观下线)并与其他哨兵节点达成共识(客观下线)。主要为了防止网络抖动导致的心跳包丢失主观下线单个哨兵节点判断主节点宕机客观下线哨兵集群中半数以上节点认为主节点下线哨兵节点之间通过Raft算法选出一个节点负责故障转移工作故障转移从从节点中选择一个作为主节点(执行slaveof no one)其他节点同步到新的主节点最后通知客户端告知新的主节点是谁后续更新操作会针对新的主节点进行操作核心功能监控哨兵节点定期检测主从节点是否可用故障转移实现从节点晋升为主节点并更新主从关系通知哨兵节点将故障转移结果通知给应用方新主节点选取原则优先级每个redis数据节点都会在配置文件中设置一个优先级优先级最高的从节点成为主节点offset从主节点上同步数据最多的从节点runidrunid是为每个redis节点生成随机生成的一串数字小的成为主节点配置修改sentinel.conf文件bind 0.0.0.0 port 26379 sentinel monitor 主节点名 主节点ip 主节点端口 法定票数 sentinel down-after-milliseconds 主节点名 毫秒数sentinel monitor 主节点名 主节点ip 主节点端口 法定票数主节点名哨兵内部自己起的名字法定票数为防止哨兵节点自己出现网络问题导致误判主节点宕机使用投票的方式来确定主节点是否宕机当多个哨兵都认为主节点宕机票数 法定票数才正式判定主节点挂了集群引入多台redis服务器每台服务器存储一部分数据以此增加整体内存容量数据分片算法解决数据路由到哪个数据分片的问题哈希求余将集群中的分片从0开始编号针对给定的key先计算哈希值MD5算法然后对集群中master节点的个数进行求余根据余数来判断路由到哪个数据分片优点简单高效数据分配均匀问题当集群需要扩容或者缩容时原有求余方式改变大量的key需要重新映射涉及到大量的数据搬运一致性哈希算法将0-2^32-1个数据空间映射到一个圆环上圆环顺时针增长每个分片管理一段数字并规定管理区域为某个分片起点顺时针到下一个分片的起点。假定有一个key计算出的哈希值为H根据H在圆环中对应的位置计算出映射到的数据分片假设现在要扩容为四台机器原有分片的位置不动只需要新安排一个分片即可这里将二号分片的一部分分给的新的分片搬运数据时只需要搬运二号分片的一部分数据优缺点解决了哈希求余算法造成的扩容时大量数据搬运的问题但是有引入了数据无法均匀映射的新问题哈希槽分区算法redis采用的分区算法解决了搬运成本高和数据分配不均匀的问题。将整个哈希值映射到16384个槽位上将这些槽位均匀分配给每个分片每个分片记录自己所持有的分片。每个key先对16384取余然后根据余数判断路由到哪个分片。每个分片都持有一个16384bit的位图上面标记了对应分片所持有哪些槽位hash_slot crc16(key) % 16384分片规则可以灵活指定每个数据分片所持有的槽数可以是连续的也可以是离散的。当进行扩容时可以把每个分片所持有的槽位各拿出一点分给新的槽位实际使用时只需要设置每个分片应持有多少槽位Redis会自动完成槽位分配以及对应key的搬运工作配置集群redis-cli --cluster create 各个节点的地址 --cluster-replicas 每个主节点的从节点个数故障转移当集群中某个分片的主节点宕机集群能够自动对问题进行处理故障判定集群中的所有节点都会周期性的使用心跳包进行通信心跳包中包含了集群的一些配置信息每个节点每秒钟都会给一些随机的节点发送ping包。当节点A给节点B发送ping包B不能如期回应时A首先会尝试重置和B的TCP连接。如果还连接失败A就会把B设置为PFAIL(主观下线)状态当A判定B为PFAIL之后会通过redis内置的Gossip协议和其他节点确认B的状态每个节点都会维护一张自己的下线列表此时如果超过一半的主节点都认为B下线那么A就将B标记为FAIL(客观下线)当某个分片的所有主从节点全部宕机或者某个分片的主节点宕机但是没有从节点那么整个集群都会宕机故障转移主节点宕机时将从节点提升为主节点继续给整个redis集群提供支持只有从节点和主节点之间通信间隔在一定阈值内的从节点才能参与竞选主节点主要是防止主从节点的数据差异过大参与竞选的节点会先休眠一段时间休眠时间 500ms 基础时间 [0, 500ms] 随机 时间 排名 * 1000msoffset越大排名越小先苏醒的节点会通知其他节点对其进行投票只有主节点才能投票当收到的票数超过主节点数的一半时这个节点就会晋升为主节点执行slaveof no one。数据分片内的其他节点更改主节点新的主节点向集群同步信息以便其他节点更新自己保存的集群结构信息集群扩容将新的主节点加入集群加入后自动成为主节点redis-cli --cluster add-node 新节点的地址 集群中的任意节点地址重新分配 slots搬运key时大部分key不需要搬运。这些不需要搬运的key可以正常访问需要搬运的key无法访问redis-cli --cluster reshard 集群中的任意节点地址给新的主节点添加从节点redis-cli --cluster add-node 新节点的地址 集群中的任意节点地址 --cluster-slave --cluster-master-id 主节点id访问集群JedisClusterSetHostAndPortnodesnewHashSet();nodes.add(newHostAndPort(ip,port));try(JedisClusterjedisClusternewJedisCluster(nodes)){...}Spring更改配置文件spring:redis:cluster:nodes:-ip:port...lettuce:cluster:refresh:adaptive:period:lettuce配置, 目的是自动刷新集群的拓扑结构. 当集群中有节点宕机/加入新节点之后, 代码能够自动感知到集群的变化

相关新闻

5款颠覆认知的免费效率工具实测与技巧

5款颠覆认知的免费效率工具实测与技巧

1. 项目概述 作为一名长期关注效率工具的数字生活博主,我最近在海外知名问答社区发现了一篇获得15k高赞的帖子,主题是推荐5款"离谱好用"的免费软件。这个标题立刻吸引了我的注意——什么样的免费工具能获得如此高的评价?经过实际测…

2026/9/23 5:23:16 阅读更多 →
多 Agent 协作与动态切换:4 种协作模式 + 切换机制 + 选型决策

多 Agent 协作与动态切换:4 种协作模式 + 切换机制 + 选型决策

大家好,我是程序员小策。 多 Agent 该怎么协作? Supervisor、Swarm、Handoff 这几个词到底什么区别? 什么场景该用哪种?动态切换又该怎么设计? 一、多 Agent 协作的核心问题:责任分配 状态流转 [问题定…

2026/9/22 11:54:38 阅读更多 →
易飞ERP和金蝶K3在处理多层委外生产时,哪个更稳定好用?

易飞ERP和金蝶K3在处理多层委外生产时,哪个更稳定好用?

在当今竞争激烈的制造业环境中,多层委外生产已成为众多中小型制造企业提升产能、降低成本、聚焦核心竞争力的普遍策略。然而,这种看似灵活的生产模式,却给企业的内部管理带来了前所未有的复杂性。从物料清单(BOM)的嵌套…

2026/9/22 3:47:07 阅读更多 →

最新新闻

腹部CT五器官分割:FCN-8s实战指南与避坑手册

腹部CT五器官分割:FCN-8s实战指南与避坑手册

简介:本资源是一套基于全卷积网络(FCN)实现腹部多脏器五类语义分割的完整实战项目,面向医学图像分析初学者与深度学习实践者,解决腹部CT影像中肝脏、脾脏、肾脏、胰腺及胃等器官的像素级精准分割问题。压缩包共1025个文…

2026/9/24 23:41:30 阅读更多 →
OpenClaw v0.5.0 QQ插件:全媒体消息与精细化权限控制实战

OpenClaw v0.5.0 QQ插件:全媒体消息与精细化权限控制实战

OpenClaw QQ插件发到v0.5.0了,这次带上了全媒体消息和精细化权限控制。标题里“非机器人”三个字,我觉得是整篇最该聊清楚的地方——很多人一听“QQ插件”,第一反应是申请个QQ机器人接口,实际上这条路在自托管AI Agent的场景里远不…

2026/9/24 23:41:30 阅读更多 →
I2C总线物理层与多主仲裁:从开漏输出到RTL实现的深度避坑指南

I2C总线物理层与多主仲裁:从开漏输出到RTL实现的深度避坑指南

I2C这东西,刚入行的时候觉得它简单得不行——两根线,一根时钟一根数据,挂一堆从设备,地址一喊谁应答谁说话,能有多难?结果真到了调试现场,波形抓出来一看,上升沿软塌塌像条抛物线&am…

2026/9/24 23:41:29 阅读更多 →
Windows图标转换:从PNG到专业.ico的完整指南

Windows图标转换:从PNG到专业.ico的完整指南

1. 项目概述:一张图到.ico文件,到底在解决什么问题?“怎么把图片转换成ico图标文件?”——这句提问背后藏着的,不是单纯的技术操作,而是一整套Windows生态下的视觉一致性需求。我做桌面应用开发、系统工具打…

2026/9/24 23:41:29 阅读更多 →
Phoenix Analytics SQL:面向 Agent 的只读 SQL 分析接口设计与实现

Phoenix Analytics SQL:面向 Agent 的只读 SQL 分析接口设计与实现

可观测性AI 评测LLMOpsAI 应用人工智能 【免费下载链接】phoenix AI Observability & Evaluation 项目地址: https://gitcode.com/gh_mirrors/phoenix13/phoenix 点击查看 免费下载 导读 Phoenix 通过 GraphQL 与 REST API 对外暴露数据,但这些 AP…

2026/9/24 23:41:29 阅读更多 →
组织级AI Coding落地实践:从个人提效到系统化生产力

组织级AI Coding落地实践:从个人提效到系统化生产力

1. 先说结论:个人提效和組織提效,根本不是一回事AI Coding 这个话题,最近一年几乎被聊烂了。随便打开一个技术社区,都能看到"某某用 AI 一天写完一个模块""某某靠提示词把开发效率翻了三倍"之类的帖子。但我在…

2026/9/24 23:40:29 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →