Redis进阶 - 主从复制
简介
互联网服务一般需要“三高”架构,即高并发、高性能、高可用
。Redis能否提供高可用的服务?
单机redis所面临的风险与问题:
- 机器故障 (例如硬盘故障,系统崩溃)
- 容量瓶颈 (内存不足)
具体实现方案:
- 提供数据方: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
2
3
4
5
6
7
8
主从断开连接:
客户端发送命令
slaveof no one
1
2
2
数据同步阶段
数据同步阶段master说明:
- 如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
- 复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已
经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态。
- repl-backlog-size 1mb
- master单机内存占用主机内存的比例不应过大,建议使用50%-70%的内存,留下30%-50%的内存用于执 行bgsave命令和创建复制缓冲区。
数据同步阶段slave说明:
- 为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务。
- slave-serve-stale-data yes|no
- 数据同步阶段, master发送给slave信息可以理解master是slave的一个客户端,主动向slave发送 命令。
- 多个slave同时对master请求数据同步, master发送的RDB文件增多, 会对带宽造成巨大冲击, 如果 master带宽不足, 因此数据同步需要根据业务需求, 适量错峰。
- 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
2
3
4
5
6
7
8
9
复制缓冲区:
概念:复制缓冲区,又名复制积压缓冲区,是一个先进先出( FIFO)的队列, 用于存储服务器执行过的命
令, 每次传播命令, master都会将传播的命令记录下来, 并存储在复制缓冲区。
由来:每台服务器启动时,如果开启有AOF或被连接成为master节点, 即创建复制缓冲区
作用:用于保存master收到的所有指令(仅影响数据变更的指令,例如set, select)
数据来源:当master接收到主客户端的指令时,除了将指令执行,会将该指令存储到缓冲区中
1
2
3
4
5
6
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
2
3
4
5
6
7
8
9
10
11