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 端口,你的跨服务器哨兵集群就能像刚才单机测试时一样完美运行。

相关推荐
wenlonglanying23 分钟前
Ubuntu 系统下安装 Nginx
数据库·nginx·ubuntu
数据库小组29 分钟前
10 分钟搞定!Docker 一键部署 NineData 社区版
数据库·docker·容器·database·数据库管理工具·ninedata·迁移工具
爬山算法41 分钟前
MongoDB(38)如何使用聚合进行投影?
数据库·mongodb
l1t1 小时前
Deep Seek总结的APSW 和 SQLite 的关系
数据库·sqlite
Pocker_Spades_A2 小时前
基于代价模型的连接条件下推:复杂SQL查询的性能优化实践
数据库·sql·性能优化
huan1991102 小时前
Python使用PyMySQL操作MySQL完整指南
数据库·python·mysql
双星系统2 小时前
ABB机器人DSQC 679示教器电缆选型与故障排查(附原装型号对照表)
网络·数据库·机器人·工业4.0·工业机器人
炸炸鱼.2 小时前
Nginx 代理与缓存实战:正向、反向及网络层级详解
网络·nginx·缓存
TDengine (老段)2 小时前
TDengine 视图功能使用
大数据·数据库·servlet·时序数据库·tdengine·涛思数据
TDengine (老段)2 小时前
TDengine IDMP 运维指南 —— 部署架构
大数据·运维·数据库·架构·时序数据库·tdengine·涛思数据