关于redis:redis主从数据同步流程

1次阅读

共计 1405 个字符,预计需要花费 4 分钟才能阅读完成。

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

正文完
 0