Redis进阶 - 完整版

---

一、Redis哨兵(Sentinel)

1.1 什么是哨兵

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费时费力,还会造成一段时间内服务不可用。

这不是一种推荐的方式,更多时候,我们优先考虑哨兵(Sentinel)模式

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

1.2 哨兵的作用

哨兵有两个作用:

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

1.3 故障转移(FailOver)

"FailOver"的中文标准译法是"故障转移",是IT领域(尤其是高可用架构)的核心术语。

故障切换流程:

1)主观下线(Subjective Down, SDOWN)

哨兵1定期检测主节点(如心跳超时、无响应),发现主节点不可用,但仅代表哨兵1的主观判断(可能因网络问题误判),此时进入主观下线状态。

2)客观下线(Objective Down, ODOWN)

其他哨兵(如哨兵2、哨兵3)也检测到主节点不可用,且达到预设的投票阈值(如多数哨兵同意)时,哨兵集群通过内部投票确认主节点确实故障(客观下线)。

3)选举Leader哨兵

多个哨兵通过投票机制选出一个Leader哨兵(负责执行故障切换操作),其他哨兵仅参与决策,不直接操作。

4)执行Failover(故障切换)

Leader哨兵主导以下操作:

5)通知客户端(透明化)

哨兵集群通过发布订阅模式(Pub/Sub)广播主节点变更信息,所有连接的客户端收到通知后,自动将请求路由到新主节点,对业务代码无感知。

1.4 部署实战

环境准备

配置3个哨兵和1主2从的Redis服务器来演示这个过程。

服务类型是否是主服务器IP地址端口备注
Redis 1192.168.88.1116379
Redis 2192.168.88.1126379
Redis 3192.168.88.1136379
Sentinel 1-192.168.88.11126379同Redis 1
Sentinel 2-192.168.88.11226379同Redis 2
Sentinel 3-192.168.88.11326379同Redis 3
特别注意:使用Redis哨兵模式,最少需要3个节点(一主多从结构),这样至少能部署3个哨兵进程,从而保证共同投票选出新的主节点。

安装三台Redis

# 找到对应的安装包资源,使用wget命令下载,这里安装的8.4.0版本
# 安装包资源地址:https://download.redis.io/releases/
wget https://download.redis.io/releases/redis-8.4.0.tar.gz

# 上传Redis到Linux系统中
dnf install wget -y
wget https://download.redis.io/releases/redis-8.4.0.tar.gz

# 配置=>编译=>安装
tar -zxvf redis-8.4.0.tar.gz
cd redis-8.4.0
make && make PREFIX=/usr/local/redis install

# 添加redis到环境变量
vim /etc/profile
export PATH="$PATH:/usr/local/redis/bin"
source /etc/profile

# 过量使用内存设置为0!在低内存环境下,后台保存可能失败
vim /etc/sysctl.conf
vm.overcommit_memory = 1
sysctl -p

命令作用:

执行结果:

关键参数:

注意事项:

master主节点配置:


**关键参数:**

**注意事项:**



在配置文件中配置从服务:

注意事项:


执行结果:

role:slave master_host:192.168.88.111 master_port:6379 master_link_status:up slave_repl_offset:0 slave_read_only:1


设置读写分离:

**注意事项:**

+PONG

[Unit] After=network.target

[Service] Type=forking PrivateTmp=true

[Install] WantedBy=multi-user.target


**注意事项:**

注意事项:

(0.68s)


**注意事项:**

注意事项:


**命令拆解:**

| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `redis.conf` | 【普通】 | 配置文件路径,命令会读取这个文件里的配置。 |

**注意事项:**



注意事项:


**命令拆解:**

| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `./redis-server` | 【普通】 | `./redis-server` 是这行命令的主程序,决定这条命令要调用哪个工具。 |
| `../cluster/7000/redis.conf` | 【普通】 | 配置文件路径,命令会读取这个文件里的配置。 |
| `../cluster/7001/redis.conf` | 【普通】 | 配置文件路径,命令会读取这个文件里的配置。 |
| `../cluster/7002/redis.conf` | 【普通】 | 配置文件路径,命令会读取这个文件里的配置。 |

**注意事项:**



命令拆解:

命令部分重要程度详细解释
./redis-cli普通./redis-cli 是这行命令的主程序,决定这条命令要调用哪个工具。

注意事项:


**命令拆解:**

| 命令部分 | 重要程度 | 详细解释 |
|---|---|---|
| `./redis-cli` | 【普通】 | `./redis-cli` 是这行命令的主程序,决定这条命令要调用哪个工具。 |
| `-p` | 【核心】 | `-p` 的含义取决于当前命令,不能直接套用 Docker 端口映射解释。 |

**注意事项:**

cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:2 cluster_stats_messages_ping_sent:1363 cluster_stats_messages_pong_sent:1353 cluster_stats_messages_sent:2716 cluster_stats_messages_ping_received:1348 cluster_stats_messages_pong_received:1363 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:2716


检查集群状态:

命令拆解:

命令部分重要程度详细解释
./redis-cli普通./redis-cli 是这行命令的主程序,决定这条命令要调用哪个工具。

注意事项:

集群最大可增加1000个节点,性能随节点增加而线性扩展。

同步原理:

Redis集群会把数据存在一个master节点,然后在这个master和其对应的slave之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的master节点获取数据。只有当一个master挂掉之后,才会启动一个对应的slave节点,充当master。

架构细节:

redis-cluster选举/容错:

---

特性哨兵(Sentinel)集群(Cluster)
架构模式1主多从多主多从
高可用支持自动故障转移支持自动故障转移
数据分片不支持支持(16384个slot)
水平扩展不支持支持
最少节点3个(1主2从)6个(3主3从)
故障切换速度10-30秒更快(无需切换)
适用场景中小型项目大型项目、高并发
复杂度中等较高
客户端支持需要Sentinel支持需要Cluster支持

---