# Sentinel 架构

URL: https://caijiao.org/redis/08-cluster/02-sentinel
Source: docs/redis/08-cluster/02-sentinel.md
Description: Redis Sentinel 架构实现了 Redis 的高可用性，自动故障转移，并且能够监控 Redis 实例的状态，确保系统的稳定运行。

Redis Sentinel 是 Redis 提供的一种高可用性解决方案。它通过监控 Redis 主从节点，自动检测故障，执行故障转移，并通知系统管理员或应用程序。在大型分布式 Redis 集群中，Sentinel 架构可以确保 Redis 系统的持续可用性，并且能够自动切换到新的主节点，避免因单点故障导致服务中断。

Redis Sentinel 由多个 Sentinel 实例组成，它们共同协作以管理 Redis 主节点和从节点的状态，并在主节点出现故障时执行自动故障转移。

## 1. Sentinel 架构概述

Redis Sentinel 架构主要由三个部分组成：

- **监控（Monitoring）**：Sentinel 实例持续监控主节点和从节点的健康状态。如果某个节点（尤其是主节点）不可用，Sentinel 会自动触发故障转移流程。
- **故障转移（Failover）**：当 Sentinel 检测到主节点故障时，它会自动选择一个从节点，并将其提升为新的主节点。然后，其他从节点将开始同步新的主节点。
- **通知（Notification）**：Sentinel 会在发生故障时向管理员发送通知（例如通过执行脚本或发送邮件），以便系统管理员可以及时响应。
- **客户端重定向（Client Redirection）**：客户端可以连接到 Sentinel，获取当前可用的主节点信息。当故障转移发生时，Sentinel 会提供新的主节点信息，确保客户端始终能够连接到最新的主节点。

Sentinel 通常运行在多个节点上，以避免单点故障。多个 Sentinel 实例之间会通过投票机制来确定是否进行故障转移。

## 2. Sentinel 架构的核心功能

### 2.1 监控功能

Sentinel 的第一个核心功能是监控 Redis 实例的状态。每个 Sentinel 实例会周期性地向 Redis 主节点和从节点发送 `PING` 命令来确认它们是否仍然可用。如果某个节点无法响应或在设定的时间窗口内没有发送 `PING` 响应，Sentinel 会将该节点标记为不可用状态，并进一步进行故障检测。

### 2.2 故障检测与故障转移

当 Sentinel 实例检测到 Redis 主节点出现故障时，会通过以下步骤进行故障转移：

1. **故障检测**：当 Sentinel 检测到主节点不可用时，它会通过其他 Sentinel 实例进行确认。只有在大多数 Sentinel 实例都认为主节点故障时，才会触发故障转移操作。
2. **选举新的主节点**：一旦 Sentinel 确定主节点故障，它将自动选择一个从节点，并将其提升为新的主节点。Sentinel 会考虑从节点的优先级、同步进度等因素，选择最合适的节点作为新的主节点。

3. **更新配置**：故障转移完成后，所有的从节点会开始同步新的主节点的数据，并且客户端连接会被重定向到新的主节点。

### 2.3 客户端重定向

Redis Sentinel 允许客户端直接连接到 Sentinel 节点，从 Sentinel 获取当前的主节点信息。当故障转移发生时，客户端只需要重新请求 Sentinel，获取新的主节点信息，并自动连接到新的主节点。这样可以确保客户端始终能够与最新的主节点进行交互，而无需手动干预。

### 2.4 通知机制

在故障发生时，Sentinel 可以通过执行预设的脚本来通知管理员。您可以通过以下配置项设置 Sentinel 发送通知的脚本路径：

```txt
sentinel notification-script mymaster /path/to/notify.sh
```

这些通知可以包括故障转移的相关信息，例如，哪个节点被提升为新的主节点，哪个节点出现了故障等。管理员可以根据这些信息采取相应的操作。

## 3. Sentinel 的配置与部署

### 3.1 配置 Sentinel 实例

要配置 Redis Sentinel，您需要为每个 Sentinel 实例创建一个单独的配置文件，通常命名为 `sentinel.conf`。以下是一个 Sentinel 配置文件的示例：

```txt
# 配置要监控的主节点
sentinel monitor mymaster 192.168.1.100 6379 2

# 设置主节点故障的检测时间
sentinel down-after-milliseconds mymaster 30000

# 设置故障转移过程中的超时
sentinel failover-timeout mymaster 180000

# 配置通知脚本
sentinel notification-script mymaster /path/to/notify.sh
```

其中，`sentinel monitor` 指定了 Sentinel 要监控的主节点和对应的从节点，`mymaster` 是主节点的名字，`192.168.1.100 6379` 是主节点的 IP 地址和端口号，`2` 表示至少需要 2 个 Sentinel 实例确认故障才能进行故障转移。

### 3.2 启动 Sentinel

启动 Sentinel 实例时，您可以通过以下命令启动：

```bash
redis-server /path/to/sentinel.conf --sentinel
```

通过该命令，Redis 会以 Sentinel 模式启动，并根据配置文件中的设置开始监控主节点。

### 3.3 部署多个 Sentinel 实例

为了实现高可用性，建议至少启动三个 Sentinel 实例来监控 Redis 集群。多个 Sentinel 实例可以通过投票机制来确定是否进行故障转移。部署多个 Sentinel 实例可以确保在单个 Sentinel 实例发生故障时，系统仍然能够继续运行。

### 3.4 配置客户端连接 Sentinel

客户端连接 Sentinel 来获取主节点信息的方式是通过 `SENTINEL get-master-addr-by-name` 命令。例如：

```bash
SENTINEL get-master-addr-by-name mymaster
```

该命令会返回当前主节点的 IP 地址和端口。客户端可以根据此信息自动连接到最新的主节点。

## 4. Sentinel 故障转移流程

当 Redis 主节点发生故障时，Sentinel 会执行以下步骤来完成故障转移：

1. **检测故障**：Sentinel 定期向主节点发送 PING 命令，检测其是否处于正常状态。当主节点无法响应时，Sentinel 会尝试其他 Sentinel 实例进行确认。

2. **选举新主节点**：当故障被确认后，Sentinel 会通过投票机制选举一个从节点作为新的主节点。选举的标准通常是选择同步进度最领先的从节点。

3. **更新从节点**：其他从节点会接收到新的主节点信息，并开始同步新的主节点数据。

4. **通知客户端**：通过 Sentinel，客户端能够获取到最新的主节点信息，确保其能够继续与主节点进行读写操作。

5. **恢复原主节点**：如果故障的原主节点恢复，Sentinel 会自动将其重新配置为从节点，并开始同步新的主节点。

## 5. Sentinel 的优势与限制

### 5.1 优势

- **高可用性**：通过自动故障转移，Redis Sentinel 能够在主节点发生故障时确保服务的连续性。
- **易于配置和部署**：Sentinel 配置简单，且可以通过脚本和命令灵活定制故障转移策略。
- **故障转移与自动恢复**：当主节点发生故障时，Sentinel 会自动选举新的主节点，并且恢复过程对客户端透明。
- **灵活的客户端连接**：客户端可以通过 Sentinel 获取当前的主节点信息，实现动态的连接管理。

### 5.2 限制

- **异步复制**：Redis Sentinel 基于异步复制机制，因此在故障转移时可能会丢失部分写操作。
- **性能开销**：当网络较差或 Sentinel 实例数量过多时，故障检测和投票机制可能会增加一定的性能开销。
- **依赖投票机制**：Sentinel 依赖于多个实例之间的投票机制来决定是否执行故障转移，因此需要合理部署和配置多个 Sentinel 实例，以确保系统的稳定性。

## 总结

Redis Sentinel 架构提供了一种高可用性的解决方案，通过自动监控和故障转移功能，使得 Redis 集群在主节点故障时依然能够保持高可用。通过合理配置和部署 Sentinel 实例，您可以确保 Redis 集群的稳定运行，并减少系统停机的风险。Redis Sentinel 的易用性和灵活性，使其成为企业生产环境中不可或缺的一部分。
