前言: 本文参考和Redis相关的课程,主要讲解了Redis面试中经常问的几个问题,比如Redis主从,Redis哨兵, 若文章中有不准确或需要改进的地方,。 先感谢各位大佬在这里先感谢各位大佬。
??个人主页:小威想向诸佬学习 ??大家好,我是小威,一个想和大家一起进步的男人 现状:目前大二,在满意的公司实习
??如果老板在准备面试,可以用实习前用的刷神器。 ??欢迎:这是CSDN,欢迎来到我的博客,我亲爱的老板
牛客部分使用反馈,个人感觉很好,帮我找到了最喜欢的公司,我希望你的合作伙伴也能通过它改善很多???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
以下文本开始
文章目录
-
- ??Redis集群模式
- ??Redis主从架构
-
- ??全量同步(sync)
- ??增量同步(psync)
- ??repl_backlog原理
- ??同步优化优化
- ??全量和增量的区别
- ??Redis哨兵
-
- ??Redis集群监控原理
- ??恢复集群故障
??Redis集群模式
Redis集群模式有三种:。Rdis如果最初使用主从模式作为集群,master停机需要手动配置slave转为master;后来为了在这种模式下,提出了哨兵模式,,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式。
??Redis主从架构
Redis主从模式支持客户端的高并发性。主从模式是三种模式中最简单的。在主从复制中,数据库分为主数据库(master)和从数据库(slave)。其中,,,负责从节点阅读,所有阅读请求都来自节点。 注意主从模式:
1.复制的数据流是单向的,只能从主节点复制到节点。 2., 3.,并且接收主数据库同步过来的数据 4.一个master可以有多个slave,但是一个slave只能对应一个master 5.slave挂了, 6.master挂断后,不影响slave的读,但redis不再提供写作服务,master重启后redis将 7.
假设A,B为两个Redis例如,如果你想让B作为A的节点,你需要在B节点上执行命令:
??全量同步(sync)
一般用于第一次复制场景,Redis早期支持的复制功能只有全部复制,主节点的所有数据一次性发送到节点, 判断依据: :简称replid,是数据集的标记,。。
:偏移量,。slave在完成同步时,还将记录当前同步offset。。
因此slave做数据同步,必须向前master声明自己的,master可以判断哪些数据需要同步。
因为,第一次变成slave,与master建立连接时,发送replid和offset是自己的replid和offset。 master判断发现,我知道要做全同步了。
- slave节点要求增量同步
- master节点判断replid,
发现不一致,拒绝同步增量 - master完整的内存数据
生成RDB,发送RDB到slave - slave
清空本地数据 ,加载master的RDB- master将RDB期间的命令记录在
repl_baklog ,并持续将log发送命令slave- slave执行收到的命令,保持和master之间的同步
??增量同步(psync)
增量同步:用于处理主从复制中网络闪断引起的原因
说白了就是只更新slave与master部分数据存在差异
在Redis 2.8之后
??repl_backlog原理
master怎么知道slave与自己的数据有什么区别?
说到全同步时的全同步repl_baklog文件了。
这个文件是一个固定大小的数组,但数组是环形的,也就是说
repl_baklog中会记录Redis处理过的命令日志和offset,包括master当前的offset,和slave已复制offset:
slave与master的offset两者的区别是
随着数据的不断写入,master的offset逐渐变大,slave也不断的拷贝,追赶master的offset:
直到数组填满: 此时,
🍑主从同步优化
主从同步可以保证主从数据的一致性,非常重要。
可以从以下几个方面来优化Redis主从就集群:
- 在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。
- Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO
- 适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
- 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力
🍑全量和增量区别
简述全量同步和增量同步区别?
- 全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。
- 增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave
什么时候执行全量同步?
- slave节点第一次连接master节点时
- slave节点断开时间太久,repl_baklog中的offset已经被覆盖时
什么时候执行增量同步?
- slave节点断开又恢复,并且在repl_baklog中能找到offset时
🍈Redis哨兵
哨兵(sentinal)是一个分布式系统,用于对
监控 :Sentinel 会不断检查您的master和slave是否按预期工作自动故障恢复 :如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主通知 :Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端
🍌Redis集群监控原理
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:
•主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例
•客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例
🍌集群故障恢复
一旦发现master故障,
首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds * 10)则会排除该slave节点 - 然后判断slave节点的slave-priority值,越小优先级越高,
如果是0则永不参与选举 - 如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高
- 最后是判断slave节点的运行id大小,越小优先级越高。
当选出一个新的master后,该如何实现切换呢?
流程如下:
- sentinel给备选的slave1节点发送slaveof no one命令,让该节点成为master
- sentinel给所有其它slave发送slaveof 192.168.150.101 7002 命令,让这些slave成为新master的从节点,开始从新的master上同步数据。
- 最后,sentinel将故障节点标记为slave,当故障节点恢复后会自动成为新的master的slave节点
- 监控
- 故障转移
- 通知
Sentinel如何判断一个redis实例是否健康?
- 每隔1秒发送一次ping命令,
如果超过一定时间没有相向则认为是主观下线 如果大多数sentinel都认为实例主观下线,则判定服务下线
故障转移步骤有哪些?
- 首先选定一个slave作为新的master,执行slaveof no one(永不为奴😏)
- 然后让所有节点都执行slaveof 新master
- 修改故障节点配置,添加slaveof 新master
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论🍻 最后再次给大家安利一波牛客,点击刷题神器 注册牛客,快来和博主一起刷题吧嘿嘿嘿👏 再次感谢各位小伙伴儿们的支持🤞