Redis 主从架构图

  • 主从架构能够很大提升并发能力,master 节点负责写数据,slave 节点负责读数据,这样就涉及到 master 和 slave 数据同步的一个过程
  • 一起来看一下数据是如何同步的吧
    • redis 的主从同步机制可以确保 master 和 slave 之间的数据同步
    • redis 在 2.8 及以上版本使用 psync 命令完成主从数据同步
    • 同步方式:全量复制、增量复制

数据同步详细流程

全量同步

  • slave 第一次启动时,连接 master,发送 psync 命令,格式为 psync {runId} {offset}

    • {runId} 为 master 的运行ID,{offset} 为 slave 自己的复制偏移量
    • slave 第一次连接 master 时,slave 并不知道 master 的 runId,也不知道自己偏移量,这时候 slave 会传一个问号和 -1,告诉 master 节点是第一次同步,格式为 psync ? -1
  • 当 master 接收到 psync ? -1 时,知道 slave 是要全量复制,就会将自己的 runId 和 offset 告知 slave,回复命令 fullresync {runId} {offset},同时 master 会执行 bgsave 命令来生成 rdb 文件,期间的所有写命令将被写入缓冲区
    • slave 接受到 master 的回复命令后,会保存 master 的 runId 和 offset,slave 此时处于同步状态
    • slave 处于同步状态,如果此时收到请求,当配置参数 slave-server-stale-data yes 时,会响应当前请求,slave-server-stale-data no,返回错误
  • master bgsave 执行完毕,向 slave 发送 rdb 文件,rdb 文件发送完毕后,开始向 slave 发送缓冲区中的写命令
  • slave 收到 rdb 文件,丢弃所有旧数据,开始载入 rdb 文件
  • rdb 文件同步结束之后,slave 执行从 master 缓冲区发送过来的所以写命令
  • 此后 master 每执行一个写命令,就向 slave 发送相同的写命令

增量同步

  • 如果出现网络闪断或者命令丢失等异常情况时,当主从连接恢复后,由于从节点之前保存了自身己复制的
    偏移量和主节点的运行ID。因此会把它们当作 psync 参数发送给主节点,要求进行部分复制操作,格式为 psync {runId} {offset}

  • 主节点接到 psync 命令后首先核对参数 runld 是否与自身一致,如果一致, 说明之前复制的是当前主节点,之后根据参数 offset 在自身复制积压缓冲区查找,如果偏移量之后的数据存在缓冲区中,则对从节点发送 +continue 响应,表示可以进行部分复制,否则进行全量复制

  • 主节点根据偏移量把复制积压缓冲区里的数据发送给从节点,保证主从复制进入正常状态

数据同步问题

同步超时问题

  • redis.conf 中的默认配置 repl-timeout 60,默认超时时间 60 秒
  • 假设网卡带宽理论峰值大约每秒传输 100MB,在不考虑其他进程消耗带宽的情况下,6GB 的 RDB 文件至少需要 60 秒传输时间,默认配置下,很容易出现数据同步超时

积压缓冲区拷贝溢出

  • slave 节点从开始接收 RDB 文件到接收完成期间,主节点仍然响应读写命令,因此主节点会把这期间写入命令保存在复制积压缓冲区内,当从节点加载完 RDB 文件后,主节点再把缓冲区内的数据发送给从节点,保证主从之间数据一致性
  • 如果主节点创建和传输 RDB 的时间过长,对于高流量写入场景非常容易造成主节点复制客户端缓冲区溢出,默认配置为 client-output-buffer-limit slave 256MB 64MB 60,如果 60 秒内缓冲区消耗持续大于 64MB 或者直接超过 256MB 时,主节点将直接关闭复制客户端连接,造成全量同步失败
  • 运维人员需要根据主节点数据量和写命令并发量调整 client-output-buffer-limit slave 配置,避免全量复制期间客户端缓冲区溢出;对于主节点,当发送完所有的数据后就认为全量复制完成,打印成功日志:synchronization with slave127.0.0.1:6380 succeeded

slave全量同步的响应问题

  • slave 节点接收完主节点传送来的全部数据后会清空自身旧数据,执行 flash old data,然后加载 rdb 文件,对于较大的 rdb 文件,这一步操作依然比较耗时
  • 对于线上做读写分离的场景,从节点也负责响应读命令,如果 slave 节点正出于全量复制阶段,那么 slave 节点在响应读命令可能拿到过期或错误的数据
  • 对于这种场景,redis 复制提供了slave-server-stale-data yes 参数(默认开启),如果开启则 slave 节点依然响应所有命令
  • 对于无法容忍不一致的应用场景可以设置no 来关闭命令执行,此时从节点除了 info 和 slaveof 命令之外所有的命令只返回 sync with master in progress 信息

数据被清空问题

  • 采用主从架构,建议开启 master 的持久化,不建议用 slave 节点作为 master 的数据备份,假设关掉 master 的持久化,可能在 master 宕机重启的时候数据是空的,然后可能一经过复制, slave 的数据也丢了
  • master 节点的备份文件需要各种备份,假设 master 本地的备份文件丢失、宕机, sentinel 还没检测到 master failure,master node 就自动重启,还是可能导致上面所有的 slave node 数据被清空

主从节点通讯

  • 主从节点互相都会发送 heartbeat 信息
  • master 默认每隔 10 秒发送一次 heartbeat,slave node 每隔 1 秒发送一个 heartbeat

名词阐述

  • 节点运行ID

    • 每个 redis 节点启动后,都会动态分配一个 40 位的十六进制字符串作为 运行id,即 {runId},runId 主要用来唯一识别 redis 节点,比如从节点保存主节点的 runId 识别自己正在复制的是哪个主节点
    • 如果只使用 ip + port 的方式识别主节点,那么主节点重启变更了,整体数据集(如替换rdb、aof文件),从节点再基于偏移量复制数据将是不安全的,因此当 runId 变化后从节点将做全量复制
    • 可以运行 info server 命令查看当前节点的 runId
  • 偏移量拷贝
    • 参与复制的主从节点都会维护自身复制偏移量,即 {offset}。
    • 主节点(master) 在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在 info relication中的 master_repl_offset 指标中
    • 从节点(slave) 在接收到主节点发送的命令后,也会累加记录自身的偏移量,统计信息在 info relication 命令的 slave_repl_offset 指标中
    • 从节点(slave) 每秒钟上报自身的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量
  • 积压缓存区拷贝
    • 存在于主节点(master),默认大小为 1MB,可以通过参数 rel_backlog_size 来修改默认大小
    • 复制积压缓冲区是保存在主节点上的一个固定长度的队列,当从节点(slave) 连接主节点时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区
参考地址
  • https://redis.io/docs/manual/replication/#partial-sync-after-restarts-and-failovers
  • https://blog.csdn.net/iflink/article/details/122389644

Redis 主从架构数据同步相关推荐

  1. Redis 高可用篇:你管这叫主从架构数据同步原理?

    高可用有两个含义:一是数据尽量不丢失,二是服务尽可能提供服务. AOF 和 RDB 保证了数据持久化尽量不丢失,而主从复制就是增加副本,一份数据保存到多个实例上.即使有一个实例宕机,其他实例依然可以提 ...

  2. Redis主从架构:主从同步和哨兵机制

    Redis主从架构:主从同步和哨兵机制 一. Redis主从架构 二. 主从同步 2.1 引入 2.2 原理 (1) 全量同步 (2) 增量同步 (3) 优化Redis主从集群 2.3 总结 三. 哨 ...

  3. 【带你重拾Redis】Redis 主从架构

    Redis 主从架构 单机的 Redis,能够承载的 QPS 大概就在上万到几万不等.对于缓存来说,一般都是用来支撑读高并发的.因此架构做成主从(master-slave)架构,一主多从,主负责写,并 ...

  4. Redis面试 - Redis 主从架构

    Redis 主从架构 单机的 redis,能够承载的 QPS 大概就在上万到几万不等.对于缓存来说,一般都是用来支撑读高并发的.因此架构做成主从(master-slave)架构,一主多从,主负责写,并 ...

  5. Linux学习-redis主从架构

    redis主从架构 #三个节点,一主,二从(由于资源有限,在一台机器上实现),主节点写,从节点读 #1:创建目录 [root@redis opt]# mkdir {7001..7003} [root@ ...

  6. 【Redis】Redis主从架构和哨兵模式

    文章目录 主从架构 为什么需要Redis主从架构? 搭建主从架构(一主二从) 主从一致原理 复制积压缓冲区 全量复制 增量复制 在主从架构中出现了宕机的情况 为什么主从库之间的复制不使用 AOF? 哨 ...

  7. Redis深入理解五 :Redis主从架构、哨兵架构、高可用集群模式

    redis主从架构 redis主从架构搭建,配置从节点步骤: 复制一份redis.conf文件 将相关配置修改为如下值: port 6380 pidfile /var/run/redis_6380.p ...

  8. Redis与DB数据同步问题

    2019独角兽企业重金招聘Python工程师标准>>> Redis与DB数据同步问题 https://www.jianshu.com/p/e8b36ef79c93 Redis缓存数据 ...

  9. redis主从架构宕机问题手动解决

    1    主机宕机 1.  设置端口6379是主机,端口6380是从机,全部都正常启动 2.  验证在6379写入数据,在6380也能得到数据 3.  现在将6379主机停掉,模拟主机宕机 4.  由 ...

最新文章

  1. mysql数据库技术方案,MySql数据库优化方案
  2. Confluence 6 为发送邮件配置服务器
  3. java 获取mp3 id3v2_MP3文件的ID3V1信息与ID3V2信息结构的分析
  4. C#赋值运算符及解析
  5. docker 中不能用vim编辑文件
  6. MFC可执行文件问题
  7. Python读写文件说明
  8. 【推荐实践】因果推断在阿里文娱用户增长中的应用
  9. c语言printf、sprintf、vsprintf用法和区别
  10. 中源数聚携手中科点击共推管理咨询变革
  11. The servlet name already exists.解决方法
  12. wget下载太慢问题
  13. 单片机PWM波(AT89C51、ADC0808)
  14. uml中活动图与流程图的区别
  15. QoS 基础: 什么是QoS, 我真的需要吗?
  16. 计算机应用基础指法实训报告,计算机基础实训报告
  17. Deep Photo的TensorFlow版本
  18. 编写一个c语言程序 杨辉三角,杨辉三角 c语言
  19. 日期选择器 当前日期之前不允许选择
  20. 手机热点中的AP频段2.4GHz和5.0GHz有什么区别?

热门文章

  1. 请查收,会员积分商城系统外包运营攻略!
  2. 5辆车组成的编队实现ACC自适应协同控制,通过考虑前车的加速度和距离,实现自适应巡航控制,仿真平台基于carsim/Simulink实现
  3. 模拟地和数字地之间的连接方法
  4. zzuli 20级第八次周赛 2752: XZQ与数字
  5. java-net-php-python-ssm二手手机回购网站计算机毕业设计程序
  6. PVT法碳化硅SIC单晶生长工艺真空压力控制装置的国产化替代解决方案
  7. ESP8266-Arduino编程实例-MQ-7一氧化碳传感器驱动
  8. 一氧化碳/酒精/二氧化碳浓度检测/
  9. 视觉开发 学习 参考课本_D3的视觉参考
  10. Saas物联网共享平台实战