彻底明白Redis主从同步原理

彻底明白Redis主从同步原理1 主从复制两个 Redis 实例 可 ip 相同 port 不同 可使用 slaveof 命令设置主从关系 redis 采用乐观同步策略 即容忍短时间内主从不一致 但是保证最终一致性 主从复制分为三个阶段 连接阶段数据同步阶段命令传播阶段 2 连接阶段当 slave 执行完 salveof master ip master port 命令时 slave 向 master 发起 socket 连接 mas

1.主从复制

两个Redis实例(可ip相同port不同),可使用slaveof命令设置主从关系。redis采用乐观同步策略,即容忍短时间内主从不一致,但是保证最终一致性,主从复制分为三个阶段:

  1. 连接阶段
  2. 数据同步阶段
  3. 命令传播阶段

2.连接阶段

当slave执行完salveof ${master_ip} ${master_port}命令时,slave向master发起socket连接,master接收到连接请求后建立连接。

当连接建立后,slave向master发送[ping]命令,以确定master状态正常,如果master响应[pong]则代表master正常。

如果master设置了密码,则slave需要配置masterauth参数,此时slave发送[auth + ${passwoed}]命令进行密码验证,

当密码验证成功后,slave通知master自己的监听端口,此时连接完成。

3.数据同步阶段

数据同步阶段是slave的数据初始化阶段,也就是slave同步master当前的数据,该步是slave主动发起。

slave向master发送[psync]命令,master收到请求后,首先判断是增量复制还是全量复制,然后再同步。

增量复制是指master仅将缓冲区中的命令发给slave,slave依次执行命令,完成数据同步。

全量复制是指master先生成内存快照(rdb文件,这里和是否开启rdb备份无关),然后将内存快照发给slave,slave加载快照到内存中完成数据同步。

3.1 offset 偏移量

3.2 replication backlog buffer

[replication backlog buffer]是一个固定长度的FIFO的队列,大小由配置参数[repl-backlog]指定,默认大小是1mb,这个缓冲区只存在master,用于备份最近master同步slave的数据。

3.3 runid

每个redis服务每次启动时,都会随机生成一个40的id来代表自己,可通过[info server]命令查询run_id。

在初次主从同步时,master会将自己的runid发送给slave,salve记录自己的[master runid]。

3.4 同步流程

在这里插入图片描述

  1. slave首先判断是否第一次执行主从复制,即如果有保存的[master run_id],如果有则说明不是第一次。
  2. 如果slave是第一次执行主从复制,则向master发送全量复制请求。
  3. 如果slave不是第一次执行主从复制,则向master发送增量复制请求[ psync ${master run_id} offset ]。
  4. master如果接受到全量复制请求,则进行内存快照,然后响应rdb文件。
  5. master如果接受到增量复制请求,则首先判断请求中的runid是不是自己,如果和自己的runid不一致,则说明slave之前的master并不是自己,此时只能进行全量复制,响应[ FULLRESYNC runid offset ],从节点则更新自己保存的master runid,并将offset作为自己的初始偏移量,然后等待master发来的rdb文件进而执行全量复制。
  6. 如果master判断slave的上一次的master是自己时,则继续判断请求中的offset是否在[replication-backlog-buffer]中,如果在则说明可以进行增量复制,返回[CONTINUE],slave则得知可以进行增量复制,等待slave发来的自己缺少的那部分命令,然后执行即可。

4 命令传播阶段

当数据同步完成后,此后的时间里主从之间维护心跳来检查对方是否在线。

master定时向slave发送[PING]请求,如果收到slave的[PONG]响应则可知slave在线(默认10s,通过参数[repl-ping-slave-period]指定)。

slave每秒向master发送[ REPLCONF ACK ${offset} ]命令,master根据偏移量响应未同步的数据,slave收到master的响应可知master在线,并执行命令,完成主从同步。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215667.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午1:43
下一篇 2026年3月18日 下午1:43


相关推荐

  • 2026年【桌面美化】保姆级教程,让你的电脑桌面焕然一新,小白也能秒学会!

    2026年【桌面美化】保姆级教程,让你的电脑桌面焕然一新,小白也能秒学会!

    2026年3月16日
    2
  • SpringBoot集成Kafka 配置工具类

    SpringBoot集成Kafka 配置工具类spring kafka 是基于 java 版的 kafkaclient 与 spring 的集成 提供了 KafkaTemplat 封装了各种方法 方便操作 它封装了 apache 的 kafka clientYML 配置简单工具类 能满足正常使用 主题是无法修改的建立主题如果 broker 端配置 auto create topics enable 为 true 默认为 true 当收到客户端的元数据请求时则会创建 topic 向一个不存在的主题发送和消费都会创建一个新的主题 很多时候 非预期的创建主题 会导致很多意想不

    2026年3月26日
    2
  • 阻容降压电路[通俗易懂]

    阻容降压电路[通俗易懂]阻容降压电路(适合于小功率小电流负载)示例分析:下图中,C1为降压电容,一般为0.33-3.3uF。在此设为C1=2uF,整流管的导通电阻通常为几欧姆,稳压管VS的动态电阻为10欧姆左右,限流电阻R1及负载电阻RL一般为100-200欧姆,滤波电容一般为100uF-1000uF,其容抗可忽略。因此,可将图1电路等效为图2的交流电路,且满足容抗XC1>R的条件。电容C1的容抗XC1…

    2022年6月20日
    33
  • Little Sub and Piggybank (杭师大第十二届校赛G题) DP

    Little Sub and Piggybank (杭师大第十二届校赛G题) DP题目传送门题意 每天能往存钱罐加任意实数的钱 每天不能多于起那一天放的钱数 如果某一天的钱数恰好等于那天的特价商品 则可以买 求最后的最大快乐值 思路 先来一段来自出题人的题解 显然的贪心 如果第 i 天买完 准备在第 j 天买 那么显然最优是在 i 1 到 j 天放 wi j i 的钱 于是假定选择的物品是 k1 k2 k3 那么必须满足 a ki

    2026年3月18日
    1
  • 用opencv的dnn模块做yolov5目标检测[通俗易懂]

    用opencv的dnn模块做yolov5目标检测[通俗易懂]最近在微信公众号里看到多篇讲解yolov5在openvino部署做目标检测文章,但是没看到过用opencv的dnn模块做yolov5目标检测的。于是,我就想着编写一套用opencv的dnn模块做yolov5目标检测的程序。在编写这套程序时,遇到的bug和解决办法,在这篇文章里讲述一下。在yolov5之前的yolov3和yolov4的官方代码都是基于darknet框架的实现的,因此opencv的dnn模块做目标检测时,读取的是.cfg和.weight文件,那时候编写程序很顺畅,没有遇到bug。但是yolo

    2022年10月13日
    5
  • java中timer怎么用_java out of memory

    java中timer怎么用_java out of memory当我通过按BACK按钮(调用onBackPressed())关闭应用程序时,CountDownTimer它不会停止,直到完成计数为止。我怎样才能把CountDownTimercancel();在我的onBackPressed()?因为,当我退出应用程序时(如下面的说明所示),我不再想要在屏幕上进行举杯了。在我的代码之上:booleannetwork_connected=false;我的是什…

    2026年1月16日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号