Linux个人心得27 (redis哨兵模式实战)

OpenEuler Redis Sentinel 哨兵模式(一主二从 + 三哨兵)完整配置流程环境

Master(主机):192.168.95.88(Redis 端口 6379)Slave1:192.168.95.133(Redis 端口 6379)Slave2:192.168.95.131(Redis 端口 6379)Sentinel 端口:每台机器统一使用 26379(与 Redis 6379 端口不同,符合"配置不同端口"要求)操作系统:OpenEuler已完成主从复制(如果还未配置,请先执行上一次的主从步骤)不考虑 SELinux 和防火墙

架构说明:三台机器每台部署 1 个 Sentinel 实例(共 3 个哨兵),组成 Sentinel 集群。Sentinel 互相发现、共同监控 Master,quorum=2(至少 2 个哨兵同意才能执行故障转移)。

  1. 三台机器统一操作:准备 Sentinel 配置文件在 88、133、131 三台机器上全部执行: Bash# 备份(如果存在默认文件) sudo cp /etc/redis/sentinel.conf /etc/redis/sentinel.conf.bak 2>/dev/null || true

创建/覆盖 sentinel.conf(推荐使用此完整配置)

sudo cat > /etc/redis/sentinel.conf << 'EOF'

Sentinel 基本配置(端口与 Redis 不同)

port 26379bind 0.0.0.0protected-mode nodaemonize yes

日志和数据目录

logfile "/var/log/redis/sentinel.log"dir "/var/lib/redis"

监控 Master(关键配置)

mymaster 是自定义的集群名称,192.168.95.88 是当前 Master IP

6379 是 Redis 端口,2 是 quorum(3 个哨兵中至少 2 个同意才 failover)

sentinel monitor mymaster 192.168.95.88 6379 2

其他常用参数(推荐默认值)

sentinel down-after-milliseconds mymaster 10000sentinel failover-timeout mymaster 180000sentinel parallel-syncs mymaster 1sentinel deny-scripts-reconfig yesEOF

授权和目录权限

sudo chown redis:redis /etc/redis/sentinel.confsudo mkdir -p /var/log/redis /var/lib/redissudo chown -R redis:redis /var/log/redis /var/lib/redis

  1. 三台机器启动 Sentinel在 88、133、131 三台机器上全部执行: Bash# 启动 Sentinel(使用 --sentinel 参数) sudo redis-server /etc/redis/sentinel.conf --sentinel

或者使用 redis-sentinel 命令(效果相同)

sudo redis-sentinel /etc/redis/sentinel.conf

查看进程是否启动

ps -ef | grep sentinel

设置开机自启(推荐方式,创建 systemd 服务)

sudo tee /etc/systemd/system/redis-sentinel.service > /dev/null << 'EOF'UnitDescription=Redis SentinelAfter=network.target redis.service

ServiceType=simpleUser=redisGroup=redisExecStart=/usr/bin/redis-server /etc/redis/sentinel.conf --sentinelRestart=alwaysRestartSec=5LimitNOFILE=65535

InstallWantedBy=multi-user.targetEOF

sudo systemctl daemon-reloadsudo systemctl enable --now redis-sentinelsudo systemctl status redis-sentinel

  1. 详细验证过程(必须一步步操作)步骤①:验证 Sentinel 集群是否正常 在任意一台机器(推荐在 Master 88 上)执行: Bash# 连接任意 Sentinel redis-cli -h 192.168.95.88 -p 26379

查看 Sentinel 信息(关键命令)

INFO 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.95.88:6379,slaves=2,sentinels=3

在三台机器上都执行一次 INFO sentinel,确认每台 Sentinel 都看到:

sentinels=3(三个哨兵互相发现)slaves=2status=ok

步骤②:查看 Sentinel 对 Master/Slave 的监控状态Bashredis-cli -p 26379 SENTINEL mastersredis-cli -p 26379 SENTINEL slaves mymasterredis-cli -p 26379 SENTINEL sentinels mymaster预期:能看到 Master IP、两个 Slave、三个 Sentinel 信息全部正常。步骤③:故障转移(Failover)实测(最重要验证)

在 Master(88) 上停止 Redis(模拟宕机):Bashsudo systemctl stop redis立即在任意一台 Sentinel 上持续监控(新开终端):Bashredis-cli -p 26379 -h 192.168.95.88

INFO sentinel # 反复执行,观察 status 变化查看 Sentinel 日志(实时观察切换过程):Bashtail -f /var/log/redis/sentinel.log预期日志关键字(会出现):+sdown master mymaster ...(检测到 Master 下线)+odown master mymaster ...(客观下线)+new-epoch / +vote-for-leader+failover-end master mymaster ...(切换完成)+switch-master mymaster 192.168.95.88 6379 192.168.95.xxx 6379(新 Master 出现)

切换完成后验证(大约 10~30 秒后):在原来 Slave1(133)或 Slave2(131) 上查看角色(其中一台会变成 Master):Bashredis-cli -h 192.168.95.133

INFO replication

预期其中一台显示:role:master

在新 Master 上写入测试数据:Bashredis-cli -h <新Master-IP>

SET failover_test "Sentinel 切换成功"在另一个 Slave 上读取(确认同步):Bashredis-cli -h <另一个Slave-IP>GET failover_test

恢复旧 Master(验证自动变为 Slave):Bash# 在 88 上重启 Redissudo systemctl start redis等待 10 秒后检查:Bashredis-cli -h 192.168.95.88 INFO replication

预期:role:slave + master_host 指向新的 Master IP

  1. 客户端连接 Sentinel(生产推荐方式)客户端不再直接连 Redis IP,而是连 Sentinel 询问当前 Master: Bashredis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster

返回当前 Master 的 IP:端口

完成!

相关推荐
tntxia19 小时前
linux curl命令详解_curl详解
linux
扛枪的书生1 天前
Linux 网络管理器用法速查
linux
顺风尿一寸1 天前
Java Socket 内核之旅:从 SocketChannel.read() 到 tcp_recvmsg 与 epoll 的完整调用链路
linux
XIAOHEZIcode1 天前
Ubuntu 终端美化全栈指南:Bash 到 Kitty 踩坑实录
linux·ubuntu·命令行
唐青枫1 天前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux
用户3074596982072 天前
Redis 延时队列详解
redis
烤代码的吐司君2 天前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
AlfredZhao3 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
leeyi4 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent
戴为沐4 天前
Linux内存扩容指南
linux