在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等要求。复制功能是高可用Redis的基础

配置

建立复制:从节点slaveof

  • 复制的基础
    1.Redis实例划分为主节点(master)和从节点(slave)
    2.默认情况下Redis都是主节点
    3.每个从节点只能有一个主节点,每个主节点可以有多个从节点
    4.复制的数据流是单向的,只能由主节点复制到从节点

配置复制的方式

image.png
slaveof配置都是在从节点发起

  • 配置文件中加入slaveof
  • 启动redis时 redis-server --slaveof
  • 直接在cli中使用slaveof ,所以可以在运行期间动态配置

操作流程

slaveof为异步命令,执行slaveof时,节点只保存主节点信息后返回,后续复制流程在节点内部异步执行

  • 复制操作流程
    1.redis-server --port 6380
    image.png
    2.redis-cli -p 6380 执行slaveof localhost 6379 将6379作为主节点,开始复制
    image.png
    3.主节点info replication复制状态信息
    image.png
    4.从节点info replication复制状态信息
    image.png

断开复制、切换节点

段开复制流程:从节点slaveof on one

  • 主要流程:
    1.断开与主节点复制关系
    2.从节点晋升为主节点
    image.png

切换节点:slaveof

  • 主要流程:
    1.断开与主节点复制关系
    2.与新主节点建立复制关系
    3.删除从节点当前所有数据
    4.对新主节点进行复制操作
    image.png

特别注意:切主节点后从节点会清空之前所有数据

安全性配置

image.png

  • 主节点通过设置requirepass参数进行密码验证,所有客户端必须使用auth命令实行校验
  • 节点复制是通过一个特殊标识的客户端来完成的,因此从节点的masterauth参数与主节点密码保持一致

只读

image.png
slave-read-only yes配置为只读模式,建议不要修改节点的只读模式,会破坏造成数据不一致

传输延迟

主从节点部署在不同机器上需要考虑网络延迟问题
image.png
repl-disable-tcp-nodelay no 参数用于是否关闭TCP延迟

  • 关闭时,无论数据大小都会及时地发送给从节点,延迟变小,带宽增大。适用于同机架或同机房部署
  • 开启时,合并较小的TCP数据包节省带宽,发送时间间隔一般为40ms,取决于Linux内核。适用于跨机房部署,带宽紧张

如果考虑高荣在可以同城跨机房部署开启该选项

拓扑

Redis的拓扑复杂性可以分为三种:一主一从、一主多从、树状主从结构
image.png

一主一从结构

用于主节点出现宕机时从节点提供故障转移支持,从节点开启AOF,主节点不开启,且主节点要避免重启操作(因为重启后数据清空,从节点也会清空),保证数据安全性也避免持久化对主节点的干扰

一主多从结构

用于读写分离,主节点写,从节点读,用于分担主节点压力。但对于并发量较高的场景,多个从节点会导致主节点写命令的多次发送过多消耗网络带宽

树状主从结构

从节点不但可以复制主节点数据,同时还可以作为其他从节点的主节点继续向下复制。有效降低主节点负载和需要传送给从节点的数据量,降低主节点压力

原理

复制原理

分为6个过程

保存主节点(master)信息

执行slaveof后从节点只保存主节点的地址信息后直接返回,此时复制流程还没有开始

建立连接

从节点(slave)内部通过运行定时任务复制维护相关逻辑,与主节点建立网络连接,如果不成功则会无限重试,或者slaveof no noe取消复制

发送ping命令

验证网络套接字是否可用,检测主节点是否可以接受处理命令

权限验证

验证requirepass参数密码验证

同步数据集

首次建立复制场景会把所有数据全部发送给从节点,这部分操作时耗时最长的步骤
(新版本可以全量同步和部分同步)

命令持续复制

主节点会持续把写命令发送给从节点,保证数据一致性

心跳

主从节点在建立复制后,会维护长连接并彼此发送心跳命令

心跳机制

  • 主从节点都有心跳机制,各自模拟成对方的客户端进行通信
  • 主节点默认每10S对从节点发送ping命令,判断从节点的村或许和连接状态image.png
  • 从节点每个1S发送replconf ack 命令,给主节点上报自身当前的复制偏移量

开发与运维中的问题


这个家伙很懒,啥也没有留下😋