Redis进阶知识点(可学习,可复习,可面试)
时间:2022-10-20 04:00:00
前言:
本文参考和Redis相关的课程,主要讲解了Redis面试中经常问的几个问题,比如Redis主从,Redis哨兵,非常详细,适合小白和复习的老板
若文章中有不准确或需要改进的地方,请不吝赐教。
先感谢各位大佬在这里先感谢各位大佬。
??个人主页:小威想向诸佬学习
??大家好,我是小威,一个想和大家一起进步的男人
现状:目前大二,在满意的公司实习??如果老板在准备面试,可以用实习前用的刷神器。
??欢迎:这是CSDN,欢迎来到我的博客,我亲爱的老板
牛客部分使用反馈,个人感觉很好,帮我找到了最喜欢的公司,我希望你的合作伙伴也能通过它改善很多???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
以下文本开始
文章目录
-
- ??Redis集群模式
- ??Redis主从架构
-
- ??全量同步(sync)
- ??增量同步(psync)
- ??repl_backlog原理
- ??同步优化优化
- ??全量和增量的区别
- ??Redis哨兵
-
- ??Redis集群监控原理
- ??恢复集群故障
??Redis集群模式
Redis集群模式有三种:主从模式,哨兵模式,Cluster模式。Rdis如果最初使用主从模式作为集群,master停机需要手动配置slave转为master;后来为了高可用在这种模式下,提出了哨兵模式哨兵监视master和slave,若master自动停机slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式。
??Redis主从架构
Redis主从模式支持客户端的高并发性。主从模式是三种模式中最简单的。在主从复制中,数据库分为主数据库(master)和从数据库(slave)。其中,主节点主要负责编写数据,此外,主节点需要将数据写在其他节点上,负责从节点阅读,所有阅读请求都来自节点。
注意主从模式:
1.复制的数据流是单向的,只能从主节点复制到节点。
2.主(master)数据库可以读写,当读写操作导致数据变化时,数据会自动同步
3.从(slave)数据库一般只读,并且接收主数据库同步过来的数据
4.一个master可以有多个slave,但是一个slave只能对应一个master
5.slave挂了不影响其他slave的读和master的读和写,重启后,数据将从重启开始master同步过来
6.master挂断后,不影响slave的读,但redis不再提供写作服务,master重启后redis将重新提供写作服务
7.master挂了以后,就不在了slave在节点中重新选择一个master
假设A,B为两个Redis例如,如果你想让B作为A的节点,你需要在B节点上执行命令:slaveof A的IP A的端口(port)
??全量同步(sync)
一般用于第一次复制场景,Redis早期支持的复制功能只有全部复制,主节点的所有数据一次性发送到节点,当数据量较大时,主从节点和网络的成本将很大。
判断依据:
Replication Id:简称replid,是数据集的标记,id一致意味着相同的数据集。每一个master都有唯一的replid,slave则会继承master节点的replid。
offset:偏移量,随着记录在repl_baklog数据增加并逐渐增加。slave在完成同步时,还将记录当前同步offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。
因此slave做数据同步,必须向前master声明自己的replication id和offset,master可以判断哪些数据需要同步。
因为slave原来也是一个master,有自己的replid和offset,第一次变成slave,与master建立连接时,发送replid和offset是自己的replid和offset。
master判断发现slave发送来的replid与自己的不一致表明这是一全新的slave,我知道要做全同步了。
master会将自己的replid和offset都发给这个slave,slave以后slave的replid就与master一致了
因此,master判断一个节点是否是第一次同步的基础是看它replid是否一致。
完整流程描述如下:
- slave节点要求增量同步
- master节点判断replid,发现不一致,拒绝同步增量
- master完整的内存数据生成RDB,发送RDB到slave
- slave清空本地数据,加载master的RDB
- master将RDB期间的命令记录在repl_baklog,并持续将log发送命令slave
- slave执行收到的命令,保持和master之间的同步
??增量同步(psync)
增量同步:用于处理主从复制中网络闪断引起的原因数据丢失场景,若条件允许,则从节点再次连接到主节点时,主节点将从节点补发丢失的数据。补发数据远小于全数据,可有效避免全复制成本过高
说白了就是只更新slave与master部分数据存在差异
在Redis 2.8之后使用psync命令代替sync命令执行同步操作,psync数据全量重同步 和 部分重同步模式。
??repl_backlog原理
master怎么知道slave与自己的数据有什么区别?
说到全同步时的全同步repl_baklog文件了。
这个文件是一个固定大小的数组,但数组是环形的,也就是说到达数组末尾后,角标将再次从0开始读写,这样,数组头部的数据就会被覆盖。
repl_baklog中会记录Redis处理过的命令日志和offset,包括master当前的offset,和slave已复制offset:
slave与master的offset两者的区别是salve需要增量复制的数据了。
随着数据的不断写入,master的offset逐渐变大,slave也不断的拷贝,追赶master的offset:
直到数组填满:
此时,如果写入新数据,将覆盖数组中的旧数据。然而,只要旧数据是绿色的,这表明它已经同步到slave即使覆盖了数据也没什么影响。因为未同步的仅仅是红色部分。
但是,如果slave出现网络阻塞,导致master的offset远远超过了slave的offset:
如果master继续写入新数据,其offset就会覆盖旧的数据,直到将slave现在的offset也覆盖:
棕色框中的红色部分,就是尚未同步,但是却已经被覆盖的数据。此时如果slave恢复,需要同步,却发现自己的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)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master 并将所有的 slave 连接到新的 master。
哨兵的作用如下:
- 监控:Sentinel 会不断检查您的master和slave是否按预期工作
- 自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主
- 通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端
🍌Redis集群监控原理
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:
•主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。
•客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。
🍌集群故障恢复
一旦发现master故障,sentinel需要在salve中选择一个作为新的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的三个作用是什么?
- 监控
- 故障转移
- 通知
Sentinel如何判断一个redis实例是否健康?
- 每隔1秒发送一次ping命令,如果超过一定时间没有相向则认为是主观下线
- 如果大多数sentinel都认为实例主观下线,则判定服务下线
故障转移步骤有哪些?
- 首先选定一个slave作为新的master,执行slaveof no one(永不为奴😏)
- 然后让所有节点都执行slaveof 新master
- 修改故障节点配置,添加slaveof 新master
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论🍻
最后再次给大家安利一波牛客,点击刷题神器
注册牛客,快来和博主一起刷题吧嘿嘿嘿👏 再次感谢各位小伙伴儿们的支持🤞