作者|莱乌

主从模式配置

对于 Redis 主从大家可能并不陌生,但是配置的话日常工作中并不会经常操作。在这里简单介绍下主从的相关配置。

1、主从模式

Redis 中设置主从的方式很简单,通常有两种:

  • 通过在配置文件 redis.conf 中设置 slaveof 方式(永久);

  • 直接在客户端执行 slaveof ip port 的方式(临时);

2、主-从-从模式

对于主-从-从的模式来说,配置也与上边的操作类似,在这里就不多赘述了。

主从一致性原理

了解了主从配置后,下面就要进入正题了。

在主从中,通常的操作是主库用来写入数据,从库用来读取数据。这样的好处是避免了所有的请求压力都打在了主库上,同时系统的伸缩性也得到了很大的提升。


但是问题就来了,读从库时的数据要与主库保持一致,那就需要主库的数据在写入后同步到从库中。如何保持主库与从库的数据一致性,当有多个从库时,又如何做到呢?

1、全量复制

这是第一次同步时所发生的传递关系。看名字就知道,主库第一次就毫无保留的把所有数据都传递给了从库。

我们先来看下它们是如何发生第一次关系的(就知道你会想歪)。

图中的同步流程已经很清晰了,总共分为三部分:

(1)主从节点建立联系

当从节点与主节点第一次建立联系时,从节点会向主节点发送 psync 命令,表示要进行数据同步。

正如你看到的 psync 命令后会带有两个参数:一个是 runID,一个是偏移量 offset。

  • runID:每个Redis实例生成的随机且唯一的ID,在这里表示的是主节点的ID。

  • offset:复制偏移量。

在图中第一次复制时因为不知道主库ID和偏移量,因此用“?”和“-1”分别来表示runID 和 offset。

当主节点接收到 psync 命令后,会使用 FULLSYNC命令向从节点发送 runID 及offset 两个参数。从节点将其信息保存下来。

到这里关系算是建立了下来。

(2)主节点同步RDB文件

RDB文件,这是一个老面孔了,持久化时会用到的二进制文件。在这里起着主从数据同步的作用,也就是说主从同步是依赖 RDB 文件来实现的。

从节点接收到 RDB 文件后,在本地完成数据加载,算是完成了主从同步。

到这里你有没有发现什么问题?

我们回想下 RDB 文件是如何生成的。在持久化那篇文章里,我们介绍过,父进程 fork 了一个子进程来进行生成 RDB 文件。父进程并不阻塞接收处理客户端的命令。

那么问题就产生了,当主节点把 RDB 文件发送给从节点时,主节点同时接收的命令又该如何来处理?

(3)主节点同步缓冲区命令

这一步就是来解决 RDB 文件生成后,父进程又接收到写命令同步的问题的。

为了保证主从节点数据的一致性,主节点中会使用缓冲区来记录 RDB 文件生成后接收到的写操作命令。在 RDB 文件发送完成后会把缓冲区的命令发送给从节点来执行。

到这里,主从节点的数据同步算是完成了。

2、级联操作

我们再来回顾下整个同步流程,从建立关系,生成 RDB 文件,传输给从节点到最后缓冲区命令发送给从节点。这是一个从节点与主节点同步的完整流程。

那么我们再来思考:当有多个从节点,也就是一主多从时,第一次连接时都要进行全量复制。但是在生成 RDB 文件时,父进程 fork 子进程时可能会出现阻塞,同时在传输 RDB 文件时也会占用带宽,浪费资源。

这种情况我们该如何来解决呢?

不知道你对文章开头的 主-从-从模式是否还有印象。通过对从节点再建立从节点。同步数据时从级联的从节点上进行同步,从而就减轻了主节点的压力。

网络开小差了

上面的流程我们已经知道了正常情况下主从节点的复制过程了,但是当网络中断导致主从连接失败等异常情况下,主从同步又是如何来进行的?

在这里要提到一个增量复制的名词,与全量复制不同的是,它是根据主从节点的偏移量来进行数据同步的。

什么意思呢?

还记得在全量复制里我们所提到过的缓冲区吗?就是用来存储生成 RDB 文件后的写命令的,这里我们称为缓冲区A。主从节点断开连接后,除了会将后续接收到的写命令写入缓冲区A的同时,还会写入到另一个缓冲区B里。

在缓冲区B里,主从节点分别会维护一个偏移量 offset。刚开始时,主节点的写位置与从节点的读位置在同一起点,随着主节点的不断写入,偏移量也会逐渐增大。同样地,从节点复制完后偏移量也在不断增加。

当网络断开连接时,从节点不再进行同步,此时主节点由于不断接收新的写操作的偏移量会大于从节点的偏移量。当连接恢复时,从节点向主节点发送带有偏移量的psync 命令,主节点根据偏移量来进行比较,只需将未同步写命令同步给从节点即可。

总结

主从一致性原理

  • 从节点第一次进行连接时,主节点会生成 RDB 文件进行全量复制,同时将新写入的命令存储进缓冲区,发送给从节点,从而保证数据一致性;

  • 为了减少数据同步给主节点带来的压力,可以通过从节点级联的方式进行同步。

网络开小差了

  • 网络断连重新连接后,主从节点通过分别维护的偏移量来同步写命令。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

面试官:Redis 主从复制时网络开小差了怎么整?相关推荐

  1. redis主从复制如何保证数据一致性_面试官:Redis 主从复制时网络开小差了怎么整?...

    上周因为实在太忙就认认真真写了一篇水文,吹了一下自己过去的经历,反响竟然超出了我的预期,并且后台还有读者留言表示想看续集的.哈哈,果然大家还是对水文更有热情. 这期我们继续回到之前的 Redis 话题 ...

  2. 阿里面试官Redis把我问到哑口无言…

    Redis在国内各大公司都很热门,比如新浪.阿里.腾讯.百度.美团.小米等.Redis也是大厂面试最爱问的,尤其是Redis客户端.Redis高级功能.Redis持久化和开发运维常用问题探讨.Redi ...

  3. 面试篇:让面试官心服口服的前端网络知识点(一)

    这篇文章是作者在求职过程所总结的前端网络相关面试题及其答案. 浏览器地址栏输入url,回车发生什么? 这是一个很经典的问题,我在过去的求职过程中,几乎每一家公司的面试都会问到这个问题,我这里也是利用这 ...

  4. 面试官:Redis分布式锁解决方案是什么?

    今天博主在这片文章中主要给大家讲下Redis分布式锁的原理以及解决方案 学到三连呦 1.Redis分布式锁原理 1.1.简述 我们知道分布式锁的特性是排他.避免死锁.高可用.分布式锁的实现可以通过数据 ...

  5. 面试官 | 写if 时不带 else,你的代码会更好!

    来源:翻译自: Nicklas Millard 的文章<Better Software Without If-Else> 注:本文并不肯定或者否定哪一种写法,仅仅为大家提供一些其他的编码思 ...

  6. 面试官:Redis集群有哪些方式,Leader选举又是什么原理呢?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

  7. 面试官这Redis夺命连环12问,谁顶得住?

    面试官这夺命连环12问,谁顶得住? ⏬ 面试官: 同学,我看你每个项目中都用到了Redis,你能说说你是怎样使用Redis的吗? 小A同学: 主要用来做缓存,分布式Session, 阅读量/点赞数统计 ...

  8. less面试_资深面试官告诉你:面试时千万不要说这七句话

    毕业季到了,即将走出校门的学生们一个个都面临着找工作这件人生大事.找工作除了靠实力,面试发挥也很重要.哪些话该说哪些话不该说,初出茅庐的年轻人可得搞清楚.资深面试官告诉你,下面这七句话是"面 ...

  9. 8年经验面试官详解 Java 面试秘诀

    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位 ...

最新文章

  1. ​谷歌大神Jeff Dean领衔,万字展望5大AI趋势
  2. 重绘(repaint)与渲染(reflow)
  3. 数据结构Java02【栈、队列、单链表(增删节点)、循环链表、双向循环链表、递归(斐波那契、汉诺塔)】
  4. python中range什么意思_python里range什么意思
  5. Javascript覆盖率(jstd)报表解析Maven插件
  6. dubbo-admin管理平台搭建
  7. java steam 去重_Java中对List去重, Stream去重
  8. GCC9.2/Python3.8/Libvirt6.0/QEMU4.2 编译/配置/安装
  9. 3-5Tensor的属性
  10. zb如何导出自己画的_如何科学管理zb文件
  11. 555定时器回差电压计算公式_555定时器及其应用
  12. 人工智能和计算机程序有什么区别,AI与计算机程序的区别?
  13. Halcon教程十:把Halcon程序放入WPF程序里
  14. 讯飞输入法pad版x86_讯飞输入法Pad版下载
  15. (构造笔记)GRASP学习心得
  16. word点击退出时未保存怎么办?
  17. 2019年AI领域回顾:稳定发展还是幻想破灭?
  18. 日本亚马逊海淘经验-2015
  19. 校招基本告一段落,总结一下
  20. 单端冲泡机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. android布局优化 工具,详解Android布局优化
  2. python中bs4库_python系统学习2——beautiful soup库(bs4库)学习
  3. c语言指针的地址存放,c语言 - *指针 和 地址
  4. python滚动条自动向下,python tqdm 如何使得滚动条不上下滚动(保持一行内滚动)
  5. php mysql 备份还原_PHP执行Mysql数据库的备份和还原
  6. 九章云极DataCanvas完成C轮融资:定义标准化AI基础架构未来
  7. 计算机网络之数据链路层:5、停止等待协议
  8. 2-3:套接字(Socket)编程之UDP通信,sockaddr,sockaddr_in,recvfrom,sendto
  9. RCF - C ++的进程间通信
  10. 1313. 解压缩编码列表