redis 主从复制

主从复制简介

 高可用集群

  • slave 宕机不会影响整个集群
  • master 宕机由slave 暂时推选出新的master
  • 为了减缓master 压力,可以给slave 增加从机(slave)
  • 可以建立master 集群

主从复制的作用

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

主从复制工作流程

总述

  •  三阶段
    • 建立连接阶段(即准备阶段)
    • 数据同步阶段
    • 命令传播阶段

阶段一:建立连接阶段

  • 建立slave 到 master 的连接,使master 能够识别slave,并保存slave 端口号
  • 建立连接阶段的工作流程
    • 设置master 的地址和端口号,保存master 信息
    • 建立socket 连接
    • 发送ping指令(定时器任务)
    • 身份验证
    • 发送slave 端口信息

  • 连接之后的状态
    • slave:保存master 的地址和端口
    • master:保存slave 的端口
    • 总体:slave 和 master 之间创建了连接的socket
  • 主从连接方式
    • 方式一:客户端发送连接命令,实例如下
    1. 启动两个redis 服务(配置不同端口)
    2. 使用客户端连接其中一个想要作为从服务器的服务器,输入命令 slaveof <masterip> <masterport> 即可。上述介绍的操作,会自动完成
    • 方式二:启动服务器参数,实例如下:
    1. 先启动一个redis 服务,配置好端口,作为master
    2. 之后再启动另外一个redis 服务,但是在启动的时候直接进行连接。命令行如下:redis-server --slaveof <masterip> <masterport>
    • 方式三:服务器配置(常用),实例如下:
    1. 先启动一个redis 服务,配置好端口,作为master
    2. 另一个启动时用的配置文件中加入 slaveof <masterip> <masterport> 语句,保存文件之后,使用该配置文件进行slave 服务的启动

阶段二:数据同步阶段工作流程

  • 在slave 初次连接master 后,复制master 中所有的数据到slave
  • 在slave 的数据库状态更新成master 当前的数据库状态
  • 具体步骤
    • 请求同步数据(slave)
    • 创建RDB 同步数据(master)
    • 恢复RDB 同步数据(slave)
    • 请求部分同步数据,即复制缓冲区中的数据(slave)
    • 恢复部分同步数据(slave)

  •  数据同步完成之后的状态
    • slave:具有master 端的全部数据,包含RDB 过程中接受的数据
      • 部分复制的过程其实就是在请求和发送RDB 过程中接受的数据的过程
      • 而复制缓冲区就是缓存在RDB 过程中的产生的新的数据
    • master:保存slave 当前数据同步的位置
    • 总体:slave 和 master 之间完成了数据的克隆
  • 数据同步阶段master 说明
    • 如果master 数据量巨大,数据同步阶段应避开流量高峰期,避免造成master 阻塞,影响业务正常执行。
    • 复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave 陷入死循环状态
  • 数据同步阶段slave 说明
    • 为避免slave 进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务
    • 多个slave同时对master 请求数据同步,master 发送的RDB 文件增多,会对带宽造成巨大冲击,如果master 带宽不足,因此数据同步需要根据业务需求,适量错峰

阶段三:命令传播阶段

  • 定义:当master 数据库状态被修改之后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态同步的动作叫命令传播
  • 具体过程:master 将接受到的数据变更命令发送给slave,slave接受命令后执行命令
  • 命令传播阶段的部分复制
    • 命令传播阶段出现了断网现象
      • 网络闪断闪连(影响不大,忽略)
      • 长时间网络中断——全量复制
      • 短时间网络中断——部分复制
  • 部分复制的三个核心要素
    • 服务器的运行id(run id)
      • 概念:服务器运行ID 是每一台服务器每次运行的身份识别码,每次运行可能都不相同
      • 组成:运行id 由40 位字符组成,是一个随机的十六进制字符
      • 作用:运行id 被用于在服务器间进行传输,识别身份
      • 实现方式:运行id 在服务器启动时自动生成,master 在首次连接slave 时,会将自己的运行id 发送给slave,slave 保存此ID,通过info server 命令,可以查看节点的runid
    • 主服务器的复制积压缓冲区
      • 概念:是一个先进先出的队列,用于存储服务器执行过的命令,每次传播命令,master 都会将传播的命令记录下来,并存储在复制缓冲区
      • 复制缓冲区内部工作原理
      • 组成
        • 偏移量
        • 字节值
      • 工作原理
        • 通过offset 区分不同的slave 当前数据传播的差异
    • 主从服务器的复制偏移量
      • 概念:一个数字,描述复制缓冲区中指令字节位置
      • 分类
        • master 复制偏移量:记录发送给所有slave 的指令字节对应的位置(多个)
        • slave 复制偏移量:记录slave 接收master 发送过来的指令字节对应的位置(一个)
      • 数据来源:
        • master端:发送一次记录一次
        • slave 端:接收一次记录一次
      • 作用:同步信息,比对master 与slave 的差异,当slave 断线后,恢复数据使用

主从复制的全过程

心跳机制(维护命令传播阶段的核心)

  • 进入命令传播阶段后,master 与slave 间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线
  • master 心跳:
    • 指令:ping
    • 周期:由repl-ping-slave-period 决定,默认10秒
    • 作用:判断slave 是否在线
    • 查询:info replication
  • slave 心跳
    • 指令:replconf ack {offset}
    • 周期:1秒
    • 作用1:汇报slave 自己的复制偏移量,获取最新的数据变更指令
    • 作用2:判断master 是否在线
  • 心跳阶段注意事项
    • 当slave 多数掉线,或延迟过高,master 为保障数据稳定性,将拒绝所有信息同步操作
      • 通过以下配置项来判断什么时候关闭同步操作
        • min-slaves-to-write 2
        • min-slaves-max-lag 8
    • slave 数量由slave 发送 replconf ack 命令做确认(之后和min-slaves-to-write 比较)
    • slave 延迟由slave 发送 replconf ack 命令做确认(之后和min-slaves-max-lag 比较)

主从复制常见问题

频繁的全量复制

原因一:伴随着系统的运行,master 的数据量会越来越大,一但master 重启,runid 将发生变化,会导致全部slave 的全量复制操作

内部优化方案:

  1. master 内部创建master_replid 变量,使用runid 相同的策略生成,长度为41 位,并发送给所有slave
  2. 在master 关闭时执行命令shutdown save,进行RDB持久化,将runid 与 offset 保存到RDB 文件中
    • repl-id repl-offset
    • 通过redis-check-rdb 命令可以查看该信息
  3. master 重启后加载RDB 文件,恢复数据
    • 重启后,将RDB 文件中保存的repl-id与repl-offset 加载到内存中
      • master_repl_id = repl      master_repl_offset = repl-offset
      • 通过命令info 可以查看该信息
  4. 作用:保存本机保存上次runid,重启后恢复该值,使所有slave 认为还是之前的master

原因二:网络环境不佳,出现网络中断,slave不提供服务。而此时复制缓冲区过小,导致断网后slave 的offset 越界,触发全量复制。而严重时,会导致slave反复进行全量复制。

解决方案:修改复制缓冲区大小

网络中断问题

现象一:master 的CPU 占用过高 或 slave 频繁断开连接

原因一:

  • slave 每1秒发送replconf ack命令到master
  • 当slave 接到了慢查询时,会大量占用CPU性能
  • master 1s 调用复制定时函数replicationCron(),比对slave 发现长时间没有进行响应

最终结果:master 各种资源(输出缓冲区、带宽、连接等)被严重占用

解决方案:通过设置合理的超时时间repl-timeout,确定是否释放slave

现象二:slave 与master 连接断开

原因:

  • master 发送ping 指令频度较低
  • master 设定超时时间较短
  • ping 指令在网络中存在丢包

解决方案:

  • 提高ping 指令发送的频度
    • 经验:超时时间repl-time 的时间至少是ping频度的5-10倍

数据不一致

现象:多个slave 获取相同数据不同步

问题原因:网络信息不同步,数据发送有延迟

解决方案:

  • 优化主从间的环境网络,通常设置在同一个机房部署,如使用阿里云等云服务器时要注意此现象
  • 监控主从节点延迟判断,如果slave 延迟过大,暂时屏蔽程序对该slave 的数据访问

总结

主从复制工作流程

  • 三阶段
    • 全量复制
    • 部分复制
    • 命令传播
  • 三核心(部分复制中)
    • runid
    • 复制积压缓冲区
    • 偏移量(offset)
  • 心跳机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值