Redis主从复制与哨兵集群

在分布式系统中,Redis 的高可用性至关重要。本文将详细介绍 Redis 主从复制的原理、部署以及哨兵(Sentinel)集群的部署与配置,帮助你构建稳定可靠的 Redis 高可用架构。

一、Redis 主从复制

1. 主从复制的意义

主从复制是 Redis 高可用的基础,通过将主节点的数据复制到从节点,实现数据备份和读写分离,不仅提高了系统的可用性,还能分担主节点的读压力。

2. 主从结构类型

  • 一主一从:最简单的拓扑结构,用于主节点故障时从节点提供故障转移支持。可在从节点开启 AOF 持久化,避免影响主节点性能。
  • 一主多从:主节点连接多个从节点,适合读占比较大的场景,通过读写分离分担主节点压力。但需注意写并发高时可能消耗过多主节点带宽。
  • 树状主从:从节点可作为其他从节点的主节点,降低主节点负载,适用于主节点挂载多个从节点的场景。

3. 主从复制原理

3.1 复制流程
  1. 保存主节点信息 :从节点执行 slaveof 命令后,保存主节点地址信息。
  2. 建立 socket 连接:从节点通过定时任务与主节点建立网络连接。
  3. 发送 ping 命令:检测主从网络及主节点可用性,失败则重连。
  4. 权限验证 :若主节点设置密码,从节点需通过 masterauth 配置验证。
  5. 同步数据集:首次复制时通常进行全量同步,后续通过部分同步补充数据。
  6. 持续复制:主节点将写命令异步发送给从节点,保持数据一致。
3.2 复制类型
  • 全量复制:初次复制时主节点发送全部数据给从节点,耗时较长,对网络和节点压力大。
  • 部分复制:用于网络闪断等场景,主节点通过复制积压缓冲区补发丢失数据,降低开销(需 Redis 2.8+ 支持)。
3.3 关键组件
  • 复制偏移量:主从节点分别记录已复制数据的字节长度,用于判断数据一致性。
  • 复制积压缓冲区:主节点上的固定长度队列,保存最近写命令,用于部分复制。
  • 主节点运行 ID:唯一标识主节点,从节点通过此 ID 识别主节点,主节点重启后 ID 改变会触发全量复制。

4. 主从复制部署步骤

  1. 环境准备:关闭防火墙、SELinux,确保主从节点网络互通。

  2. 安装 Redis

    bash

    复制代码
    wget http://download.redis.io/releases/redis-4.0.10.tar.gz
    tar xf redis-4.0.10.tar.gz -C /usr/src/
    cd /usr/src/redis-4.0.10/
    make && make install  # 可通过 PREFIX 指定安装路径
  3. 生成配置文件和启动脚本

    bash

    复制代码
    cd utils/
    ./install_server.sh  # 按提示设置端口、配置文件路径等
  4. 配置主从关系

    • 主节点:无需特殊配置,确保监听正确 IP。
    • 从节点:修改配置文件,添加 slaveof 主节点IP 主节点端口,并配置 masterauth(若主节点有密码)。
  5. 验证主从复制:主节点写入数据,从节点可读取即表示成功。

二、Redis Sentinel 哨兵集群

1. 哨兵的作用

主从复制存在手动故障转移的问题,哨兵集群通过自动监控、判断主节点故障并执行故障转移,解决了 Redis 的高可用问题。

2. 哨兵工作原理

  1. 监控:每个哨兵节点监控主从节点及其他哨兵节点。
  2. 判断故障:当主节点不可达时,哨兵节点协商达成一致后标记主节点为下线。
  3. 选举领导者:哨兵节点选举出一个领导者负责故障转移。
  4. 故障转移:领导者将一个从节点晋升为主节点,其他从节点改为复制新主节点,并通知应用方。

3. 哨兵集群部署步骤

3.1 环境说明
角色 端口 IP 地址
master 6379 192.168.115.111
slave1 6380 192.168.115.111
slave2 6381 192.168.115.111
Sentinel1 26379 192.168.115.111
Sentinel2 26380 192.168.115.111
Sentinel3 26381 192.168.115.111
3.2 部署步骤
  1. 安装 Redis:同主从复制步骤(示例使用 Redis 7.2.3)。

  2. 配置主从集群

    • 主节点配置:min-slaves-to-write 2(确保至少 2 个从节点正常才允许写)。
    • 从节点配置:slaveof 192.168.115.111 6379 及密码。
  3. 配置哨兵节点

    bash

    复制代码
    mkdir -p /var/log/redis/
    vim /etc/redis/redis-sentinel-26379.conf  # 其他哨兵节点类似,修改端口即可

    配置内容:

    conf

    复制代码
    port 26379
    dir "/var/log/redis"
    logfile "26379.log"
    daemonize yes
    protected-mode no
    sentinel monitor mymaster 192.168.115.111 6379 2  # 2 表示至少 2 个哨兵认为主节点故障
    sentinel down-after-milliseconds mymaster 30000  # 30秒未响应标记为下线
    sentinel parallel-syncs mymaster 1  # 故障转移时同时同步的从节点数
    sentinel failover-timeout mymaster 180000  # 故障转移超时时间
    sentinel auth-pass mymaster 123456  # 主节点密码
  4. 启动哨兵集群

    bash

    复制代码
    redis-sentinel /etc/redis/redis-sentinel-26379.conf
    redis-sentinel /etc/redis/redis-sentinel-26380.conf
    redis-sentinel /etc/redis/redis-sentinel-26381.conf
  5. 验证哨兵状态

    bash

    复制代码
    redis-cli -h 192.168.115.111 -p 26379 info Sentinel

    输出中可查看主节点状态、从节点数及哨兵数。

4. 哨兵配置说明

  • daemonize yes:以守护进程模式运行。
  • protected-mode no:关闭保护模式,允许跨网络访问。
  • sentinel monitor:指定监控的主节点及故障判断阈值。
  • sentinel down-after-milliseconds:主节点无响应的超时时间。
  • sentinel parallel-syncs:故障转移时同步从节点的数量,影响转移效率。
  • sentinel auth-pass:主从节点的访问密码(需一致)。
相关推荐
lumi.3 小时前
前端本地存储技术笔记:localStorage 与 sessionStorage 详解
前端·javascript·笔记
旧雨散尘3 小时前
【react】初学react5-react脚手架搭建中的小众知识
前端·react.js·前端框架
炫饭第一名3 小时前
🌍🌍🌍字节一面场景题:异步任务调度器
前端·javascript·面试
烛阴3 小时前
Lua字符串的利刃:模式匹配的艺术与实践
前端·lua
奇舞精选3 小时前
一文了解 Server-Sent Events (SSE):构建高效的服务器推送应用
前端
Yeats_Liao3 小时前
Go Web 编程快速入门 11 - WebSocket实时通信:实时消息推送和双向通信
前端·后端·websocket·golang
纯爱掌门人3 小时前
鸿蒙状态管理V2实战:从零构建MVVM架构的应用
前端·harmonyos
丘耳3 小时前
vis-network 知识点笔记
前端·javascript
有点笨的蛋3 小时前
重新理解 Flexbox:让布局回归“弹性”的本质
前端·css