redis哨兵集群详解
哨兵机制介绍
哨兵模式的优点
- 监控master库,当master库宕机后会自动进行选主切换;
- 切换过程是应用透明的,因此应用程序无法感知;
- 自动处理故障节点;
高可用原理
当主节点出现故障时,由 Redis Sentinel 自动完成故障发现和转移,并通知应用方,实现高可用性。其实整个过程只需要一个哨兵节点来完成,至少部署三个哨兵是为了保证哨兵的高可用,使用 Raft算法(选举算法) 实现选举机制,选出一个哨兵节点来完成转移和通知。

哨兵是如何进行定时监控任务的?
每个哨兵节点每10秒会向主节点和从节点发送info命令获取最新拓扑结构图,哨兵配置时只要配置对主节点的监控即可,通过向主节点发送info,获取从节点的信息,并当有新的从节点加入时可以马上感知到。
每个哨兵节点每隔2秒会向redis数据节点的指定频道上发送该哨兵节点对于主节点的判断以及当前哨兵节点的信息,同时每个哨兵节点也会订阅该频道,来了解其它哨兵节点的信息及对主节点的判断,其实就是通过消息订阅和发布来完成的。
每隔 1 秒每个哨兵会向主节点、从节点及其余哨兵节点发送一次 ping 命令做一次心跳检测,这个也是哨兵用来判断节点是否正常的重要依据。
Redis 哨兵选举流程(3 个当中,哪个是老大)
每个在线的哨兵节点都可以成为领导者,当它确认(比如哨兵 3)主节点下线时,会向其它哨兵发 is-master-down-by-addr 命令,征求判断并要求将自己设置为领导者,由领导者处理故障转移;
当其它哨兵收到此命令时,可以同意或者拒绝它成为领导者;如果哨兵 3 发现自己在选举的票数大于 50% 时,将成为领导者,如果没有超过,继续选举…
Redis 哨兵故障转移过程
由 Sentinel 节点定期监控发现主节点是否出现了故障,当主节点出现故障,此时 3 个 Sentinel 节点共同选举了 Sentinel03 节点为领导,负责处理主节点的故障转移。
- redis主节点挂了,将 slave01 脱离原从节点,升级主节点
- 将从节点 slave02 指向新的主节点
- 通知客户端主节点已更换
- 原主节点恢复之后,将原主节点变成从节点,指向新的主节点
部署哨兵集群
架构
主机 角色
10.0.0.123 主,哨兵01
10.0.0.124 从,哨兵02
10.0.0.125 从,哨兵03
先部署好一主两从
可以参考《redis主从复制详解》章节:https://www.cnblogs.com/zqfstack/p/19039931
配置哨兵
哨兵可以不和Redis服务器部署在一起,但一般部署在一起,所有哨兵节点使用相同的配置文件
# 创建配置文件,三个主机都配置
mkdir /data/redis/sentinel
mkdir /data/redis/sentinel/conf
mkdir /data/redis/sentinel/data
mkdir /data/redis/sentinel/log
cat /data/redis/sentinel/conf/sentinel.conf
# 基础配置
bind 0.0.0.0
port 16379
daemonize yes
logfile /data/redis/sentinel/log/redis-sentinel.log
dir /data/redis/sentinel/data
protected-mode no
# 哨兵配置
sentinel monitor redis_master 10.0.0.123 6379 2
sentinel down-after-milliseconds redis_master 10000
sentinel parallel-syncs redis_master 1
sentinel failover-timeout redis_master 15000
sentinel auth-pass redis_master 1qaz@WSX
启动三台哨兵
redis-sentinel /data/redis/sentinel/conf/sentinel.conf
netstat -lntup |grep 16379
tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 16966/redis-sentine
查看三个哨兵节点信息
redis-cli -p 16379
127.0.0.1:16379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis_master,status=ok,address=10.0.0.123:6379,slaves=2,sentinels=3
最后一行可以看到一个master主节点,两个salve节点状态,三个哨兵节点都正常。
验证是否会自动切换
手动停止主库运行,模拟主库宕机
systemctl stop redis
# 查看从库01:
127.0.0.1:6379> INFO REPLICATION
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.125,port=6379,state=online,offset=35934,lag=1
master_failover_state:no-failover
master_replid:4670ccaac1081c42fc01e6aef9ada7f1f9d8d41f
master_replid2:51b7a89015d1ce75482a6467ff57bf45d8dc404b
master_repl_offset:35934
second_repl_offset:31297
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:197
repl_backlog_histlen:35738
# 查看从库02:
127.0.0.1:6379> INFO REPLICATION
# Replication
role:slave
master_host:10.0.0.124
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:41953
slave_repl_offset:41953
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4670ccaac1081c42fc01e6aef9ada7f1f9d8d41f
master_replid2:51b7a89015d1ce75482a6467ff57bf45d8dc404b
master_repl_offset:41953
second_repl_offset:31297
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:41953
可以看到从库01成为了主节点,并且从库02的主库为新的主节点
手动修复宕机的主库,sentinel会自动发现
systemctl start redis
# 查看宕机的主库状态:
127.0.0.1:6379> INFO REPLICATION
# Replication
role:slave
master_host:10.0.0.124
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:60728
slave_repl_offset:60728
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
min_slaves_good_slaves:0
master_failover_state:no-failover
master_replid:4670ccaac1081c42fc01e6aef9ada7f1f9d8d41f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:60728
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:59024
repl_backlog_histlen:1705
可以看到恢复后成为了从库,主节点为master_host:10.0.0.124
并且我们可以看到哨兵监听的主库也自动发生了改变:

sentinel管理命令
PING
使用"PING"指令监测Redis或者sentinel实例是否正常工作,如果返回"PONG"说明是可以正常响应的!
redis-cli -p 16379 ##指定端口为sentinel
127.0.0.1:16379>
127.0.0.1:16379>
127.0.0.1:16379> ping
PONG
127.0.0.1:16379>
SENTINEL MASTERS
使用"SENTINEL MASTERS"指令列出所有被监视的主服务器
127.0.0.1:16379> SENTINEL MASTERS
1) 1) "name"
2) "redis_master"
3) "ip"
4) "10.0.0.124"
5) "port"
6) "6379"
7) "runid"
8) "c3be5003c7177b2cf7656c7888adb5243421a4c6"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "666"
19) "last-ping-reply"
20) "666"
21) "down-after-milliseconds"
22) "10000"
23) "info-refresh"
24) "3376"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "324664"
29) "config-epoch"
30) "1"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "15000"
39) "parallel-syncs"
40) "1"
SENTINEL slaves
使用"SENTINEL slaves "指令列出所有被监视的从服务器
127.0.0.1:16379> SENTINEL SLAVES redis_master
1) 1) "name"
2) "10.0.0.125:6379"
3) "ip"
4) "10.0.0.125"
5) "port"
6) "6379"
7) "runid"
8) "f703cd022b4508cd9e126661da7c8d18a8df5b70"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "652"
19) "last-ping-reply"
20) "652"
21) "down-after-milliseconds"
22) "10000"
23) "info-refresh"
24) "2994"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "364345"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "10.0.0.124"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "106350"
41) "replica-announced"
42) "1"
2) 1) "name"
2) "10.0.0.123:6379"
3) "ip"
4) "10.0.0.123"
5) "port"
6) "6379"
7) "runid"
8) "f118217c9021f2c7680a1e0e47ccc2e983126e10"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "753"
19) "last-ping-reply"
20) "753"
21) "down-after-milliseconds"
22) "10000"
23) "info-refresh"
24) "946"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "238239"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "10.0.0.124"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "106767"
41) "replica-announced"
42) "1"
SENTINEL failover
使用场景:主动维护主节点,需停机维护主节点时,手动触发故障转移,避免服务中断。
强制将一个主节点(master)切换到其从节点(slave),而无需等待 Sentinel 自动检测故障。
redis-cli -p 16379
127.0.0.1:16379> SENTINEL failover redis_master
之后验证主从角色是否发生改变
SENTINEL reset
强制重置 Sentinel 的监控状态。它可以清除 Sentinel 对某个主节点(master)或所有主节点的旧状态,重新发现其从节点(slaves)和 Sentinel 节点信息。
redis-cli -p 16379
127.0.0.1:16379> SENTINEL RESET redis_master
redis哨兵集群详解的更多相关文章
- Linux之Redis-redis哨兵集群详解
1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所 ...
- redis哨兵集群搭建
下载redis jar包redis-4.0.11.tar.gz放在/data/redis目录下 解压 命令:tar -zxvf redis-4.0.11.tar.gz 解压后如图所示 在/usr/lo ...
- Linux - redis哨兵集群实例
目录 Linux - redis哨兵集群实例 命令整理 配置流程 Linux - redis哨兵集群实例 命令整理 官网地址:http://redisdoc.com/ redis-cli info # ...
- helm部署Redis哨兵集群
介绍 Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现.故障自动转移.配置中心和客户端通知. 如下图: Redis Sentinel 故障转移过程: 从这 ...
- 11.Redis 哨兵集群实现高可用
作者:中华石杉 Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis mast ...
- python连接redis哨兵集群
一.redis集群模式有多种, 哨兵模式只是其中的一种实现方式, 其原理请自行谷歌或者百度 二.python 连接 redis 哨兵集群 1. 安装redis包 pip install redis 2 ...
- Redis哨兵集群搭建-Docker-Compose
title: Redis哨兵集群搭建(Docker-Compose) date: 2022-09-27 17:00:56 tags: - Redis 代码地址:https://github.com/l ...
- redis哨兵集群、docker入门
redis-sentinel主从复制高可用 Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果m ...
- redis哨兵集群+spring boot 2.×
Ubuntu集群构建篇 redis-cli:不跟参数,默认访问localhost:6379端口,无密码登陆 redis-cli -h ${host} -p ${port} -a ${password} ...
- Redis进阶实践之十 Redis哨兵集群模式
一.引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...
随机推荐
- ABAP中字符串相关比较
The following table shows the relational operators for comparisons between character-like operands ( ...
- 数据开发提效有秘诀!离线开发BatchWorks 六大典型场景拆解
回顾大数据的发展历程,一句话概括就是海量数据的高效处理.在当今快节奏.不断变化的市场环境下,优秀的开发效率已经成为企业数字化转型的必备条件. 数栈离线开发BatchWorks 是一款专注离线数据ELT ...
- 如何在FastAPI中玩转WebSocket消息处理?
扫描二维码 关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ 一.文本消息接收与发送 # 运行 ...
- 统计Excel单元格中某个字符出现的次数
具体目标:统计A列单元格"/"出现的次数. 方法:先计算A2单元格中字符个数,然后将"/"替换为空再次计算字符个数,最后两者相减. Substitute函数 S ...
- pm2启动nextjs项目
安装pm2 npm install -g pm2 yarn global add pm2 pm2启动项目 npm run xx,就可以写成:pm2 start npm -- run xx pm2 st ...
- GAMES 103 动画基础作业1 impulse 浅浅解析
简介 impulse 简单而言就是脉冲. 脉冲就是, 在碰撞的时候给一个脉冲. 导致其速度和角速度改变. pipeline Q&A 简述Vi 和 ViNew Vi 就是碰撞点速度的均值 ViN ...
- 与Bug较量:Codigger之软件项目体检Software Project HealthCheck来帮忙
在软件工程师的世界里,与 Java 小程序中的 Bug 作战是一场永不停歇的战役.每一个隐藏在代码深处的 Bug 都像是一个狡猾的敌人,时刻准备着给我们的项目带来麻烦. 最近,我就陷入了这样一场与 J ...
- SciTech-BigDataAIML-LLM-Agent:智能体 大模型LLM | 一文完全搞懂大模型Agent(智能体):Agent、Agent + RAG 生活与工作的不可或缺。
SciTech-BigDataAIML-LLM-Agent:智能体 大模型LLM | 一文完全搞懂大模型Agent(智能体) Agent.Agent + RAG 生活与工作的不可或缺. 电影<钢 ...
- gurobipy: Gurobi Optimizer is a mathematical optimization software library for solving mixed-integer linear and quadratic optimization problems
Project description The Gurobi Optimizer is a mathematical optimization software library for solving ...
- 2025年7月份实时最新获取地图边界数据方法,省市区县街道多级联动【文末附实时geoJson数据下载】
动态生成最新行政区划 GeoJSON 数据并结合 ECharts 实现地图下钻功能 在开发基于地图的数据可视化应用时,一个常见的挑战是获取准确且最新的行政区划边界数据(GeoJSON).许多现有的在线 ...