Redis系列04 - 主从复制

前言

Redis体系学习整理,点我点我
解决问题:
1:单点问题,机器宕机,服务不可用,数据丢失。
2:容量瓶颈。 简而言之,保障Redis的HP和HA


主从复制三大步骤

如果我们要自己设计一个主从同步的系统,你会怎么处理?
大家都能想到,最简单的思路也是三步

  1. 机器建立连接
  2. 数据复制
  3. 后续新指令维护

我们来看下Redis的具体步骤。因为都是人设计出来其实思路是一致的。

  1. 链接阶段:Slave 向Master建立链接
  2. 数据同步阶段:讲Master的数据同步到Slave
    1. 全量复制
    2. 增量复制
  3. 命令传播阶段:后续指令持续同步

下面我们单独针对各个阶段进行说明

链接阶段

slave主动去和master建立socket链接。

  1. Slave自我介绍 发送IP + Port 给Master
  2. Master接收到消息。返回master的运行ID(run_id )具体作用下面介绍
  3. 根据master的结果,开始建立socket
  4. 建立完成,互相检测心跳(Ping master IP)。当然Slave频率是远远大于Master的。
    在这里插入图片描述

对应命令
客户端式:slaveof [IP] [port] 成为执行机器的从服务器:如果该机器之前是其他master的slave那么会丢弃之前的数据集。
在这里插入图片描述
启动服务时:redis-service – slaveof 127.0.0.1 6379

配置式(推荐): redis.conf文件中添加配置 slaveof [IP] [port]

QA:
Q:为什么是Slave发起连接,发起同步请求,更频繁的检测心跳呢?
A:其实很简单,因为Master太忙了 【手动狗头~】不仅要处理各种数据,还要管理和响应Slave。

数据同步阶段

这一步涉及RDB和AOF相关的知识: 不熟悉的同学,先点这里去了解一下

  • Slave发送同步请求

    • 1.0 sync
    • 2.8 psync
    • 4.0 psync < runid > < offset >
      • 第一次请求因为没有runid 会传默认值 0 -1。master接受到默认参数时,判断为首次链接,会开辟 复制积压缓冲区 用来把RDB后的数据进行存储,防止指令丢失。
      • 复制积压缓冲区的结构如下:偏移值,就是指令中的offset,master根据复制偏移量来决定同步的数据信息。图片来源:https://www.cnblogs.com/lukexwang/p/4711977.html
  • 全量复制

    • master收到同步请求,运行 bgsave,得到RDB文件。后续指令存入复制积压缓冲区。
    • RDB文件通过Socket同步给Slave
    • Slave接收到RDB文件。开始清除老数据flashdb。然后根据RDB文件恢复数据。
  • 增量复制

    • master从指令积压缓冲区得到 AOF文件。发送给Slave
    • Slave 接收数据。执行bgrewriter,然后开始执行恢复。

    到这一步,数据就基本同步完毕了。

命令传播阶段

  • 互相Ping 心跳包
  • 根据复制积压缓冲区的数据,进行后续的增量复制。

注意事项和遗留问题

注意事项

  • 生产环境主库数据巨大,新增从库应并开流量高峰期,避免阻塞影响高可用
  • 复制缓冲区大小默认是1mb。 如果你发现CPU持续走高,可能就是缓冲区大小设置的不合理。 在全复制时,如果检测到复制积压缓冲区满了,系统会进行2次(3次甚至更多次)的全量复制。
  • 内存分配比例,要留30%左右给 bgsave和创建缓冲区。
  • 多Slave错峰同步,避免带宽压崩。

遗留问题:
master宕机的怎么办?
数据不一致主从延迟怎么办?

相关解释在集群和哨兵模式中进行介绍

主从同步今天就总结到这里~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章