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 环形缓冲区第一次还没读完,就会存在~~~~数据丢失。

你可能感兴趣的:(redis)