数据库是应用系统最重要的资产之一。在众多数据库技术中,Redis以其高性能和丰富的数据结构著称。本文将聚焦于如何通过部署哨兵(Sentinel)集群来为Redis服务提供高可用保障。
在了解哨兵原理之后,本小节将通过实际操作,搭建一个高可用的Redis哨兵集群。
架构设计
我们采用一主两从的经典架构,并部署三个哨兵节点进行监控。主从集群的搭建可参考相关教程,搭建成功后,在Master节点执行 info replication 命令,应能看到类似以下输出:
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=192.168.31.196,port=6379,state=online,offset=85,lag=1
slave1:ip=192.168.31.197,port=6379,state=online,offset=85,lag=2
master_repl_offset:85
repl_backlog_active:1
repl_backlog_size:268435456
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84
部署哨兵
哨兵配置文件在三个节点上基本一致,主要区别在于 bind 参数需要修改为当前节点的IP地址。请注意:哨兵启动后,会自动修改配置文件中的部分运行时信息。
以下是哨兵配置文件 /etc/redis-sentinel.conf 的核心内容示例:
# 哨兵端口
port 26379
# 后台运行
daemonize yes
# 日志文件
logfile "/var/log/redis/sentinel.log"
# 工作目录
dir "/tmp"
# 监控的主节点信息:
# mymaster:主节点名称(可自定义)
# 192.168.31.195 6379:主节点地址和端口
# 2:quorum值(至少需要2个哨兵同意才能判定客观下线)
sentinel monitor mymaster 192.168.31.195 6379 2
# 主节点密码(如果设置了requirepass)
sentinel auth-pass mymaster your_redis_password
# 主观下线时间(毫秒)
sentinel down-after-milliseconds mymaster 5000
# 故障转移超时时间(毫秒)
sentinel failover-timeout mymaster 60000
# 并行同步的从节点数量
sentinel parallel-syncs mymaster 1
# 绑定IP(改为当前节点的IP)
bind 192.168.31.195
启动哨兵
如果通过yum等包管理器安装的Redis,通常会附带哨兵服务,可以直接使用systemctl管理。
systemctl start redis-sentinel
systemctl enable redis-sentinel
查看哨兵信息
启动后,可以通过以下命令连接到任意哨兵节点查看状态:
redis-cli -h 192.168.31.195 -p 26379 info
在输出信息中,找到 Sentinel 部分,可以看到类似以下内容,表明哨兵已成功监控到1个主节点,该主节点有2个从节点,并且集群中有3个哨兵节点。
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.31.195:6379,slaves=2,sentinels=3
宕机测试与故障转移
现在,让我们模拟主节点宕机,来验证哨兵(Sentinel)集群的自动故障转移能力。你可以通过观察哨兵的日志文件(如 /var/log/redis/sentinel.log)来了解完整的选举过程。日志中会记录从客观下线判定到新主节点切换的全过程,下面是一个简化的示例:
1137:X 18 Jan 23:32:26.642 # -odown master mymaster 192.168.31.195 6379
...
1137:X 18 Jan 23:33:25.601 # +switch-master mymaster 192.168.31.195 6379 192.168.31.196 6379
1137:X 18 Jan 23:33:25.601 * +slave slave 192.168.31.197:6379 192.168.31.197 6379 @ mymaster 192.168.31.196 6379
1137:X 18 Jan 23:33:25.601 * +slave slave 192.168.31.195:6379 192.168.31.195 6379 @ mymaster 192.168.31.196 6379
从日志可以看到,主节点已从 192.168.31.195 切换到了 192.168.31.196。这个过程实际上隐藏了一个需要注意的“坑”,你发现了吗?
故障转移后的配置变化
故障转移完成后,哨兵会自动修改Redis节点的配置文件。
新Master节点的配置
查看新主节点(192.168.31.196)的配置文件,会发现原来指向旧主节点的 replicaof(或 slaveof)配置行已经被自动移除,它现在是一个独立的Master。

其他从节点的配置
另一个存活的从节点(192.168.31.197)的配置文件会被自动更新,其 replicaof 指令指向了新的主节点 192.168.31.196。

通过以上步骤,一个具备自动故障转移能力的Redis哨兵高可用集群就部署完成了。如果你想了解更多关于分布式系统和高可用的实践,欢迎到云栈社区的后端与架构板块交流探讨。
历史内容推荐
MongoDB 角色和权限,管理员,复制集,分片集群,wiredtiger,OpLog,纯内存引擎
PostgreSQL 权限,模式,块复制,逻辑复制,Patroni,物理备份,模式
MySQL crud,user,innodb,索引,主从,物理备份,系统表,视图,MariaDB
Elasticsearch(es) 倒排索引,分词,lucene,ELFK,索引,副本,分片,web管理
Hadoop HDFS dn,nn,jn,分块,副本,配额,快照,回收站,追加模式,Kerberos
RabbitMQ,虚拟主机,交换机,队列,绑定,持久化,镜像队列,网络分区,RocketMQ
Kafka-集群部署,Topic,分区,副本,生产者,消费者(组),持久化,顺序读写,零拷贝,扩容
ZooKeeper-集群部署和选举,读写流程,事务日志,数据和快照,ACL,4字命令,监控和备份
Squid,HAProxy,LVS,Keepalived,内网穿透FRP
Web服务器-Nginx反向代理,负载均衡,安全配置,日志,流量镜像,websocket,跨域
Kubernetes(k8s)-基本概念,部署,工作负载,服务,网络,存储,配置,调度,证书,监控
Docker-docker基本信息,基本命令,dockerfile,原理,仓库,存储网络日志,番外篇
云计算&虚拟化-包括服务器购买,虚拟化介绍,虚拟磁盘,虚拟网络,创建虚拟机,安装虚拟机
dashboard,xml解释,克隆,快照,初始化,esxi介绍
Linux进阶-硬件,日常运维,基础软件,日志,进阶命令,防火墙,shell,内核,初始化
Linux基础-包括文件的增删改查,磁盘管理,网络配置,用户配置,权限配置