如何通过日志的方式理解Redis主从复制

Redis主从复制概要

之前我们介绍了如何构建主从复制,其中在总结处提及的,做主从的时候,一定要谨慎,因为在执行主从复制时,会清理掉从库所有的数据,所以说,今天我们来看下,我们从库在执行SLAVEOF的时候,执行的步骤。

建立连接

当我们在从库执行slaveof,指定主节点的地址和端口后,从库和主库会进行连接,等待复制,这时,可以查看日志得到信息,我们新建一个主从,我们查看日志可知:

[root@pdudo 6380]# grep -i connecting redis.log -A 1
* Connecting to MASTER 127.0.0.1:6379 * MASTER <-> SLAVE sync started [root@pdudo 6380]#

如上日志显示,从库将向主库建立链接,且建立成功,主从开始复制。

检查主库是否存活

再建立链接后,为确保服务器存活,从库会向主库发送ping命令,若收到返回pong,则开始复制。

通过日志显示如下

* Master replied to PING, replication can continue...

如果发送ping未被返回pong,会抛出如下错误,并且间隔数秒,会再次尝试建立连接。

# Error condition on socket for SYNC: Connection refused 

此时我们则应当检查主库是否可用。

权限校验

当从库ping主库得到正常返回时,这个时候,就需要开启鉴权了,所谓的鉴权,若主库设置了requirepass,则从库在连接主库进行复制前,就需要指定masterauth才行,否则会重复建立连接步骤。

若密码错误,会显示如下日志

# Unable to AUTH to MASTER: -ERR invalid password 

如上就是主库requirepass和从库masterauth不一致所引起的,此时从库会回到建立连接步骤重新开始,周而复始,此时我们应该检查主库的密码是否和masterauth一致,若不一致,需要修改masterauth将其和主库一致才行。

若密码正确,则会显示如下日志

* Partial resynchronization not possible (no cached master) 

数据同步

在验证完主库的密码后,则真正开始数据主从同步,同步的方式为全量同步+部分同步的方式,这里详细讲解一下,在建立主从复制后,第一次会进行全量复制,而后才会进行增量复制。

全量复制

当主库收到请求后,会在主库执行bgsave开始后台备份,备份完成后,会直接将备份后的rdb发送至从库。从库在收到主库rdb文件后, 会释放到从库中。 通过主库的日志可以看到详细信息。

* Full resync requested by slave 127.0.0.1:6380 * Starting BGSAVE for SYNC with target: disk * Background saving started by pid 44841
* DB saved on disk * Background saving terminated with success * Synchronization with slave 127.0.0.1:6380 succeeded 

在从库收到后,可以看到日志

* Full resync from master: 250ee58e7c7fb1e6c57c05cbfb099cb0013674d9:1 * MASTER <-> SLAVE sync: receiving 77 bytes from master
* MASTER <-> SLAVE sync: Flushing old data
* MASTER <-> SLAVE sync: Loading DB in memory
* MASTER <-> SLAVE sync: Finished with success

而后,当主库有新增数据后,会通过增量复制的方式发送至从库进行执行,至此,我们主从复制逻辑介绍完毕。

总结

自此,还有我们了解了大概的主从复制流程,其实还有亿点点细节没有提及,例如数据同步的时候,我们在执行全量复制的时候,这时候来了新命令,应该放到哪里? 等等。由于有点复杂,所以不准备持续阐述了,这里总结几个小坑,我们在做主从复制的时候,尽量选择业务量小的时候操作,为什么呢? 因为业务量大的时候,我们在后台做bgsave的时候,当检测到达到多少key有变化了,它就会认为目前的备份版本太老了,会重新进行备份,然而又进入了循环,始终都备份不完。其次在重申一点,在做主从复制的时候,一定要认真看好机器,不要将其他正在线上使用的Redis作为从库来执行slaveof了,我们有过类似的案例,Redis版本的删库跑路,那经验增长老长了。

#java#
全部评论
这个方法太有用了,感谢分享
点赞 回复 分享
发布于 2022-08-25 18:49 陕西

相关推荐

点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务