Redis主从复制原理详解,小白也能看懂!!!
Posted CRUD速写大师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis主从复制原理详解,小白也能看懂!!!相关的知识,希望对你有一定的参考价值。
什么是Redis主从复制?
Redis主从复制,就是说现在有多台Redis服务器,我们把他们分为master(主节点)和slave(从节点),而主从复制呢就是将 master的数据复制到 slave上面,且数据的复制是单向的,不能从 slave复制到master。
主从模式
为什么需要对Redis主从复制?
日常开发中,我们自己一般都是使用的单机版的Redis,尽管做了持久化,但在reds宕机后,用户使用就会受到影响。而且,单机版的redis内存是会达到峰值的,如果我们做了主从复制,那么即使有一个服务器宕机了,也不会影响用户的使用。
Redis官网号称可以达到10w QPS,但实际开发中,这10w可能远远不够,所以单机版下的QPS也会成瓶颈。
主从复制的作用
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
- 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复。
- 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
- 高可用:主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
Redis主从复制原理
主从复制过程大体可以分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段
连接建立阶段(即准备阶段)
该阶段的主要作用是在主从节点之间建立连接,为数据同步做好准备。
节点服务器内部维护了两个字段,即masterhost和masterport字段,用于存储主节点的ip和port信息。
第一步:设置主服务器地址和端口
客户端向从服务器发送 slaveof <master_ip> <master_port>
第二步:建立Socket连接
从服务器根据 ip和port 与主服务器建立 socket 连接,主节点接收到从节点的socket连接后(即accept之后),为该socket创建相应的客户端状态,并将从节点看做是连接到主节点的一个客户端
第三步:发送PING命令
从服务器成为主服务器后,会向主服务器发送 ping 命令来检查 socket 是否可用及主服务器能否正常处理命令请求。
而发送 ping 命令后,有三种返回结果:
- 返回 PONG:说明socket连接正常,且主节点当前可以处理请求,复制过程继续。
- 超时没反应:一定时间后从节点仍未收到主节点的回复,说明socket连接不可用,则从节点断开socket连接,并重新创建连向主服务器的 socket。
- 返回一个错误:从节点断开socket连接,并重新创建连向主服务器的 socket。
第四步:身份验证
从服务器收到主服务器发送的 PONG 之后
如果从节点中设置了masterauth选项,则从节点需要向主节点进行身份验证;没有设置该选项,则不需要验证。
如果需要验证,从节点通过向主节点发送auth命令进行的,auth命令的参数即为配置文件中的masterauth的值。
第五步:发送端口信息
从服务器会向主服务器发送监听端口号,主服务器接收后,会保存到该从节点对应的客户端的slave_listening_port字段中
数据同步阶段
Redis主从复制可通过 PSYNC 命令来实现,而 PSYNC 命令有两种模式:① 完整重同步;②部分重同步。
完整重同步
主要用于处理 初次复制 的情况,通过让主服务器创建 RDB 文件发送给从服务器,以及让从服务器发送保存在缓冲区里面的写命令来进行同步。
部分重同步
主要用于处理 断线后重复制 情况,当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接受并执行这些命令,就可以将数据库更新到和主服务器当前一致的状态。
初次复制:从服务器以前没有复制过任何主服务器,或者从服务器当前要复制的主服务器和上一次的不同。
断线后重复制:处于命令传播阶段的主从服务器因为网络原因而中断了复制,但从服务器通过自动重连接重新连接上了主服务器,并继续复制主服务器。
Redis2.8之前不支持部分重同步
温馨提示
在Redis主从复制中,一定要开启 master 和 slave 的持久化功能。如果启用不了,一定要避免服务器自动重启。
- 如果master的持久化功能关闭了,slave1 和 slave2 从master复制数据过去。
- master崩溃重启,因为持久化功能被关闭,重启后master没有数据。
- slave1 和 slave2 从master复制数据过去,因为master数据为空,这样相当于销毁了之前拷贝过来的数据副本。
所以强烈建议开始 持久化 。
PSYNC流程详解
- 如果从服务器以前没有复制过或者执行过
slaveof no one
命令,那么从服务器在开始一次新的复制时,会给主服务器发送PSYNC ? -1
命令。主动请求进行完整重同步。 - 相反,如果已经复制过,那么从服务器在开始一次新的复制时,将向主服务器发送
PSYNC <runid > <offset>
命令,runid 是上次主服务器的运行ID,offset是从服务器的复制偏移量。
接受到 PSYNC 命令的主服务器,返回以下三种回复中的一中
- 如果主服务器返回
+FULLRESYNC <runid> <offset>
回复,表示主服务器执行完整重同步操作,runid为主服务器的ID,从服务器会将其保存,offset是主服务器的复制偏移量,从服务器会将其当作自己的起始复制偏移量。 - 如果主服务器返回的是
+CONTINUE
回复,表示主服务器执行部分重同步操作,从服务器只要等待主服务器发送缺少的那部分数据过来即可。 - 如果主服务器返回的是
+ERR
回复,那么表示 Redis版本低于2.8,识别不了 PSYNC命令,那么从服务器向主服务器发送 SYNC命令,并与之执行完整同步操作。
命令传播阶段
在这个阶段主节点只要将自己执行的写命令发送给从节点,从节点接收命令并执行,就能保证主从节点一致。
心跳检测
在命令传播阶段,从服务器会以每秒一次的频率,向主服务器发送命令。
作用
- 检测主从服务器的网络连接状态
- 检测命令丢失
- 辅助实现 min-slaves选项
min-slaves选项
Redis的 min-slaves-to-write 和 min-slaves-max-lag两个选项可以防止主服务器在不安全的情况下执行写命令。
案例
min-slaves-to-write 2
min-slaves-max-lag 5
意思就是如果在从服务器少于2个或者两个从服务器的延迟值大于等于 5秒时,主服务器拒绝执行写命令。
最后
我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!
创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以给个点赞和关注,感谢支持,我们下次再见~~~
分享大纲
更多精彩内容分享,请点击 Hello World (●’◡’●)
以上是关于Redis主从复制原理详解,小白也能看懂!!!的主要内容,如果未能解决你的问题,请参考以下文章