您好,登录后才能下订单哦!
# Redis中哨兵的原理是什么
## 一、哨兵模式概述
Redis Sentinel(哨兵)是Redis官方提供的高可用性(HA)解决方案,主要用于管理Redis主从架构中的故障自动转移。哨兵系统本质上是一个分布式系统,由多个Sentinel节点组成,共同监控Redis主从节点的健康状态,并在主节点故障时自动完成故障检测和转移。
### 1.1 基本功能
- **监控**:持续检查主从节点是否正常运行
- **通知**:当被监控节点出现问题时向管理员报警
- **自动故障转移**:主节点故障时自动将从节点升级为主节点
- **配置提供者**:为客户端提供服务发现功能
### 1.2 典型架构
+————+ +————+ +————+ | Sentinel 1 |<—–>| Sentinel 2 |<—–>| Sentinel 3 | +————+ +————+ +————+ | | | v v v +————+ +————+ +————+ | Master |<—–>| Replica 1 |<—–>| Replica 2 | +————+ +————+ +————+
## 二、核心工作原理
### 2.1 监控机制
#### 2.1.1 定期检查
每个Sentinel节点以每秒一次的频率向所有主从节点和其他Sentinel节点发送PING命令:
```python
def sentinel_ping():
while True:
for node in monitored_nodes:
response = send_ping(node)
if not response or response.timeout:
mark_node_as_down(node)
sleep(1)
当Sentinel节点发现某节点超过down-after-milliseconds
(默认30秒)未响应,会将该节点标记为”主观下线”。
当足够数量的Sentinel(由quorum
参数决定)都将某主节点标记为主观下线时,该节点会被标记为”客观下线”。
SENTINEL is-master-down-by-addr
命令请求成为领导者领导者Sentinel根据以下规则选择新主节点:
1. 排除不健康的从节点(连接断开、响应慢等)
2. 优先选择slave-priority
高的从节点
3. 选择复制偏移量(repl_offset)最大的从节点
4. 选择run_id字典序最小的节点(最终裁决条件)
SLAVEOF NO ONE
命令INFO
命令确认其已切换为主节点SLAVEOF
命令指向新主节点哨兵通过发布/订阅功能自动传播配置变更:
# 订阅所有哨兵消息
PSUBSCRIBE *
当故障转移完成后,哨兵会在__sentinel__:hello
频道发布新主节点信息,所有客户端和哨兵都会收到更新。
每个Sentinel与每个Redis节点建立两个连接:
- 命令连接:用于发送PING等命令
- 订阅连接:用于接收__sentinel__:hello
频道的消息
Sentinel节点间通过Gossip协议交换信息:
1. 每2秒通过SENTINEL hello
命令向监控同一主节点的其他Sentinel广播信息
2. 信息包含:
- Sentinel自身信息
- 主节点信息
- 其他已知Sentinel信息
{
"src_sentinel_id": "a1b2c3d4",
"src_ip": "10.0.0.1",
"src_port": 26379,
"master_name": "mymaster",
"master_ip": "10.0.0.5",
"master_port": 6379,
"master_config_epoch": 12
}
# sentinel.conf示例
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
参数说明:
- quorum
:判定客观下线所需哨兵数量
- down-after-milliseconds
:判定主观下线的超时时间
- parallel-syncs
:故障转移后同时同步的从节点数
- failover-timeout
:故障转移超时时间(毫秒)
哨兵会自动重写配置文件以保存当前状态:
+------------------------+
| 原始配置文件 |
| sentinel monitor ... |
+------------------------+
|
v
+------------------------+
| 运行时内存配置 |
| master1: { |
| ip: 10.0.0.1, |
| port: 6379, |
| slaves: [...] } |
+------------------------+
|
v
+------------------------+
| 重写后的配置文件 |
| sentinel known-slave...|
| sentinel config-epoch...|
+------------------------+
SENTINEL get-master-addr-by-name
命令当发生故障转移时:
// 伪代码示例
try {
executeCommand();
} catch (ConnectionException e) {
// 重新查询主节点地址
newMaster = sentinel.getMasterAddr();
reconnect(newMaster);
retryCommand();
}
down-after-milliseconds
值(网络环境决定)脑裂问题:
- 现象:网络分区导致出现多个主节点
- 解决方案:配置min-slaves-to-write
和min-slaves-max-lag
配置不一致:
- 定期检查sentinel ckquorum
命令输出
- 使用sentinel flushconfig
强制重写配置
// redis-sentinel.c
struct sentinelState {
dict *masters; // 监控的主节点字典
int tilt; // 是否处于TILT模式
uint64_t current_epoch; // 当前配置纪元
};
struct sentinelRedisInstance {
int flags; // 角色标识(主/从/哨兵)
char *name; // 实例名称
sentinelAddr *addr; // 网络地址
dict *sentinels; // 监控同一主节点的其他哨兵
};
哨兵主要事件处理流程:
1. 定时执行sentinelTimer
函数
2. 处理命令请求和网络事件
3. 执行定期任务(PING、INFO收集等)
特性 | Sentinel模式 | Cluster模式 |
---|---|---|
数据分片 | 不支持 | 支持 |
读写分离 | 支持 | 有限支持 |
故障检测速度 | 秒级 | 秒级 |
客户端复杂度 | 简单 | 较复杂 |
扩展性 | 垂直扩展 | 水平扩展 |
Redis哨兵通过分布式监控、自动故障转移和配置传播机制,为Redis主从架构提供了完善的高可用解决方案。其核心价值在于:
在实际生产中,合理配置的哨兵系统可以将Redis的可用性提升到99.99%以上,是构建可靠Redis服务的基石。 “`
这篇文章共计约2500字,详细介绍了Redis哨兵的原理、工作机制和实现细节,采用Markdown格式编写,包含代码块、表格等元素,可直接用于技术文档发布。需要调整字数或补充细节可随时告知。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。