Lecture10-Redis-主从复制与哨兵

文章目录

    [toc]

    单词词性音标含义
    mastern./ˈmɑːstə(r)/主节点(负责写,同步数据给从节点)
    replican./ˈreplɪkə/从节点(同步主节点数据,默认只读,可升级为主)
    replicationn./ˌreplɪˈkeɪʃn/复制(主从数据同步机制)
    sentineln./ˈsentɪnl/哨兵(监控主从,自动故障转移的高可用组件)
    failovern./ˈfeɪlˌəʊvə(r)/故障转移(主节点宕机后自动选新主)
    read-onlyadj./ˌriːd ˈəʊnli/只读的(从节点默认 replica-read-only yes)
    full syncn./fʊl sɪŋk/全量复制(首次/断线重连,传完整数据)
    partial syncn./ˈpɑːʃl sɪŋk/增量复制(断线后只补缺失的命令)

    Lecture10-Redis-主从复制与哨兵

    目标:搭建主从复制实现读写分离与数据备份,再用哨兵 Sentinel 让主节点宕机时自动切换,实现高可用。

    1、主从复制

    1、结构与好处

    master-slave

    • 读写分离:主写、从读,分担读压力。
    • 数据多份:避免单点故障,降低数据丢失风险。
    • 高可用基础:主节点挂了,从节点可升级为新主。

    2、搭建(教学:一台机器起 3 个实例)

    生产环境搭建主从结构,每一个实例都需要单独占用一台服务器,充分发挥服务器性能;

    但是我们现在条件不宽裕,也是为了操作简便,暂时放在同一台 Ubuntu 虚拟机

    ①准备配置文件

    在一台机器上启动三个 Redis 进程,端口分别为 6379、6380、6381。

    从解压目录下,复制原始、纯净、未被修改的配置文件,复制到专门的目录下:

    mkdir -p /usr/local/redis_repl
    sudo chown -R $USER:$USER /usr/local/redis_repl
    cp /opt/redis-8.0.6/redis.conf /usr/local/redis_repl/redis-master.conf
    cp /opt/redis-8.0.6/redis.conf /usr/local/redis_repl/redis-6380.conf
    cp /opt/redis-8.0.6/redis.conf /usr/local/redis_repl/redis-6381.conf
    

    编辑三个文件,各自改端口/日志/数据文件:

    # redis-master.conf(主,6379 默认即可)
    port 6379
    daemonize yes
    dir /usr/local/redis_repl
    logfile master.log
    dbfilename dump-master.rdb
    protected-mode no
    bind 0.0.0.0
    
    # redis-6380.conf(从)
    port 6380
    daemonize yes
    dir /usr/local/redis_repl
    logfile repl6380.log
    dbfilename dump-6380.rdb
    protected-mode no
    bind 0.0.0.0
    replicaof 127.0.0.1 6379     # 关键:指定主节点
    
    # redis-6381.conf(从)
    port 6381
    daemonize yes
    dir /usr/local/redis_repl
    logfile repl6381.log
    dbfilename dump-6381.rdb
    protected-mode no
    bind 0.0.0.0
    replicaof 127.0.0.1 6379
    

    ②启动三个实例

    redis-server /usr/local/redis_repl/redis-master.conf
    redis-server /usr/local/redis_repl/redis-6380.conf
    redis-server /usr/local/redis_repl/redis-6381.conf
    

    ③查看主从关系

    redis-cli -p 6379 info replication
    # role:master
    # connected_slaves:2
    # slave0:ip=127.0.0.1,port=6380,state=online,offset=...
    
    redis-cli -p 6380 info replication
    # role:slave
    # master_host:127.0.0.1
    # master_port:6379
    # master_link_status:up
    

    ④临时设置主从(命令方式)

    # 设为从
    redis-cli -p 6381 slaveof 127.0.0.1 6379
    # 取消(变回主)
    redis-cli -p 6381 slaveof no one
    

    replicaof(配置)和 slaveof(命令)二选一,配置方式重启仍有效。


    3、测试要点

    • 主节点写入 → 从节点能读到(数据同步 ✓)。
    • 从节点不能写:(error) READONLY You can't write against a read only replica.
    • 从节点宕机重启后,需重新建立主从关系(命令方式会丢)。
    • 主节点宕机期间,从节点仍是只读,不能自动接管 → 这就是需要哨兵的原因。

    4、同步原理(够用版)

    • 首次/断线重连:全量复制(主节点 bgsave 生成快照传给从节点加载)。
    • 断线期间累积的命令:增量复制(从复制积压缓冲区补缺失命令,用 PSYNC 实现)。

    2、哨兵 Sentinel(高可用)

    1、为什么需要

    主从复制是手动维护的:主挂了,从不会自动升级。哨兵自动完成:

    • 监控:心跳检查(heart beat)主/从是否存活。
    • 故障转移:主宕机后自动把某个从提升为主,并通知其它从/客户端。
    • 通知:客户端通过哨兵拿到新的主节点地址。

    2、主观下线与客观下线

    单个哨兵说"它可能挂了"是主观下线;多个哨兵(超过 quorum)一致确认才客观下线,然后触发故障转移(避免网络抖动误判)。

    # sentinel.conf
    # mymaster 是主节点别名;1 表示至少 1 个哨兵同意才客观下线
    sentinel monitor mymaster 127.0.0.1 6379 1
    

    生产建议至少 3 个哨兵(奇数),避免"哨兵自己挂了导致无法决策"。


    3、启动哨兵

    ./redis-sentinel /usr/local/redis_repl/sentinel.conf --sentinel
    

    哨兵运行后会自动改配置(记录当前 master 信息),日志会打印:

    +sdown master mymaster 127.0.0.1 6379
    +odown master mymaster ...
    +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380   ← 主切换到 6380
    

    4、测试故障转移

    1. redis-cli -p 6379 shutdown 杀掉主节点。
    2. 等待十几秒,观察哨兵日志:自动把某个从(如 6380)提升为新主。
    3. 从节点按新主继续同步;客户端连哨兵会自动感知新主。

    sentinel-arch


    3、对接 SpringBoot 4(通过哨兵)

    应用不直连 Redis,而是连接哨兵,由哨兵返回当前主节点地址。

    spring:
      data:
        redis:
          client-type: lettuce
          sentinel:
            master: mymaster            # 哨兵配置文件里定义的主节点名
            nodes:
              - 127.0.0.1:26379         # 哨兵端口(默认 26379)
          lettuce:
            pool:
              enabled: true
              max-active: 8
              max-idle: 5
    

    哨兵默认端口 26379(master 6379 + 20000)。Lettuce 会自动发现新主并重连。


    4、本讲小结

    • 主从复制:主写从读、数据备份;从节点只读、需手动切换。
    • 哨兵:监控 + 自动故障转移 + 通知,实现高可用。
    • 高可用等级:单机 → 主从 → 主从+哨兵 → 集群(下一讲)。

    5、课堂练习

    1. 在一台机器上启动 3 个 Redis 实例(6379 主 + 6380/6381 从),用 replicaof 建立主从。
    2. 主节点写入 name=hello,分别在两个从节点读取,验证同步。
    3. 在从节点执行 set,观察 READONLY 报错。
    4. 启动 1 个哨兵监控主节点,杀掉主节点,观察哨兵自动把从节点提升为新主。

    6、本节验证

    • 会搭建一主两从,理解读写分离 ✅
    • 会用命令/配置设置主从,查看主从关系(role、master_link_status)✅
    • 理解全量复制与增量复制(够用版)✅
    • 会配置并启动哨兵,理解主观/客观下线与故障转移,对接 SpringBoot4 ✅
    end