Redis进阶 - 主从复制

简介

互联网服务一般需要“三高”架构,即高并发、高性能、高可用。Redis能否提供高可用的服务?

单机redis所面临的风险与问题:

  1. 机器故障  (例如硬盘故障,系统崩溃)
  2. 容量瓶颈 (内存不足)

具体实现方案:

  • 提供数据方:master
  • 接收数据方:slave
  • 需要解决问题:两者之间的数据同步
  • 核心工作:master的数据复制到slave中

主从复制数据同步

主从复制概念:将master中的数据即时、有效的复制到slave中。

特征:一个master可以拥有多个slave,一个slave只对应一个master。

主从复制的作用:

  • 读写分离: master写、 slave读,提高服务器的读写负载能力
  • 负载均衡: 基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
  • 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
  • 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
  • 高可用基石: 基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案。

主从复制工作流程

主从复制过程大体可以分为3个阶段:

  • 建立连接阶段
  • 数据同步阶段
  • 命令传播阶段

主从复制过程

建立连接阶段

建立连接阶段

主从连接的三种方式:

方式一:客户端发送命令
slaveof <masterip> <masterport>

方式二:启动服务器参数
redis-server -slaveof <masterip> <masterport>

方式三:服务器配置,即在redis*.conf文件中配置
slaveof <masterip> <masterport>
1
2
3
4
5
6
7
8

主从断开连接:

客户端发送命令
slaveof no one
1
2

数据同步阶段

数据同步阶段

数据同步阶段master说明:

  1. 如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
  2. 复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已 经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态。
    • repl-backlog-size 1mb
  3. master单机内存占用主机内存的比例不应过大,建议使用50%-70%的内存,留下30%-50%的内存用于执 行bgsave命令和创建复制缓冲区。

数据同步阶段slave说明:

  1. 为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务。
    • slave-serve-stale-data yes|no
  2. 数据同步阶段, master发送给slave信息可以理解master是slave的一个客户端,主动向slave发送 命令。
  3. 多个slave同时对master请求数据同步, master发送的RDB文件增多, 会对带宽造成巨大冲击, 如果 master带宽不足, 因此数据同步需要根据业务需求, 适量错峰。
  4. slave过多时, 建议调整拓扑结构,由一主多从结构变为树状结构, 中间的节点既是master,也是 slave。注意使用树状结构时,由于层级深度,导致深度越高的slave与最顶层master间数据同步延迟 较大, 数据一致性变差, 应谨慎选择。

命令传播阶段

当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的 状态,同步的动作称为命令传播。

master将接收到的数据变更命令发送给slave, slave接收命令后执行命令。

命令传播阶段的部分复制

命令传播阶段出现了断网现象:

  • 网络闪断闪连       忽略
  • 短时间网络中断   部分复制
  • 长时间网络中断   全量复制

部分复制的三个核心要素:

  • 服务器的运行 id( run id)
  • 主服务器的复制积压缓冲区
  • 主从服务器的复制偏移量

服务器运行ID( runid):

概念:服务器运行ID是每一台服务器每次运行的身份识别码,一台服务器多次运行可以生成多个运行id

组成:运行id由40位字符组成,是一个随机的十六进制字符
例如: fdc9ff13b9bbaab28db42b3d50f852bb5e3fcdce

作用:运行id被用于在服务器间进行传输,识别身份
如果想两次操作均对同一台服务器进行,必须每次操作携带对应的运行id,用于对方识别

实现方式: 运行id在每台服务器启动时自动生成的, master在首次连接slave时,会将自己的运行ID发送给slave, slave保存此ID,通过info Server命令,可以查看节点的runid
1
2
3
4
5
6
7
8
9

复制缓冲区:

概念:复制缓冲区,又名复制积压缓冲区,是一个先进先出( FIFO)的队列, 用于存储服务器执行过的命
令, 每次传播命令, master都会将传播的命令记录下来, 并存储在复制缓冲区。

由来:每台服务器启动时,如果开启有AOF或被连接成为master节点, 即创建复制缓冲区
作用:用于保存master收到的所有指令(仅影响数据变更的指令,例如set, select)
数据来源:当master接收到主客户端的指令时,除了将指令执行,会将该指令存储到缓冲区中
1
2
3
4
5
6

复制缓冲区的工作原理

数据同步+命令传播

心跳机制​​

进入命令传播阶段候, master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线。

master心跳:
指令: PING
周期:由repl-ping-slave-period决定,默认10秒
作用:判断slave是否在线
查询: INFO replication 获取slave最后一次连接时间间隔, lag项维持在0或1视为正常

slave心跳任务
指令: REPLCONF ACK {offset}
周期: 1秒
作用1:汇报slave自己的复制偏移量,获取最新的数据变更指令
作用2:判断master是否在线
1
2
3
4
5
6
7
8
9
10
11

主从复制工作流程

主从复制工作流程