Redis主从复制

目录

 

1.主从复制简介

2.主从复制工作流程

 2.1 建立连接阶段

2.2 数据同步阶段

2.3 命令传播阶段

2.3.1命令传播阶段的部分复制

2.4心跳机制

3.主从复制工作流程


1.主从复制简介

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

单机redis所面临的风险与问题:1、机器故障  (例如硬盘故障,系统崩溃);2、 容量瓶颈 (内存不足)

解决方案:为了避免单点Redis服务器故障,准备多台服务器,互相连通。 将数据复制多个副本保存在不同的服务器上, 连接在一起, 并保证数据是同步的。 即使有其中一台服务器宕机,其他服务器依然可以继续提供服务,实现Redis的高可用, 同时实现数据冗余备份。

具体实现方案:

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

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

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

主从复制的作用:

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

2.主从复制工作流程

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

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

 2.1 建立连接阶段

建立连接阶段工作流程:

主从连接的三种方式:

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

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

方式三:服务器配置,即在redis*.conf文件中配置
slaveof <masterip> <masterport>

主从断开连接:

客户端发送命令
slaveof no one

2.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间数据同步延迟
较大, 数据一致性变差, 应谨慎选择。

2.3 命令传播阶段

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

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

2.3.1命令传播阶段的部分复制


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

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

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

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

服务器运行ID( runid):

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

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

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

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

复制缓冲区:

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

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

 

2.4心跳机制

 进入命令传播阶段候, 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是否在线

3. 

参考来源:

http://yun.itheima.com/course/611.html?bili 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值