redis(四)搭建哨兵模式:一主二从三哨兵

一、哨兵模式简介

1.哨兵模式是干什么的

哨兵主要完成:故障监控->故障转移->通知客户端

哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点就是特殊的redis节点,不存储数据

数据节点:主节点和从节点都是数据节点

2.故障转移的机制

主观下线:由哨兵节点定期监控主节点是否出现了故障,每个哨兵节点每隔1秒会向主节点、从节点及其它哨兵节点发送一次ping命令做一次心跳检测。 如果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主观下线了

客观下线:当超过半数哨兵节点认为该主节点下线了,这样就客观下线了。

选举主哨兵节点 :此时哨兵节点会通过Raft算法〈选举算法)实现选举机制共同选举出一个哨兵节点为leader,来负责处理主节点的故障转移和通知。

主节点的选举

  1. 过滤掉不健康的(已下线的),没有回复哨兵ping响应的从节点
  2. 选择配置文件中从节点优先级最高的(replication-priority,默认值为100)
  3. 选择复制偏移量最大的,也就是复制最完整的从节点。

二、节点规划:主从搭建

主节点:6379

从节点:6380/6381

具体的主从搭建可以看redis(三)里面的主从复制相关内容。

三、哨兵部署:单服务器

1.在三个redis文件夹的redis.conf同目录下创建sentinel.conf

2.sentinel.conf配置

文件夹 6379 里的 sentinel.conf:

bash 复制代码
port 26379
#sentinel monitor <master-name主节点别名> <ip主节点ip> <redis-port主节点端口> <quorum表示至少需要多少个哨兵同意,才能认为主节点"真的挂了">
sentinel monitor mymaster 127.0.0.1 6379 2
daemonize yes
logfile "./sentinel.log"

文件夹 6380 里的 sentinel.conf:

bash 复制代码
port 26380
sentinel monitor mymaster 127.0.0.1 6379 2
daemonize yes
logfile "./sentinel.log"

文件夹 6381 里的 sentinel.conf:

bash 复制代码
port 26381
sentinel monitor mymaster 127.0.0.1 6379 2
daemonize yes
logfile "./sentinel.log"

3.修改所有的redis.conf

打开replica-announce-ip注释改成下面的:

bash 复制代码
replica-announce-ip "127.0.0.1"

4.启动哨兵

bash 复制代码
# 在 6379 文件夹
./redis-sentinel sentinel.conf

# 在 6380 文件夹
./redis-sentinel sentinel.conf

# 在 6381 文件夹
./redis-sentinel sentinel.conf

5.打开新的终端窗口,实时观察哨兵日志

右键当前窗口,复制会话,执行下面命令

bash 复制代码
cd /usr/local/redis/bin
tail -f sentinel.log

6.杀死主节点

bash 复制代码
[root@VM-0-16-centos bin]# ps aux|grep redis
root      3490  0.0  0.1 156552  2760 ?        Ssl  16:37   0:00 ./redis-server 0.0.0.0:6379
root      6761  0.0  0.1 162696  2768 ?        Ssl  16:38   0:00 ./redis-server 0.0.0.0:6380
root      9114  0.0  0.1 156552  2740 ?        Ssl  16:38   0:00 ./redis-server 0.0.0.0:6381
root      9660  0.0  0.0 112828   980 pts/0    S+   16:44   0:00 grep --color=auto redis
root     21455  0.1  0.1 153988  2652 ?        Ssl  16:42   0:00 ./redis-sentinel *:26379 [sentinel]
root     24395  0.1  0.1 153988  2668 ?        Ssl  16:42   0:00 ./redis-sentinel *:26380 [sentinel]
root     27688  0.1  0.1 153988  2572 ?        Ssl  16:42   0:00 ./redis-sentinel *:26381 [sentinel]
[root@VM-0-16-centos bin]# kill -9 3490

7.等待一段时间看哨兵日志

bash 复制代码
#发现主从节点
21455:X 31 Jan 2026 16:42:23.326 # +monitor master mymaster 127.0.0.1 6379 quorum 2
21455:X 31 Jan 2026 16:42:23.327 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
21455:X 31 Jan 2026 16:42:23.333 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
#发现邻居哨兵节点
21455:X 31 Jan 2026 16:42:41.222 * +sentinel sentinel 25b93d49c38c547d14468a5666f0988833ef6a6d 127.0.0.1 26380 @ mymaster 127.0.0.1 6379
21455:X 31 Jan 2026 16:42:58.948 * +sentinel sentinel 789e1b7f0c966f7087a6df0f84c0b3a3b2deb6a8 127.0.0.1 26381 @ mymaster 127.0.0.1 6379
#主观下线
21455:X 31 Jan 2026 16:44:57.042 # +sdown master mymaster 127.0.0.1 6379
21455:X 31 Jan 2026 16:44:57.138 # +new-epoch 1
21455:X 31 Jan 2026 16:44:57.140 # +vote-for-leader 789e1b7f0c966f7087a6df0f84c0b3a3b2deb6a8 1
#客观下线
21455:X 31 Jan 2026 16:44:57.143 # +odown master mymaster 127.0.0.1 6379 #quorum 2/2
21455:X 31 Jan 2026 16:44:57.143 # Next failover delay: I will not start a failover before Sat Jan 31 16:50:58 2026
#故障转移从6379换到了6381
21455:X 31 Jan 2026 16:44:57.573 # +config-update-from sentinel 789e1b7f0c966f7087a6df0f84c0b3a3b2deb6a8 127.0.0.1 26381 @ mymaster 127.0.0.1 6379
21455:X 31 Jan 2026 16:44:57.573 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6381
#重新认主
21455:X 31 Jan 2026 16:44:57.574 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
21455:X 31 Jan 2026 16:44:57.574 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
21455:X 31 Jan 2026 16:45:27.603 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381

8.验证

查看新主节点状态
bash 复制代码
./redis-cli -p 6381 info replication
查看 6380 是否自动"认主"
bash 复制代码
./redis-cli -p 6380 info replication

四、哨兵部署:多服务器

假设你的三台服务器 内网IP 如下:

  • 服务器 A (主):192.168.1.10

  • 服务器 B (从):192.168.1.11

  • 服务器 C (从):192.168.1.12

那么,三台服务器上的 sentinel.conf 应该统一改成这样:

bash 复制代码
# 1. 端口可以统一,也可以保留你的 26380,只要防火墙放行即可
port 26379

# 2. 必须改成主节点的真实 IP
sentinel monitor mymaster 192.168.1.10 6379 2

# 3. 运行模式和日志
daemonize yes
logfile "./sentinel.log"

# 4. 跨机部署强烈建议添加:告诉别人我的真实 IP
# 服务器 A 就写 A 的 IP,服务器 B 就写 B 的 IP
sentinel announce-ip 192.168.1.x 

# 5. 安全与绑定
bind 0.0.0.0
protected-mode no

除了改哨兵配置,你还需要去修改那三台服务器上的 redis.conf

  1. 从节点 (B 和 C) :replicaof 192.168.1.10 6379 (将当前的 Redis 实例设置为 192.168.1.10:6379 的"从节点")。

  2. 所有节点 (A, B, C)

    • bind 0.0.0.0 (允许跨机同步)。

    • protected-mode no。

    • replica-announce-ip <自己的ip>(告诉其他节点自己的地址)

确保防火墙打开了 6379 和 26379 端口,你的跨服务器哨兵集群就能像刚才单机测试时一样完美运行。

相关推荐
Albert Edison33 分钟前
【Python】学生管理系统
开发语言·数据库·python
heimeiyingwang4 小时前
企业供应链 AI 优化:需求预测与智能调度
大数据·数据库·人工智能·机器学习
山岚的运维笔记5 小时前
SQL Server笔记 -- 第73章:排序/对行进行排序
数据库·笔记·后端·sql·microsoft·sqlserver
XLYcmy5 小时前
智能体大赛 目录
数据库·ai·llm·prompt·agent·检索·万方
盟接之桥5 小时前
盟接之桥EDI软件:API数据采集模块深度解析,打造企业数据协同新引擎
java·运维·服务器·网络·数据库·人工智能·制造
闲人编程6 小时前
内存数据库性能调优
数据库·redis·字符串·高并发·哈希·内存碎片
l1t7 小时前
DeepSeek总结的PostgreSQL 19新功能:第一部分
数据库·postgresql
没有bug.的程序员8 小时前
Gradle 构建优化深度探秘:从 Java 核心到底层 Android 物理性能压榨实战指南
android·java·开发语言·分布式·缓存·gradle
青衫码上行9 小时前
高频 SQL 50题(基础版)| 查询 + 连接
数据库·sql·学习·mysql
Anastasiozzzz9 小时前
阿亮随手记:动态条件生成Bean
java·前端·数据库