今天上午有个粉丝想要我写篇关于Redis主从复制的面试题,嘿嘿,像我这样的宠粉狂魔,那不必须得安排上,故有此篇博文诞生,如果能帮助到大家的,希望各位小伙伴能给个点赞,关注,我会坚持更新,帮助各位能拿到心仪的 offer。
话不多说,下面开始吧~~~
Redis主从复制,就是说现在有多台Redis服务器,我们把他们分为master(主节点)和slave(从节点),而主从复制呢就是将 master的数据复制到 slave上面,且数据的复制是单向的,不能从 slave复制到master。
日常开发中,我们自己一般都是使用的单机版的Redis,尽管做了持久化,但在reds宕机后,用户使用就会受到影响。而且,单机版的redis内存是会达到峰值的,如果我们做了主从复制,那么即使有一个服务器宕机了,也不会影响用户的使用。
Redis官网号称可以达到10w QPS,但实际开发中,这10w可能远远不够,所以单机版下的QPS也会成瓶颈。
主从复制过程大体可以分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段
该阶段的主要作用是在主从节点之间建立连接,为数据同步做好准备。
节点服务器内部维护了两个字段,即masterhost和masterport字段,用于存储主节点的ip和port信息。
第一步:设置主服务器地址和端口
客户端向从服务器发送 slaveof
第二步:建立Socket连接
从服务器根据 ip和port 与主服务器建立 socket 连接,主节点接收到从节点的socket连接后(即accept之后),为该socket创建相应的客户端状态,并将从节点看做是连接到主节点的一个客户端
第三步:发送PING命令
从服务器成为主服务器后,会向主服务器发送 ping 命令来检查 socket 是否可用及主服务器能否正常处理命令请求。
而发送 ping 命令后,有三种返回结果:
第四步:身份验证
从服务器收到主服务器发送的 PONG 之后
如果从节点中设置了masterauth选项,则从节点需要向主节点进行身份验证;没有设置该选项,则不需要验证。
如果需要验证,从节点通过向主节点发送auth命令进行的,auth命令的参数即为配置文件中的masterauth的值。
第五步:发送端口信息
从服务器会向主服务器发送监听端口号,主服务器接收后,会保存到该从节点对应的客户端的slave_listening_port字段中
Redis主从复制可通过 PSYNC 命令来实现,而 PSYNC 命令有两种模式:① 完整重同步;②部分重同步。
完整重同步
主要用于处理 初次复制 的情况,通过让主服务器创建 RDB 文件发送给从服务器,以及让从服务器发送保存在缓冲区里面的写命令来进行同步。
部分重同步
主要用于处理 断线后重复制 情况,当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接受并执行这些命令,就可以将数据库更新到和主服务器当前一致的状态。
初次复制:从服务器以前没有复制过任何主服务器,或者从服务器当前要复制的主服务器和上一次的不同。
断线后重复制:处于命令传播阶段的主从服务器因为网络原因而中断了复制,但从服务器通过自动重连接重新连接上了主服务器,并继续复制主服务器。
Redis2.8之前不支持部分重同步
温馨提示
在Redis主从复制中,一定要开启 master 和 slave 的持久化功能。如果启用不了,一定要避免服务器自动重启。
所以强烈建议开始 持久化 。
PSYNC流程详解
slaveof no one
命令,那么从服务器在开始一次新的复制时,会给主服务器发送 PSYNC ? -1
命令。主动请求进行完整重同步。PSYNC
命令,runid 是上次主服务器的运行ID,offset是从服务器的复制偏移量。接受到 PSYNC 命令的主服务器,返回以下三种回复中的一中
+FULLRESYNC
回复,表示主服务器执行完整重同步操作,runid为主服务器的ID,从服务器会将其保存,offset是主服务器的复制偏移量,从服务器会将其当作自己的起始复制偏移量。+CONTINUE
回复,表示主服务器执行部分重同步操作,从服务器只要等待主服务器发送缺少的那部分数据过来即可。+ERR
回复,那么表示 Redis版本低于2.8,识别不了 PSYNC命令,那么从服务器向主服务器发送 SYNC命令,并与之执行完整同步操作。在这个阶段主节点只要将自己执行的写命令发送给从节点,从节点接收命令并执行,就能保证主从节点一致。
在命令传播阶段,从服务器会以每秒一次的频率,向主服务器发送命令。
作用
Redis的 min-slaves-to-write 和 min-slaves-max-lag两个选项可以防止主服务器在不安全的情况下执行写命令。
案例
min-slaves-to-write 2
min-slaves-max-lag 5
意思就是如果在从服务器少于2个或者两个从服务器的延迟值大于等于 5秒时,主服务器拒绝执行写命令。
最后
我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!
创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以给个点赞和关注,感谢支持,我们下次再见~~~
分享大纲
大厂面试题专栏
Java从入门到入坟学习路线目录索引
开源爬虫实例教程目录索引
更多精彩内容分享,请点击 Hello World (●’◡’●)