c 检测缓冲区有无数据_十年Java程序员老兵手把手教你redis主从数据同步流程

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

① 数据少丢失

② 服务少中断

①通过AOF,RDB保证

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

d357afc53b59a41250656314109dff03.png

那么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的从库。

09122ae6334a2bb54ffd45e48c7e6a5a.png

具体流程:

d178f2cc863e953ffaac4bbe69d97f38.png

① 实例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部分即可~~~~。

bbd2f4771cb8d54d77ad456dd0d51280.png

注意:

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis 主从同步是一种数据复制机制,用于将一个 Redis 服务器的数据复制到其他 Redis 服务器,以实现数据的备份和读写分离。主从同步的过程可以分为以下几个步骤: 1. 配置主从关系:在从服务器的配置文件,通过配置`slaveof`或`replicaof`指令,将从服务器指定为主服务器的复制品。 2. 主服务器发送快照:主服务器会将当前数据集的快照发送给所有从服务器。快照可以通过执行`BGSAVE`命令或者配置主服务器定期自动执行。 3. 主服务器发送增量数据:主服务器会将每次写操作的增量数据发送给所有从服务器。增量数据使用命令传播(command propagation)协议进行传输。 4. 从服务器加载快照和增量数据:从服务器接收到主服务器发送的快照和增量数据后,会加载这些数据,并将其应用于当前数据集。 5. 从服务器成为主服务器:当主服务器发生故障或手动切换时,从服务器可以被人工或自动地升级为新的主服务器,其他从服务器则重新配置成新的主服务器的从服务器。 需要注意的是,Redis 主从同步是异步的,即从服务器与主服务器之间存在一定的延迟。因此,在主从同步的架构,主服务器处理写操作,而从服务器一般用于读操作以提高整体性能和可用性。 另外,在 Redis 6.0 版本之后,还引入了 PSYNC2 方式,它在主从同步的基础上增加了复制积压缓冲区(replication backlog buffer),可以更好地处理断线重连等场景,提高同步性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值