在分布式系统中,Redis 的高可用性至关重要。本文将详细介绍 Redis 主从复制的原理、部署以及哨兵(Sentinel)集群的部署与配置,帮助你构建稳定可靠的 Redis 高可用架构。
一、Redis 主从复制
1. 主从复制的意义
主从复制是 Redis 高可用的基础,通过将主节点的数据复制到从节点,实现数据备份和读写分离,不仅提高了系统的可用性,还能分担主节点的读压力。
2. 主从结构类型
- 一主一从:最简单的拓扑结构,用于主节点故障时从节点提供故障转移支持。可在从节点开启 AOF 持久化,避免影响主节点性能。
- 一主多从:主节点连接多个从节点,适合读占比较大的场景,通过读写分离分担主节点压力。但需注意写并发高时可能消耗过多主节点带宽。
- 树状主从:从节点可作为其他从节点的主节点,降低主节点负载,适用于主节点挂载多个从节点的场景。
3. 主从复制原理
3.1 复制流程
- 保存主节点信息 :从节点执行
slaveof命令后,保存主节点地址信息。 - 建立 socket 连接:从节点通过定时任务与主节点建立网络连接。
- 发送 ping 命令:检测主从网络及主节点可用性,失败则重连。
- 权限验证 :若主节点设置密码,从节点需通过
masterauth配置验证。 - 同步数据集:首次复制时通常进行全量同步,后续通过部分同步补充数据。
- 持续复制:主节点将写命令异步发送给从节点,保持数据一致。
3.2 复制类型
- 全量复制:初次复制时主节点发送全部数据给从节点,耗时较长,对网络和节点压力大。
- 部分复制:用于网络闪断等场景,主节点通过复制积压缓冲区补发丢失数据,降低开销(需 Redis 2.8+ 支持)。
3.3 关键组件
- 复制偏移量:主从节点分别记录已复制数据的字节长度,用于判断数据一致性。
- 复制积压缓冲区:主节点上的固定长度队列,保存最近写命令,用于部分复制。
- 主节点运行 ID:唯一标识主节点,从节点通过此 ID 识别主节点,主节点重启后 ID 改变会触发全量复制。
4. 主从复制部署步骤
-
环境准备:关闭防火墙、SELinux,确保主从节点网络互通。
-
安装 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 指定安装路径 -
生成配置文件和启动脚本 :
bash
cd utils/ ./install_server.sh # 按提示设置端口、配置文件路径等 -
配置主从关系 :
- 主节点:无需特殊配置,确保监听正确 IP。
- 从节点:修改配置文件,添加
slaveof 主节点IP 主节点端口,并配置masterauth(若主节点有密码)。
-
验证主从复制:主节点写入数据,从节点可读取即表示成功。
二、Redis Sentinel 哨兵集群
1. 哨兵的作用
主从复制存在手动故障转移的问题,哨兵集群通过自动监控、判断主节点故障并执行故障转移,解决了 Redis 的高可用问题。
2. 哨兵工作原理
- 监控:每个哨兵节点监控主从节点及其他哨兵节点。
- 判断故障:当主节点不可达时,哨兵节点协商达成一致后标记主节点为下线。
- 选举领导者:哨兵节点选举出一个领导者负责故障转移。
- 故障转移:领导者将一个从节点晋升为主节点,其他从节点改为复制新主节点,并通知应用方。
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 部署步骤
-
安装 Redis:同主从复制步骤(示例使用 Redis 7.2.3)。
-
配置主从集群 :
- 主节点配置:
min-slaves-to-write 2(确保至少 2 个从节点正常才允许写)。 - 从节点配置:
slaveof 192.168.115.111 6379及密码。
- 主节点配置:
-
配置哨兵节点 :
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 # 主节点密码 -
启动哨兵集群 :
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 -
验证哨兵状态 :
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:主从节点的访问密码(需一致)。