Redis进阶 - 完整版
---
一、Redis哨兵(Sentinel)
1.1 什么是哨兵
主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费时费力,还会造成一段时间内服务不可用。
这不是一种推荐的方式,更多时候,我们优先考虑哨兵(Sentinel)模式。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
1.2 哨兵的作用
哨兵有两个作用:
- 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器
- 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
1.3 故障转移(FailOver)
"FailOver"的中文标准译法是"故障转移",是IT领域(尤其是高可用架构)的核心术语。
故障切换流程:
1)主观下线(Subjective Down, SDOWN)
哨兵1定期检测主节点(如心跳超时、无响应),发现主节点不可用,但仅代表哨兵1的主观判断(可能因网络问题误判),此时进入主观下线状态。
2)客观下线(Objective Down, ODOWN)
其他哨兵(如哨兵2、哨兵3)也检测到主节点不可用,且达到预设的投票阈值(如多数哨兵同意)时,哨兵集群通过内部投票确认主节点确实故障(客观下线)。
3)选举Leader哨兵
多个哨兵通过投票机制选出一个Leader哨兵(负责执行故障切换操作),其他哨兵仅参与决策,不直接操作。
4)执行Failover(故障切换)
Leader哨兵主导以下操作:
- 从所有从节点中选择一个最优从节点(如数据最完整、延迟最低的节点)提升为新主节点
- 将其他从节点重新配置为同步新主节点(通过SLAVEOF命令)
- 若原主节点恢复,将其降级为新主节点的从节点
5)通知客户端(透明化)
哨兵集群通过发布订阅模式(Pub/Sub)广播主节点变更信息,所有连接的客户端收到通知后,自动将请求路由到新主节点,对业务代码无感知。
1.4 部署实战
环境准备
配置3个哨兵和1主2从的Redis服务器来演示这个过程。
| 服务类型 | 是否是主服务器 | IP地址 | 端口 | 备注 |
|---|---|---|---|---|
| Redis 1 | 是 | 192.168.88.111 | 6379 | |
| Redis 2 | 否 | 192.168.88.112 | 6379 | |
| Redis 3 | 否 | 192.168.88.113 | 6379 | |
| Sentinel 1 | - | 192.168.88.111 | 26379 | 同Redis 1 |
| Sentinel 2 | - | 192.168.88.112 | 26379 | 同Redis 2 |
| Sentinel 3 | - | 192.168.88.113 | 26379 | 同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命令作用:
- 访问
https://download.redis.io/releases/redis-8.4.0.tar.gz;curl默认把响应写到终端,wget默认下载到文件。可据 HTTP 状态、响应内容或下载结果判断服务是否可访问。
- 使用
dnf包管理器执行install操作,对软件包进行安装、更新、删除或查询。
- 按选项打包或解包归档文件;
-c表示创建归档,-x表示解包,-f后面指定归档文件名。
- 这条命令用于打开并编辑文件。进入编辑器后需要保存退出,修改才会写回文件。
执行结果:
- 成功后目标文件会下载到当前目录或
-O指定的位置。
- 成功后软件包会按指定动作完成安装、更新、删除或查询;失败时检查仓库、网络和权限。
- 成功后会生成归档文件或把归档内容解压到目标目录;用
tar -tf 归档文件可查看归档内容。
- 编辑器会打开目标文件;保存并退出后文件内容才会改变。
- 成功后应以该命令实际输出、生成的文件或目标服务状态为准;失败时先阅读终端报错,再核对命令参数和运行环境。
关键参数:
注意事项:
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支持 |
---