您的位置 首页 java

十年Java程序员老兵手把手教你redis主从数据同步流程

我们经常听说 redis 具有高可靠性,这里的高可靠性有什么含义呢?

① 数据少丢失

② 服务少中断

①通过AOF,RDB保证

②通过多实例保存数据备份保证,即多个机器都保存一份数据,即使机器A宕机了,也有机器B,机器C来服务。

那么redis如何保证各个机器的数据一致性呢?

先想像,如果客户端操作了一个key,但是每次都是操作不同机器,比如

机器A: set aaa 111

机器B: set aaa 222

机器C: set aaa 333

此时,我们访问不同机器时,得到key aaa的值都会不同,会对业务造成影响。

redis采用的是 主从模式 来保证各机器备份数据的一致性,比如设置机器A为master(主),机器B,C为slave(从)

读操作:A,B,C机器

写操作:先写A机器,然后同步给B,C机器

主从库如何进行第一次数据同步?

因机器数量有限,就在同一机器启动三个实例A, B, C。

实例A:16379 端口(master)

实例B:16379 端口(slave)

实例C:16379 端口(slave)

实例B,C都成为实例A的从库:执行slaveof 127.0.0.1 16379,就成为了实例A的从库。

具体流程:

① 实例B执行 slaveof 127.0.0.1 16379

② psync runID offset , 实例B告诉实例A,我需要要同步你数据

参数1 runID, 代表实例A的唯一标识(redis实例启动后自动生成的唯一ID)

参数2 offset,复制进度,这里 – 1 复制代表全量复制

③ 实例A发出相应命令 FULLRESYNC RunID offset (FULLRESYNC 主库ID 主库复制进度)。

④实例B保存实例A响应的runID offset。

实例A执行bgsave命令 ,生成 RDB (实例A的所有数据),发送给实例B

实例B清空 自己所有数据 ,加载RDB文件

⑦replication buffer 是什么呢?

设想一下,实例A在生成RDB时和向实例B传输RDB文件时,有新的写请求怎么办?

实例A生成和传输RDB过程肯定不能拒绝服务,所以会先把操作记录到复制缓冲区,即replication buffer,等RDB文件发送完成后,再发送缓冲区的写操作,这样master和slave才能数据一致~~~~

⑧加载replication buffer。

主从库间网络断了,主从数据不一致怎么办?

redis2.8前, 主库会和从库重新进行一次全量复制。

redis2.8后, 采用增量复制,这里涉及到 repl_backlog_buffer (环形缓冲复制队列),当主从库断连后,主库会把断连期间收到的写操作命令,写入 replication buffer(复制缓冲区),同时也会把这些操作命令也写入 repl_backlog_buffer(环形缓冲复制队列)。 repl_backlog_buffer 是一个环形缓冲区,主库会记录自己写到的位置,从库则会记录自己已经读到的位置 。

主从网络中断恢复连接时,从库会通过psync命令把offset发给主库,主库把master_repl_offset(3)和 repl_backlog_buffer(1)之间的数据复制给从库就可以,则图中2,3部分即可~~~~。

注意:

如果从库的读取速度比较慢,就有可能导致从库还未读取的操作被主库新写的操作覆盖了,这会导致主从库间的数据不一致。比如

master 把环形缓冲区写了两次了,

slave 环形缓冲区第一次还没读完,就会存在~~~~数据丢失!

好了,暂时就更新到这里了,大家有什么疑问欢迎下方评论区进行讨论,咱们下期见哦~

文章来源:智云一二三科技

文章标题:十年Java程序员老兵手把手教你redis主从数据同步流程

文章地址:https://www.zhihuclub.com/201182.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图