1. 架构
Redis Sentinel(哨兵)是 Redis 官方提供的高可用性解决方案,主要用于监控、管理、主动恢复 Redis 主从集群,确保服务在节点故障时仍能持续运行。
主从复制
Redis 的主从复制模式可以将主节点的数据同步给从节点。当主节点出现故障不可访问时,从节点作为后备,保证数据尽量不丢失。从节点还可以扩展主节点的读性能,分担主节点在大并发量时的读压力。
但这个模式也带来了一些问题:
- 一旦主节点出现故障,需要手动做很多操作:将一个从节点提升为主节点,修改客户端的主节点地址,配置其他从节点的主节点;
- 主节点的写能力受到单机的限制;
- 主节点的存储能力收到单机的限制;
Sentinel 架构
当主节点出现故障时,Redis Sentinel 能自动完成故障发现和故障转移,并通知客户端,实现高可用。
Sentinel 是一个分布式架构,包含若干个 Sentinel 节点和 Redis 数据节点,每个 Sentinel 节点会对数据节点和其余 Sentinel 节点进行监控。Sentinel 节点也是独立的 Redis 节点,但它不存储数据,只支持部分命令。
当 Sentinel 节点发现某个数据节点不可达时,对其做下线标识。当发现主节点不可达时,会和其他 Sentinel 节点进行协商,当它们大多数认为不可达时,推选一个 Sentinel 节点来完成故障转移工作,选出新的主节点,让其他从节点指向新的主节点,然后将变动通知给客户端。
Sentinel 节点之间使用 gossip 协议交换节点状态,通过 Raft 算法来选择领导者执行故障转移。
不足
Sentinel 无法保证故障转移时的零数据丢失,因为主从同步可能存在延迟。
Sentinel 的监控和通信会带来额外的开销,需评估可用性和性能的平衡。
2. 部署
Sentinel 节点的默认端口是 26379。
建议部署至少为 3 的奇数个 Sentinel 节点,避免脑裂问题。生产环境的各个 Sentinel 应该分布在不同的物理机上,下面例子使用不同端口号仅用于测试。
主节点
首先启动一个主节点。
配置文件:
# 6379.conf
port 6379
daemonize yes
logfile "6379.log"
dbfilename "dump-6379.rdb"
dir "/opt/redis/data/"
启动主节点:
redis-server 6379.conf
从节点
另外启动两个从节点。
配置文件:
# 6380.conf
port 6380
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/opt/redis/data/"
slaveof 127.0.0.1 6379
# 6381.conf
port 6381
daemonize yes
logfile "6381.log"
dbfilename "dump-6381.rdb"
dir "/opt/redis/data/"
slaveof 127.0.0.1 6379
启动从节点:
redis-server 6380.conf
redis-server 6381.conf
在主节点或从节点查看主从关系:
redis-cli 127.0.0.1 -p 6379 info replication
Sentinel 节点
启动三个 Sentinel 节点。
配置文件,三个节点的端口号不一样,其他的一样,mymaster 是主节点的别名。
# 26379.conf
port 26379
daemonize yes
logfile "26379.log"
dir /opt/redis/data
sentinel monitor mymaster 127.0.0.1 6379 2 # 主节点地址,判断主节点失败的节点数量
sentinel down-after-milliseconds mymaster 30000 # 主节点判定不可达的超时时间
sentinel parallel-syncs mymaster 1 # 故障转移时,复制操作的并行数
sentinel failover-timeout mymaster 180000 # 故障转移超时时间
启动 Sentinel 节点,有两种方式:
redis-sentinel 26379.conf
redis-server 26379.conf --sentinel