主从复制及其原理,以及如何恢复

Redis的复制功能是支持多个数据库之间的数据同步。主数据库可以进行读写操作,当主数据库的数据发生变化时会自动将数据同步到从数据库。从数据库一般是只读的,它会接收主数据库同步过来的数据。

1.当启动一个从节点时,它会发送一个PSYNC命令给主节点;

2.如果是从节点初次连接到主节点,那么会触发一次全量复制。此时主节点会启动一个后台线程,开始生成一份RDB快照文件;

3.同时还会将从客户端client新收到的所有写命令缓存在内存中。RDB文件生成完毕后,主节点会将RDB文件发送给从节点,从节点会先将RDB文件写入本地磁盘,然后再从本地磁盘加载到内存中;

4.接着主节点会将内存中缓存的写命令发送到从节点,从节点同步这些数据;

5.如果从节点跟主节点之间网络出现故障,连接断开了,会自动重连,连接之后主节点仅会将部分缺失的数据同步给从节点。


演化过程:

主节点说:这是rdb文件,你们同步一下 从节点:收到


主节点:还有一个命令列表。这是我刚刚生成RDB文件期间,又收到的几条数据修改命令,我缓存起来了,现在一并发给你们。你们加载完RDB文件后,记得也要执行一下这些命令,这样我们的数据才能一致

旁白:如果主节点有数据修改,写入,删除等炒作,也会把命令挨个通知到从节点,我们把这个叫做命令传播,主节点和从节点之间就能保持同步了。


从节点:不好意思刚刚掉线了

主节点:没关系,我再发送一份rdb文件给你同步一下就好了

从节点:先别急,我只是掉线了一小会儿,没必要把全部数据都发给我吧,太浪费时间了

主节点:我也不知道你差了什么数据

从节点:我有个建议,,你内部准备一个缓冲区,后面传播命令的时候,除了同步给我们从节点,也往缓冲区写一份。下次我们再掉线了,你就把最近的命令发给我们就好了,就不用全部从头再来了

主节点:让我想想啊,我怎么知道我缓存的和你们缺失的能不能对得上呢?又怎么知道该发缓存中的哪些给你们呢?

从节点:要不咱们整个游标吧,叫做复制偏移量,最开始从0开始,随着数据复制和同步,大家一起更新,后面只需要比较各自的这个偏移量,就能知道缺失哪些数据了!

在这里插入图片描述

从节点:咱们虽然有主从复制,但主节点要是挂了,还是需要程序员们来手动选择从节点升级为主节点来提供写入服务,感觉不够智能啊。要不这样,咱们选一个人出来当管理员,不用负责数据的读写,专门来统筹协调,谁要是掉线了,就在从节点里面选择一个出来顶上?

主节点:我看行,就把这个管理员叫做哨兵吧

从节点:好主意,不过一个管理员可能不够,怕管理员挂了,多来几个。

为了及时获得和更新从节点的信息,哨兵没过十秒钟就要用ibfo命令去问候一下主节点。主节点会告诉我他有哪些从节点,为了更加及时知道大家是否都掉线,哨兵每隔一段时间都要ping一下问候一下从节点,如果在设置时间内没有回复,就多半跪了。

为了防止误判。哨兵发现主节点掉线后,这时候判定为主观下线。哨兵们确认一下,如果有多个哨兵都判定为下线,才能认定为客观下线。具体需要几个哨兵同时认定,大家可以自己定义。


4.主节点跪了的话就进行故障转移

第一步:选个新主节点。

在这里插入图片描述

第二步,让其他从节点从新的主节点那里同步数据。

第三步,把原来旧的主节点改成从节点。

在这里插入图片描述

问题又来了,选谁上位?

可以优先选择跟主节点断开连接最短的节点,这样它的数据会更新一点

还可以参考一下复制偏移量,越大的数据应该越全

综上所诉:选择优先级更高,复制偏移量最大的节点

在这里插入图片描述

新问题:
每个节点都保存全部数据,那么数据流多了怎么办?
每个节点可以保存不同的数据??

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值