1.再谈Redis三种集群模式:主从模式、主主哨兵模式和Cluster模式
2.redis的从源哨兵模式第一次主从切换成功,再次进行主从切换就不
3.详解Redis 主ä»å¤å¶å主ä»å¤å¶åç
4.Redis 主从复制 - 源码梳理
5.Redis数据持久化机制(备份恢复)、缓存淘汰策略、实现主从同步原理、主主常见规范与优化详解
6.ç®ä»redisä¹ä¸»ä»å¤å¶
再谈Redis三种集群模式:主从模式、从源哨兵模式和Cluster模式
在Redis的实现alive源码世界里,有三种集群模式供开发者选择:主从模式、主主哨兵模式和Cluster模式。从源每种模式都有其适用场景和特性。实现
初始的主主主从模式通过主节点写入和从节点读取来构建,虽然基础,从源但在故障恢复上效率较低。实现一旦主节点宕机,主主需人工干预切换。从源哨兵模式则在此基础上提升,实现通过哨兵集群监控主从节点,实现故障自动恢复,提高系统的稳定性和可用性。然而,哨兵模式受限于单节点性能,不适合大规模处理。
Redis Cluster在3.x版本后引入,通过数据分片和多节点扩展,显著提高内存利用率和写入性能,图片导航站源码特别适用于高负载和大规模数据处理。它采用去中心化的多主多从架构,确保了数据的高可用性和扩展性。
部署Redis时,需注意配置和节点设置,如主从节点配置、哨兵配置和Cluster模式的节点分配。在测试阶段,通过客户端和Springboot工程操作,验证数据的正确同步和读写分离。
哨兵模式和Cluster模式都提供了高可用性和自动故障转移,但各有局限,如哨兵的在线扩容复杂,而Cluster模式对节点配置要求较高。选择哪种模式,需根据具体业务需求和性能指标来决定。
总的来说,理解并熟练运用这三种模式,能更好地优化Redis集群的性能和稳定性,适应不同规模和复杂度的应用场景。
redis的哨兵模式第一次主从切换成功,再次进行主从切换就不
Redis的failover命令,提供手动触发主从切换功能。此操作尤其在主服务器需要进行维护或升级时尤为重要。小兵别打我源码通过执行failover命令,可实现主节点与从节点的角色转换。一旦升级完成,执行切回操作恢复原主节点状态。
基本语法与命令使用范例
Redis源码版本:6.2.5
主从切换的核心流程包括:执行failover命令启动切换(设置标记位),接着定期检测从节点的数据同步情况,直至同步完成。同步后,旧主节点与准新主节点建立连接并握手,随后发送psync failover指令,实现准新主节点的角色转换成为新主节点。
主从切换涉及的关键变量
深入理解主从切换前,首先要熟悉与切换相关的变量。这些变量在具体场景分析中起到关键作用。
failover命令处理调用链
综上所述,从节点完成数据同步的检测调用链是主从切换流程中不可或缺的部分。
主从切换执行过程
深入调用链分析,能够全面掌握主从切换的执行过程。
从节点转变为主节点
当准新主节点接收到psync failover指令,进行合法性检查(replid一致性),若合法一致,则调用replicationUnsetMaster断开与当前主节点的连接,解除副本状态,apk怎么得到源码从而实现角色转换成为新主节点。
详解Redis 主ä»å¤å¶å主ä»å¤å¶åç
Redisæ¯ä¸ä¸ªå¼æºç使ç¨ANSI Cè¯è¨ç¼åãæ¯æç½ç»ãå¯åºäºå å亦å¯æä¹ åçæ¥å¿åãKey-Valueæ°æ®åºï¼å¹¶æä¾å¤ç§è¯è¨çAPIãä»å¹´3ææ¥èµ·ï¼Redisçå¼åå·¥ä½ç±VMware主æãä»å¹´5æå¼å§ï¼Redisçå¼åç±Pivotalèµå©ã
æ¦è¿°
å¨ç°æä¼ä¸ä¸%å ¬å¸å¤§é¨å使ç¨çæ¯redisåæºæå¡ï¼å¨å®é çåºæ¯å½ä¸åä¸èç¹çredis容æé¢ä¸´é£é©ã
2ã容éç¶é¢ãå½æ们æéæ±éè¦æ©å®¹ Redis å åæ¶ï¼ä» G çå ååå° Gï¼åæºè¯å®æ¯æ»¡è¶³ä¸äºãå½ç¶ï¼ä½ å¯ä»¥éæ°ä¹°ä¸ª G çæ°æºå¨ã
解å³åæ³
è¦å®ç°åå¸å¼æ°æ®åºçæ´å¤§çåå¨å®¹éåæ¿åé«å¹¶å访é®éï¼æ们ä¼å°åæ¥éä¸å¼æ°æ®åºçæ°æ®åå«åå¨å°å ¶ä»å¤ä¸ªç½ç»èç¹ä¸ã
Redis 为äºè§£å³è¿ä¸ªåä¸èç¹çé®é¢ï¼ä¹ä¼ææ°æ®å¤å¶å¤ä¸ªå¯æ¬é¨ç½²å°å ¶ä»èç¹ä¸è¿è¡å¤å¶ï¼å®ç° Redisçé«å¯ç¨ï¼å®ç°å¯¹æ°æ®çåä½å¤ä»½ï¼ä»èä¿è¯æ°æ®åæå¡çé«å¯ç¨ã
主ä»å¤å¶
ä»ä¹æ¯ä¸»ä»å¤å¶
主ä»å¤å¶ï¼æ¯æå°ä¸å°Redisæå¡å¨çæ°æ®ï¼å¤å¶å°å ¶ä»çRedisæå¡å¨ãåè 称为主èç¹(master)ï¼åè 称为ä»èç¹(slave)ï¼æ°æ®çå¤å¶æ¯ååçï¼åªè½ç±ä¸»èç¹å°ä»èç¹ã
é»è®¤æ åµä¸ï¼æ¯å°Redisæå¡å¨é½æ¯ä¸»èç¹ï¼ä¸ä¸ä¸ªä¸»èç¹å¯ä»¥æå¤ä¸ªä»èç¹(æ没æä»èç¹)ï¼ä½ä¸ä¸ªä»èç¹åªè½æä¸ä¸ªä¸»èç¹ã
主ä»å¤å¶çä½ç¨
1ãæ°æ®åä½ï¼ä¸»ä»å¤å¶å®ç°äºæ°æ®ççå¤ä»½ï¼æ¯æä¹ åä¹å¤çä¸ç§æ°æ®åä½æ¹å¼ã
2ãæ éæ¢å¤ï¼å½ä¸»èç¹åºç°é®é¢æ¶ï¼å¯ä»¥ç±ä»èç¹æä¾æå¡ï¼å®ç°å¿«éçæ éæ¢å¤ï¼å®é ä¸æ¯ä¸ç§æå¡çåä½ã
3ãè´è½½åè¡¡ï¼å¨ä¸»ä»å¤å¶çåºç¡ä¸ï¼é å读åå离ï¼å¯ä»¥ç±ä¸»èç¹æä¾åæå¡ï¼ç±ä»èç¹æä¾è¯»æå¡ï¼å³åRedisæ°æ®æ¶åºç¨è¿æ¥ä¸»èç¹ï¼è¯»Redisæ°æ®æ¶åºç¨è¿æ¥ä»èç¹ï¼ï¼åæ æå¡å¨è´è½½ï¼å°¤å ¶æ¯å¨åå°è¯»å¤çåºæ¯ä¸ï¼éè¿å¤ä¸ªä»èç¹åæ 读è´è½½ï¼å¯ä»¥å¤§å¤§æé«Redisæå¡å¨ç并åéã
4ã读åå离ï¼å¯ä»¥ç¨äºå®ç°è¯»åå离ï¼ä¸»åºåãä»åºè¯»ï¼è¯»åå离ä¸ä» å¯ä»¥æé«æå¡å¨çè´è½½è½åï¼åæ¶å¯æ ¹æ®éæ±çååï¼æ¹åä»åºçæ°éã
5ãé«å¯ç¨åºç³ï¼é¤äºä¸è¿°ä½ç¨ä»¥å¤ï¼ä¸»ä»å¤å¶è¿æ¯å¨å µåé群è½å¤å®æ½çåºç¡ï¼å æ¤è¯´ä¸»ä»å¤å¶æ¯Redisé«å¯ç¨çåºç¡ã
主ä»å¤å¶å¯ç¨
ä»èç¹å¼å¯ä¸»ä»å¤å¶ï¼æ3ç§æ¹å¼ï¼
1ãé ç½®æ件ï¼å¨ä»æå¡å¨çé ç½®æ件ä¸å å ¥ slaveof<masterip><masterport>ã
2ãå¯å¨å½ä»¤ï¼redis-serverå¯å¨å½ä»¤åå å ¥ --slaveof<masterip><masterport>ã
3ã客æ·ç«¯å½ä»¤ï¼Redisæå¡å¨å¯å¨åï¼ç´æ¥éè¿å®¢æ·ç«¯æ§è¡å½ä»¤ slaveof<masterip><masterport>ï¼å该Rediså®ä¾æ为ä»èç¹ã
éè¿ info replication å½ä»¤å¯ä»¥çå°å¤å¶çä¸äºä¿¡æ¯ã
主ä»å¤å¶åç
主ä»å¤å¶è¿ç¨å¤§ä½å¯ä»¥å为3个é¶æ®µï¼è¿æ¥å»ºç«é¶æ®µï¼å³åå¤é¶æ®µï¼ãæ°æ®åæ¥é¶æ®µãå½ä»¤ä¼ æé¶æ®µã
å¨ä»èç¹æ§è¡ slaveof å½ä»¤åï¼å¤å¶è¿ç¨ä¾¿å¼å§è¿ä½ï¼ä¸é¢å¾ç¤ºå¯ä»¥çåºå¤å¶è¿ç¨å¤§è´å为6个è¿ç¨ã
主ä»é ç½®ä¹åçæ¥å¿è®°å½ä¹å¯ä»¥çåºè¿ä¸ªæµç¨ã
1ãä¿å主èç¹ï¼masterï¼ä¿¡æ¯
æ§è¡ slaveof å Redis ä¼æå°å¦ä¸æ¥å¿ï¼
2ãä»èç¹ä¸ä¸»èç¹å»ºç«ç½ç»è¿æ¥
ä»èç¹ï¼slaveï¼å é¨éè¿æ¯ç§è¿è¡çå®æ¶ä»»å¡ç»´æ¤å¤å¶ç¸å ³é»è¾ï¼å½å®æ¶ä»»å¡åç°åå¨æ°ç主èç¹åï¼ä¼å°è¯ä¸è¯¥èç¹å»ºç«ç½ç»è¿æ¥ã
ä»èç¹ä¸ä¸»èç¹å»ºç«ç½ç»è¿æ¥ã
ä»èç¹ä¼å»ºç«ä¸ä¸ª socket å¥æ¥åï¼ä»èç¹å»ºç«äºä¸ä¸ªç«¯å£ä¸ºçå¥æ¥åï¼ä¸é¨ç¨äºæ¥å主èç¹åéçå¤å¶å½ä»¤ãä»èç¹è¿æ¥æååæå°å¦ä¸æ¥å¿ï¼
å¦æä»èç¹æ æ³å»ºç«è¿æ¥ï¼å®æ¶ä»»å¡ä¼æ ééè¯ç´å°è¿æ¥æåæè æ§è¡ slaveofnoone åæ¶å¤å¶ã
å ³äºè¿æ¥å¤±è´¥ï¼å¯ä»¥å¨ä»èç¹æ§è¡ info replication æ¥ç master_link_down_since_seconds ææ ï¼å®ä¼è®°å½ä¸ä¸»èç¹è¿æ¥å¤±è´¥çç³»ç»æ¶é´ãä»èç¹è¿æ¥ä¸»èç¹å¤±è´¥æ¶ä¹ä¼æ¯ç§æå°å¦ä¸æ¥å¿ï¼æ¹ä¾¿åç°é®é¢ï¼
3ãåé ping å½ä»¤
è¿æ¥å»ºç«æååä»èç¹åé ping 请æ±è¿è¡é¦æ¬¡éä¿¡ï¼ ping 请æ±ä¸»è¦ç®çå¦ä¸ï¼
å¦æåé ping å½ä»¤åï¼ä»èç¹æ²¡ææ¶å°ä¸»èç¹ç pong åå¤æè è¶ æ¶ï¼æ¯å¦ç½ç»è¶ æ¶æè 主èç¹æ£å¨é»å¡æ æ³ååºå½ä»¤ï¼ä»èç¹ä¼æå¼å¤å¶è¿æ¥ï¼ä¸æ¬¡å®æ¶ä»»å¡ä¼åèµ·éè¿ã
ä»èç¹åéç ping å½ä»¤æåè¿åï¼Redis æå°å¦ä¸æ¥å¿ï¼å¹¶ç»§ç»åç»å¤å¶æµç¨ï¼
4ãæééªè¯
å¦æ主èç¹è®¾ç½®äº requirepass åæ°ï¼åéè¦å¯ç éªè¯ï¼ä»èç¹å¿ é¡»é ç½® masterauth åæ°ä¿è¯ä¸ä¸»èç¹ç¸åçå¯ç æè½éè¿éªè¯ãå¦æéªè¯å¤±è´¥å¤å¶å°ç»æ¢ï¼ä»èç¹éæ°åèµ·å¤å¶æµç¨ã
5ãåæ¥æ°æ®é
主ä»å¤å¶è¿æ¥æ£å¸¸éä¿¡åï¼å¯¹äºé¦æ¬¡å»ºç«å¤å¶çåºæ¯ï¼ä¸»èç¹ä¼æææçæ°æ®å ¨é¨åéç»ä»èç¹ï¼è¿é¨åæä½æ¯èæ¶æé¿çæ¥éª¤ã
6ãå½ä»¤æç»å¤å¶
å½ä¸»èç¹æå½åçæ°æ®åæ¥ç»ä»èç¹åï¼ä¾¿å®æäºå¤å¶ç建ç«æµç¨ãæ¥ä¸æ¥ä¸»èç¹ä¼æç»å°æåå½ä»¤åéç»ä»èç¹ï¼ä¿è¯ä¸»ä»æ°æ®ä¸è´æ§ã
ä½è ï¼LoyaltyLu
é¾æ¥ï¼/a/
Redis 主从复制 - 源码梳理
本文主要剖析Redis主从复制机制中的核心组件之一——复制积压缓冲区(Replication Buffer),旨在为读者提供一个对Redis复制流程和缓冲区机制深入理解的平台,以下内容仅基于Redis版本7.0.,若读者在使用过程中发现偏差,欢迎指正。
复制积压缓冲区在逻辑上可理解为一个容量最大的位整数,其初始值为1,由offset、master_repl_offset和repl_backlog-histlen三个变量共同决定缓冲区的有效范围。offset表示缓冲区内命令起始位置,master_repl_offset代表结束位置,二者之间的长度由repl_backlog-histlen表示。
每当主节点执行写命令,新生成的积压缓冲区大小增加,同时增加master_repl_offset和repl_backlog-histlen的值,直至达到预设的最大容量(默认为1MB)。一旦所有从节点接收到命令并确认同步无误,缓冲区内过期的命令将被移除,并调整offset和histlen以维持积压区容量的稳定性。
为实现动态分配,复制积压缓冲区被分解成多个block,以链表形式组织。源码是否有后门每个block采用引用计数管理策略,初始值为0,每当增加或删除从节点对block的引用时,计数值相应增减。新生成block时,将master_repl_offset+1设置为block的repl_offset值,并将写入命令拷贝至缓冲区内,与此同时,master_repl_offset和repl_backlog-histlen增加。
通过循环遍历所有从节点,为每个从节点设置ref_repl_buf_node指向当前block或最后一个block,确保主从复制能够准确传递命令。当主节点接收到从节点的连接请求时,将开始填充积压缓冲区。在全量复制阶段,从slave-replstate为WAIT_BGSAVE_START至ONLINE,表示redis从后台进程开始执行到完成RDB文件传输和加载,命令传播至此阶段正式开始。
针对每个从节点,主节点从slave-ref_block_pos开始发送积压缓冲区内的命令,每发送成功,slave-ref_block_pos相应更新。当积压缓冲区超过预设阈值,即复制积压缓冲区中的有效长度超过repl-backlog-size(默认1MB)时,主节点将清除已发送的缓冲区,释放内存。如果主节点写入命令频繁或从节点断线重连时间长,则需合理调整缓冲区大小(推荐值为2 * second * write_size_per_second)以保持增量复制的稳定运行。
当最后一个从节点与主节点的连接断开超过repl-backlog-ttl(默认为秒)时,主节点将释放repl_backlog和复制积压缓冲区以确保资源的有效使用。不过需要注意的是,从节点的释放操作依赖于节点是否可能成为新的主节点,因此在最后处理逻辑上需保持谨慎。
Redis数据持久化机制(备份恢复)、缓存淘汰策略、主从同步原理、常见规范与优化详解
Redis 提供了 RDB 和 AOF 两种持久化方式,其中默认开启的是 RDB 模式。为了开启 AOF 模式,需要手动修改配置文件。RDB 是一种周期性将内存数据以快照形式保存到硬盘的机制,采用二进制压缩存储。而 AOF 以文本日志形式记录每条写入、删除请求,以追加方式写入,写入速度快,文件不易损坏。RDB 优点包括生成多个数据文件,对性能影响小,数据恢复速度快;缺点是可能导致部分数据丢失,且大文件会导致客户端卡顿。AOF 优点为数据丢失风险低,文件读取性能高,支持数据恢复;缺点是文件体积大,会降低 QPS。RDB 适合做冷备,AOF 适合做热备。在生产环境中,通常结合使用 RDB 和 AOF,先用 RDB 进行全量持久化,再用 AOF 进行增量持久化,确保在 Redis 重启时能快速恢复服务状态。对于持久化中 save 和 bgsave 的区别,save 是阻塞方式,直接保存数据,阻塞 Redis 主进程处理请求;而 bgsave 是非阻塞方式,通过 fork 子进程进行持久化,主进程继续处理请求,直到子进程完成并发送信号通知。AOF 重写机制则定期根据内存最新数据生成新 AOF 文件,以减少文件大小并提高性能。混合持久化机制在 Redis 4.0 引入,结合 RDB 和 AOF 的优点,通过在重写时生成 RDB 快照并合并增量修改,提高 Redis 启动速度。数据备份与恢复可以通过手动执行 bgsave 或 bgrewriteaof 指令,将内存数据持久化到硬盘。对于过期键的清除,Redis 提供三种策略:被动删除、主动删除和缓存淘汰策略,后者在内存使用超过 maxmemory 限制时触发。主从同步是 Redis 实现读写分离的基础,包含全量复制与增量复制两种方式。全量复制在从节点首次启动时进行,增量复制则在断开重连后仅同步部分数据,以避免大量数据传输。当主从连接断开后,Redis 会自动重连并自动补充缺少的数据,确保一致性。常见规范包括合理设计 key 命名、优化命令使用(如使用 hscan、sscan、zscan 替代 O(N)命令)、禁用对业务有负面影响的命令(如 keys、flushall)、合理使用 Redis 的多数据库功能及批量操作(如 mget、mset 或 pipeline)以提高效率,避免过多依赖 Redis 事务功能,可使用 Lua 脚本替代。线程池最大连接数设计时需考虑 Redis 的处理能力,合理设置以优化性能。
ç®ä»redisä¹ä¸»ä»å¤å¶
redisçé«å¯é æ§ä½ç°å¨:1.æ°æ®å°½éå°ä¸¢å¤±
2.æå¡å°½éå°ä¸æ
åè ä½ç°å¨AOFæ¥å¿åRDBå¿«ç §çæ°æ®å¯æä¹ åæ段ä¸ï¼èåè æ¯å¢å å¯æ¬çåä½éï¼å³å°ä¸ä»½æ°æ®ä¿åå¨å¤ä¸ªå®ä¾ä¸(å³ä½¿ä¸ä¸ªå®ä¾ææï¼å ¶ä»å®ä¾ä¹è½å¯¹å¤æå¡ï¼ä¹å°±æ¯ä¸»ä»å¤å¶)
å®éªï¼ä¸ä¸»ä¸ä»ï¼
åå¤:ç¸åçredis.confæ件
æ件夹å建:
ç¼åmaster.shåslave.shï¼æ³¨æslave.shä¿®æ¹ç«¯å£ -pæè ä¸å ï¼
å¯å¨master容å¨å¹¶éªè¯
éåºè®°å½å®¹å¨IP
è¿å ¥slaveæ件夹修æ¹redis.conf
è¿è¡slave容å¨å¹¶è¿å ¥æ¥çslaveçå®ä¾æ没ænameé®
æ¥çmasteråslaveæ¥å¿
æ示success
æ ¹æ®masteræ¥å¿æ们çç
1.Ready to accept connectionsï¼Replica ..0.3: asks for synchronization
2.Full resync requested by replica ..0.3:
.
3.RDB: 6 MB of memory used by copy-on-write
è¯è¯å主åºåå ¥æ°æ®
redisç解å³æ¹æ¡å°±æ¯ä½¿ç¨å¢éå¤å¶
å®éª
æ¥çæ¥å¿
æ们çå°ä»åºå®æºéè¿å并没æè¿è¡åä¸æ¬¡çå ¨éå¤å¶ï¼èæ¯å°å¢å åçæ°æ®åç»ä»åºã
å½ä¸»ä»æè¿åï¼ä¸»åºä¼ææé¾æé´æ¶å°çåå½ä»¤åå ¥replication buffer(ä¸é¢ææå°)ï¼åæ¶ä¹ä¼åå ¥repl_backlog_bufferè¿ä¸ªç¼å²åºã
repl_backlog_bufferæ¯ä¸ä¸ªç¯å½¢ç¼å²åº(类似mysqlçredolog)ï¼ä¸»åºè®°å½èªå·±åå°çä½ç½®ï¼ä»åºè®°å½èªå·±è¯»å°çä½ç½®ã
ä»repl_backlog_bufferå移ä½ç½®åºå:
1.åå¼å§ä¸»ä»åºé½ä½äºrepl_backlog_bufferçèµ·å§ä½ç½®
2.主åºä¸ææ¥ååæä½ï¼ä¸»åºçrepl_backlog_bufferä½ç½®åçå移master_repl_offset
3.ä»åºå¤å¶åå½ä»¤ä¹ä¸æå移slave_repl_offset
4.ä»åºæå¼è¿æ¥åéè¿ï¼é¤äºåépsyncå½ä»¤è¿ä¼åéslave_repl_offset
5.主åºè®¡ç®master_repl_offsetåslave_repl_offsetå移差ï¼å¹¶å°æé´çå½ä»¤åéç»ä»åº(set sex 1)
å 为æ¯ç¯å½¢çï¼é£ä¹å满åååå ¥ï¼é£ä¹æå åå ¥repl_backlog_bufferçå°±ä¼è¢«è¦çï¼åºç°ä¸»ä»æ°æ®ä¸ä¸è´çæ åµ
å¦ä½è®¾ç½®é ç½®ä¸çrepl_backlog_sizeå°±æ¾å¾å¾éè¦
-主ä»å¤å¶ç¬¬ä¸æ¬¡éç¨å ¨éå¤å¶å½ä»åºæ°é太å¤ï¼å¦ä½åæ 主åºåå
Redis 哨兵模式 - 源码梳理
本文以Redis 7.0.版本为基准,如有不妥之处,敬请指正。
哨兵模式的代码流程逻辑如下:哨兵节点每秒(主从切换时为1秒)向已知的主节点和从节点发送info命令。接收到主节点的info回复后,解析其中的slave字段信息,进而创建相应的从节点instance。收到从节点的info回复后,解析其中的slave_master_host、slave_master_port、slave_master_link_status、slave_priority、slave_repl_offset、replica_announced等信息(步骤2和sentinelInfoReplyCallback)。
在sentinel.masters的初始数据中,来自于sentinel.conf中的monitor,利用info命令探测主节点及其所属的从节点。通过订阅__sentinel__:hello频道,获取其他哨兵节点的信息。其中,link->act_ping_time表示最早一次未收到回复的ping请求发送时间,收到回复后其会被重置为0。因此,其不为0时,表示有未收到回复的ping请求。link->last_avail_time表示最近一次收到对ping有效回复的时间,link->last_pong_time表示最近一次收到对ping回复(有效和无效)的时间,link->pc_last_activity表示最近一次收到publish的消息,ri->role_reported_time表示最近一次收到info且回复中role相比于上次发生改变的时间。
Raft一致性算法
thesecretlivesofdata.com...