美文网首页
Redis 学习三 主从复制架构

Redis 学习三 主从复制架构

作者: __Y_Q | 来源:发表于2023-12-12 17:27 被阅读0次

    前两次学习了 Redis 的基础知识和持久化方式, 今天开始学习 Redis 的主从复制架构.

    先上图


    基本的主从架构

    上图就是一个最基本的主从架构.
    Redis 的主从复制架构是一种常见的高可用性和性能提升方案. 在Redis 中, 主从复制允许将一个 Redis 服务器(主节点)的数据复制到一个或多个其他 Redis 服务器(从节点), 从而实现数据的备份, 读取负载均衡和故障恢复等功能.

    1. 主从复制的基本原理

    • 主节点 (Master)
      主节点是负责处理写操作和更新的节点. 它负责接收客户端的写请求, 将写入的数据持久化到磁盘, 并将写操作的指令复制到连接的从节点.
    • 从节点 (Slave)
      从节点是主节点的复制品. 它从主节点复制数据, 并在接收到数据后存储副本. 从节点通常用户处理读操作, 它可以分担主节点的读取压力, 并提供备份数据.

    2. 主从复制的工作流程

    主从复制又分为 全量复制部分复制
    2.1 全量复制

    • 从节点启动后, 会从配置文件中所配置的 replicaof 地址从主节点实例复制数据, 使用 psync 命令来同步数据.发送命令之前会和主节点建立 socket 长连接. (无论从节点是否是第一次连接上主节点, 都会发送 psync 命令请求复制数据)
    • 主节点收到 psync 命令后, 执行 bgsave 生成最新的 rdb 快照数据.(主节点在生成快照的同时如果接收到新的写的命令, 就会将命令放到一个内存缓冲区中.)
    • 主节点将生成的 rdb 快照数据发送到从节点.
    • 从节点清空旧数据, 并且加载主节点的 rdb.
    • 主节点将内存缓冲区中新的写命令, 发动到从节点.
    • 从节点执行主节点发送的缓冲区的命令, 写入到内存.
    • 主节点通过 socket 长连接持续把命令发送给从节点, 从而保持主从数据的一致性.

    注意: 当 master 与 slave 之间的连接由于某些原因而断开时, slave 能够自动重连 master, 如果 master 收到了多个 slave 并发的连接请求, 它只会进行一次持久化, 然后再把这一份持久化的数据发送给多个并发连接的 slave.

    全量复制流程示意图

    2.2 部分复制
    masterslave 断开连接又重连后, 一般都会对整份数据进行复制, 但是从 Redis 2.8 版本开始, Redis 改用可以支持部分数据复制命令 psyncmaster 同步数据, slavemaster 能够在网络连接断开重连后, 只进行部分数据的复制. 流程如下

    • 从节点断开和主节点的连接又重新连接上后, 同样也会发送 psync 命令, 但是会带上一个上一次同步后的偏移量 offset
    • 主节点收到命令后, 会判断从节点的偏移量 offset 是否在 repl backlong buffer中, 也就是一块缓冲区. (backlog 大小可配置, 默认为1M, 缓冲区内保存了主节点最近一段时间的命令.)
      • 如果存在, 则主节点会将缓冲区从从节点的 offset 之后的数据一次性同步给子节点.
      • 如果不存在, 还是会进行全量同步的操作.
    • 主节点通过 socket 长连接持续把命令发送给从节点, 从而保持主从数据的一致性.

    master 会在内存中创建一个复制数据用的缓存队列, 缓存最近一段时间的数据, master 和它所有的 slave 都维护了复制的数据下标 offset 和 master 的进程 ID, 因此当网络断开后, slave 会请求 master继续进行未完成的复制, 从所记录的数据下标开始.
    如果 master 的进程 ID 变化了, 或者从节点数据下标 offset 太旧, 已经不在 master 的缓存队列里了, 那么将会进行一次全量数据的复制.


    3. 主从复制的搭建配置

    搭建主从架构一般都是配置从节点.

    1. 复制一份 redis.conf 文件到从节点.

    2. 修改相关配置, 假设 192.168.1.1 123 是主节点, 192.168.1.2 456 是从节点.

    port 456
    pidfile  /var/run/redis_456pid.pid #pid进程号写入pidfile, 456为从节点的端口号
    logfile "456.log" #456 为从节点的端口号
    dir /usr/local/redis/data/456 #指定数据存放目录., 456为从节点的端口号
    # 需要注释掉bind 
    # bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通 过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
    
    1. 配置主从复制
    replicaof 192.168.1.1 123  #配置从节点向 123 的redis实例复制数据, 
    replica-read-only yes #配置从节点只读
    
    1. 启动从节点
    redis-server redis.conf
    
    1. 连接从节点
    Redis-cli -p 456
    
    1. 测试在123实例上写数据, 456实例是否能及时同步新修改的数据.

    4. 主从复制风暴

    什么是复制风暴:当有多个从节点, 同时从主节点复制数据, 就会导致直接点压力过大.

    为了解决复制风暴问题, 可以从架构上调整, 让部分从节点与从节点同步数据, 类似阶梯式.


    image.png

    相关文章

      网友评论

          本文标题:Redis 学习三 主从复制架构

          本文链接:https://www.haomeiwen.com/subject/kuumgdtx.html