Redis:安装、主从复制、Sentinel 哨兵、Cluster 集群

一、Redis简介

(一)什么是Redis?

Redis(Remote Dictionary Server)是一款基于内存的高性能 Key-Value NoSQL 数据库,支持持久化,提供丰富的数据结构与多种高级特性。得益于其基于内存读写的特性,Redis 能够提供极高的吞吐量与低延迟,广泛应用于缓存、分布式锁、消息队列、Session 管理等业务场景。


(二)Redis的数据结构

Redis 具备多种高效的数据结构,常用如下:

String(字符串):最常见的数据类型,可存储文本或数字。

Hash(哈希表):类似于键值对象,适合存储结构化数据。

List(列表):有序字符串列表,支持 push/pop 等操作,常用于消息队列。

Set(无序集合):不重复的字符串集合,支持交并差集运算。

Sorted Set(有序集合):每个成员都有一个 score,可按 score 排序,常用于排行榜。


(三)Redis的核心特性

**安全性机制:**密码认证、ACL(访问控制列表)

**多种数据结构:**内置十余种核心与高级数据结构。

**事务机制:**支持 multi/exec,保证命令的原子性。

**持久化支持:**RDB、AOF 两种持久化方式确保数据安全。

**主从复制(Replication):**实现数据冗余、读写分离、负载均衡。

**哨兵(Sentinel):**实现主从故障检测与自动主备切换。

**集群(Cluster):**实现分布式存储与高可用。

**Lua 脚本执行:**在服务端执行脚本,提高复杂业务的原子性与效率。

**慢查询日志(Slowlog):**帮助分析性能瓶颈。


(四)Redis 的安装与环境准备

以下操作基于 Ubuntu。

1. 下载 Ubuntu 镜像

https://ubuntu.com/download/desktop

下载完成之后选择虚拟机的ISO映像文件

​​

2. 获得ip

​​

3. 配置 SSH,方便通过 MobaXterm 登录

复制代码
sudo apt update
sudo apt install openssh-server -y
sudo systemctl enable ssh
sudo systemctl start ssh

更新软件源

安装 SSH 服务

设置 SSH 服务开机自启

立即启动 SSH 服务

确保 Ubuntu 能被 MobaXterm 正常 SSH 登录。

​​

​​

​​

​​

​​


4. 安装Redis

Ubuntu 官方源提供 Redis,可直接安装:

复制代码
sudo apt update
sudo apt install redis-server -y

​​

检查 Redis 服务状态:

复制代码
sudo systemctl status redis-server

​​

如果看到 active (running),说明已经成功运行了。

测试 Redis 是否可用:

复制代码
redis-cli

出现:

复制代码
127.0.0.1:6379>

​​

说明成功进入 Redis。


可以使用keys *来查看当前redis下有多少个key

​​

添加相应的key,测试

​​


二、Redis 主从部署(Master-Slave Replication)

(一)主从复制概念(读写分离、负载均衡基础)

主从复制(Master-Slave Replication)指的是:将一台 Redis 服务器的数据,自动同步到另一台或多台 Redis 服务器。

其中:

主节点(Master):负责处理所有写操作,并把数据同步给从节点

从节点(Slave):只能读,不能写,负责复制并保持与主节点的数据一致

数据同步是单向的,只能从主节点 → 从节点。默认情况下,每个 Redis 启动时都是主节点。从节点只能指定一个主节点,但一个主节点可以拥有多个从节点。


(二)主从复制的意义

主从结构带来了多方面的优势:

1. 数据冗余

在持久化机制之外,再提供一份"热备份"数据,提高数据安全性。

2. 故障恢复

当主节点宕机时,从节点可继续提供读服务,人工或借助哨兵实现快速恢复。

3. 负载均衡(读写分离)

主库处理写操作

从库承担读操作

特别是"多读少写"的业务场景,可通过扩展从库显著提升系统的吞吐量。

4. 高可用架构的基础

Redis Sentinel(高可用)和 Redis Cluster(分布式)都依赖主从复制,因此主从搭建是 Redis 高可用体系的基础环节。


(三)主从复制的缺点

1. 复制延迟

所有写入都必须先在主节点执行,然后异步同步给从节点。

当 Redis 压力较大时,从节点数据会出现滞后;从节点越多,延迟越明显。

2. 主节点宕机无法自动切换

默认情况下,从节点不会自动提升为主节点,故障时必须人工处理(使用 Sentinel 才能自动化)。


(四)主从部署实操(单机模拟 1 主 2 从)

以下示例在同一台机器上运行 3 个 Redis 实例:

主节点:6380

从节点:6381、6382

因此,每个实例都需要自己的配置文件和数据目录。


1.创建相应目录

2. 创建主节点(master)

(1)创建配置文件
复制代码
nano redis.conf

​​

写入:

复制代码
port 6380
daemonize no
dir /home/xiaoman/software/redis/master
appendonly yes

配置项说明

1)port 6380

Redis 的服务端口。多个实例必须使用不同端口。

2)daemonize no

是否后台运行:

no:前台模式(窗口被占用)

yes:后台模式(推荐生产环境)

如需后台运行,可改为:

daemonize yes

3)dir ...

Redis 工作目录,AOF、RDB 文件会写在这里,目录必须事先创建。

4)appendonly yes

开启 AOF 持久化,提高数据可靠性。

退出并保存:

复制代码
Ctrl + X
Y
回车

(2)启动主节点(前台运行)
复制代码
redis-server redis.conf

2. 创建从节点(slave1)

复制代码
nano ~/software/redis/slave1/redis.conf

写入:

复制代码
port 6381
daemonize no
slaveof 127.0.0.1 6380
dir /home/xiaoman/software/redis/slave1
appendonly yes

启动:

复制代码
redis-server ~/software/redis/slave1/redis.conf

3. 创建从节点(Slave 2)

复制代码
nano ~/software/redis/slave2/redis.conf

写入:

复制代码
port 6382
daemonize no
slaveof 127.0.0.1 6380
dir /home/xiaoman/software/redis/slave2
appendonly yes

启动:

复制代码
redis-server ~/software/redis/slave2/redis.conf

(五)为什么需要单独的 redis.conf?

因为你运行多个 Redis 实例,必须做到:

端口不同(6380 / 6381 / 6382)

工作目录不同(避免文件冲突)

配置 slaveof(从库必须指定主库)

不能共用系统默认配置文件

否则实例会发生冲突无法启动。


(六)验证主从复制是否成功

1. 查看主节点复制信息

复制代码
redis-cli -p 6380 info replication

可以看到从节点的状态。

2.进一步验证复制功能

在 master(6380)上 set 一个 key

复制代码
redis-cli -p 6380 set name cheng

让redis后台运行,把daemonize 改为 yes

3. 查看 slave1(6381)是否同步到数据

复制代码
redis-cli -p 6381 get name

4. 查看 slave2(6382)是否同步到数据

复制代码
redis-cli -p 6382 get name

两个slave节点都返回了"cheng",说明主从复制成功。

每个 Redis 实例必须端口不同,否则会冲突

如果 master 用 daemonize no,终端会被占用,需要另开窗口做 redis-cli 测试

从节点必须先启动,并配置 replicaof <master-ip> <master-port>

(七)验证从节点不能写

尝试写入从节点:

复制代码
redis-cli -p 6381 set test_slave_write 1
redis-cli -p 6382 set test_slave_write 1

从节点会报错,说明只读状态生效。


三、哨兵部署(Sentinel)

主从复制虽然能够提供数据冗余和读负载分担,但并不能真正实现高可用。一旦主节点(Master)宕机,主从架构本身不会自动完成主备切换,需要人工介入。因此 Redis 引入了 哨兵模式(Sentinel) 来实现故障监控和自动主从切换。


(一)哨兵模式的工作原理

哨兵模式通过运行在独立节点上的哨兵进程,对 Redis 主从架构进行实时监控,并在主节点故障时执行自动化的故障转移(failover)。

哨兵主要负责四项工作:

1. 哨兵自身的选举(Leader 选举)

哨兵启动后,多个哨兵通过选举机制确定一个领导者(Leader Sentinel),由其负责协调故障转移。

选举流程说明:

每个哨兵可以请求成为 leader,并向其他哨兵发送 is-master-down-by-addr 请求。

其他哨兵会根据自身判断决定是否投票同意。

当某个哨兵获得的票数 ≥ sentinel 总数/2 + 1 时,它被选为 leader。

若未达成多数票,则继续选举。

2. 监控主从节点状态

哨兵会周期性发送命令检查 Redis 主节点和从节点的健康状况,包括:

主节点是否可用;

从节点是否正常同步;

网络延迟是否在可接受范围。

当一个哨兵判断 master 无响应,它认为 master 主观下线(SDown)。

3. 故障转移(Failover)

当多个哨兵共同确认 master 已经不可用(达到 quorum),master 将被标记为客观下线(ODown),leader 哨兵会开始执行故障转移流程:

故障转移步骤:

(1)过滤掉不健康的 slave;

(2)优先选择:

从节点优先级最高;

数据同步最完整(复制偏移量最大)的从节点;

(3)将其升级为新的 master;

(4)让其他 slave 自动指向新 master;

(5)更新哨兵集群中的 master 信息。

这一过程完全自动完成,无需人工干预。

4. 客户端重定向

故障转移完成后:

哨兵会通知客户端新的 master 地址;

客户端只需连哨兵,不需要关心 master 的具体位置;

这保证了 master 切换后客户端仍能正常访问。


(二)哨兵部署步骤

目前的环境已经有了:

端口 用途
6380 Redis master
6381 Redis slave1
6382 Redis slave2

下面开始创建 3 个哨兵节点。


1. 创建目录

复制代码
mkdir -p /home/xiaoman/software/redis/sentinel
cd /home/xiaoman/software/redis/sentinel


2. 创建三个哨兵配置文件

(1) sentinel1.conf(端口 26379)
复制代码
port 26379
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

(2)sentinel2.conf(端口 26380)
复制代码
port 26380
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

(3)sentinel3.conf(端口 26381)
复制代码
port 26381
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1


3. 启动哨兵

进入目录:

复制代码
cd /home/xiaoman/software/redis/sentinel

启动三个哨兵:

复制代码
redis-server sentinel1.conf --sentinel
redis-server sentinel2.conf --sentinel
redis-server sentinel3.conf --sentinel

终端会看到哨兵成功启动并开始监控 master


(三)哨兵模式测试

测试1:查看监控信息

运行:

复制代码
redis-cli -p 26379 sentinel master mymaster

主要字段说明:

字段 当前值 说明
name "mymaster" master 的名字(哨兵监控的标识)
ip "127.0.0.1" master IP
port "6380" master 端口
flags "master" master 的角色标志,目前状态正常为 master
num-slaves 2 这个 master 下面有 2 个从节点(6381、6382)
num-other-sentinels 2 除了当前哨兵,还有另外 2 个哨兵在监控这个 master
quorum 2 达到 quorum 才会进行 failover(你配置的 2)
failover-timeout 60000 自动 failover 的超时时间(ms)
parallel-syncs 1 failover 时从节点与 master 并行同步数量

当前返回信息显示 master 6380 健康,两个从节点正常,三个哨兵互相通信正常


测试2:手动杀死 master,看是否自动切换

停止 master 6380:

复制代码
redis-cli -p 6380 shutdown

观察哨兵日志(26379/26380/26381):

先检测到主观下线(SDown)

多个哨兵确认后标记为客观下线(ODown)

哨兵选举 leader

leader 选择新 slave 作为 master

测试3:确认新的主节点是谁

复制代码
redis-cli -p 26379 sentinel master mymaster

输出为:


测试4:从节点自动跟随新master

查看redis信息(查看6381):

复制代码
redis-cli -p 6381 info replication

测试 5:客户端自动切换验证

客户端不需要直接连 master,而是查询哨兵:

复制代码
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster

master 切换后,这里会自动返回新的 master 地址 ------ 客户端自动修复成功。

为什么客户端要连接到 26379?

因为哨兵的功能是:

监控 master 状态

在 master 宕机后执行 failover

告诉客户端当前的 master 是谁

所以客户端不应该直接连 Redis master(因为 master 会变),而应该连哨兵。


三、Redis 集群部署(Cluster)

Redis Cluster 是 Redis 官方提供的分布式部署方式,通过 分片(Sharding)+ 主从复制 + 自动故障转移,实现:

大数据量存储(突破单机内存限制)

高吞吐读写能力(多主节点并行处理)

高可用(主节点故障自动切换)

一个 Redis Cluster 至少需要 3 个 master 节点 (负责写入),并通常为每个 master 配备一个 slave,实现 三主三从架构


(一)Redis 集群的作用

1. 数据分区(分片)

Redis Cluster 使用 分片(Sharding) 机制,将数据分散到多个主节点中:

Redis 将整个 key 空间划分为 16384 个槽(slot 0--16383)

每个 master 会分配到一定范围的槽

键值通过 CRC16(key) % 16384 决定落在哪个槽

示例(三主集群):

节点 负责的槽范围
Master A 0--5460
Master B 5461--10922
Master C 10923--16383

优势:突破单机内存限制、多主节点并行读写。


2. 高可用(自动故障转移)

Redis Cluster 内置高可用能力:

每个 master 都可以有对应的 slave

master 宕机后,由 slave 自动升级为新的 master

自动恢复服务,无需人工干预

示例结构:

主节点 从节点
A A1
B B1
C C1

如果 B 宕机 → B1 自动升级为 master。

若 B 和 B1 都宕机 → Cluster 不可用(因为缺少槽位)。


(二)Redis 集群分片机制

Redis Cluster 定义 16384 个哈希槽(hash slots):

写入 key 时先计算 CRC16 值

再与 16384 取余

根据余数找到对应槽,从而知道属于哪个节点

例如:

复制代码
key = "name"
CRC16("name") = X
slot = X % 16384

集群根据槽分布自动跳转存取目标节点。


(三)Redis 集群部署步骤(三主三从)

目录结构如下:

复制代码
cluster/
  master1-7000/
  slave1-7001/
  master2-7002/
  slave2-7003/
  master3-7004/
  slave3-7005/

1. 创建目录

复制代码
mkdir -p /home/xiaoman/software/redis/cluster/master1-7000
mkdir -p /home/xiaoman/software/redis/cluster/slave1-7001
mkdir -p /home/xiaoman/software/redis/cluster/master2-7002
mkdir -p /home/xiaoman/software/redis/cluster/slave2-7003
mkdir -p /home/xiaoman/software/redis/cluster/master3-7004
mkdir -p /home/xiaoman/software/redis/cluster/slave3-7005


2. 创建 6 个 Redis 配置文件

(1)master1-7000/redis.conf
复制代码
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1


(2)slave1-7001/redis.conf
复制代码
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1


(3)master2-7002/redis.conf
复制代码
port 7002
cluster-enabled yes
cluster-config-file nodes-7002.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1


(4)slave2-7003/redis.conf
复制代码
port 7003
cluster-enabled yes
cluster-config-file nodes-7003.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1


(5)master3-7004/redis.conf
复制代码
port 7004
cluster-enabled yes
cluster-config-file nodes-7004.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1


(6)slave3-7005/redis.conf
复制代码
port 7005
cluster-enabled yes
cluster-config-file nodes-7005.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
bind 127.0.0.1

注意:所有节点都启用 cluster-enabled yes,并且 daemonize yes,方便后台运行。


3. 启动六个节点

复制代码
redis-server /home/xiaoman/software/redis/cluster/master1-7000/redis.conf
redis-server /home/xiaoman/software/redis/cluster/slave1-7001/redis.conf
redis-server /home/xiaoman/software/redis/cluster/master2-7002/redis.conf
redis-server /home/xiaoman/software/redis/cluster/slave2-7003/redis.conf
redis-server /home/xiaoman/software/redis/cluster/master3-7004/redis.conf
redis-server /home/xiaoman/software/redis/cluster/slave3-7005/redis.conf

检查 Redis 是否真的启动成功

执行

复制代码
ps -ef | grep redis


4. 创建 Redis 集群

复制代码
redis-cli --cluster create \
127.0.0.1:7000 \
127.0.0.1:7002 \
127.0.0.1:7004 \
127.0.0.1:7001 \
127.0.0.1:7003 \
127.0.0.1:7005 \
--cluster-replicas 1

上述命令含义:

前 3 个是 master

后 3 个自动成为各自对应 master 的 slave

--cluster-replicas 1 → 每个 master 分配一个从节点

​输入 yes 即可

使用 redis-cli 自动创建配置文件的方式

复制代码
redis-cli --cluster create ... --cluster-replicas 1 --cluster-yes

可避免输入 yes


(四)集群测试

1. 写入测试

复制代码
redis-cli -c -p 7000 set name cheng

-c:表示使用 cluster 模式,会自动跳转槽位所在节点。

看到ok就代表写入成功。


2. 测试数据是否被自动路由到槽位(slot 跳转)

使用 slave 或其他节点读:

复制代码
redis-cli -c -p 7003 get name

必须带 -c,因为 cluster 模式会自动重定向(MOVE)。

如果返回 cheng 即正常


3. 查看 key 属于哪个槽位

复制代码
redis-cli -p 7000 cluster keyslot name


4. 查看槽位分布

复制代码
redis-cli -p 7000 cluster slots

会看到 3 个 master 分别分到 0--5460,5461--10922,10923--16383。

因为 Redis Cluster 的槽位(slots)是固定的 16384 个,集群有 3 个 master,Redis 会自动把这 16384 个槽平均分成 3 份。

为什么会平均分?

因为创建集群的时候执行了 redis-cli --cluster create ... --cluster-replicas 1


5. 查看节点角色(master/slave)

复制代码
redis-cli -p 7000 cluster nodes

可以看到:

7000、7002、7004 是 master

7001、7003、7005 是 slave


(五)集群故障转移测试

1. 杀掉一个master

例如 kill master 7000:

复制代码
ps -ef | grep 7000
kill -9 <pid>

或者

复制代码
redis-cli -p 7000 shutdown


2. 检查是否有自动 failover

查看 slave 是否被提升为新的 master:

复制代码
redis-cli -p 7001 cluster nodes

​可以看到slave 自动接管说明集群正常


3. 再重新启动旧 master,看是否自动变成 slave

重新启动 7000 节点:

复制代码
redis-server /home/xiaoman/software/redis/cluster/master1-7000/redis.conf

查看角色:

复制代码
redis-cli -p 7003 cluster nodes

旧 master 会 自动降级为 slave。


(六)集群健康状态检查

复制代码
redis-cli -p 7000 cluster info

cluster_state

ok:集群正常

fail:集群不可用(主节点缺失或槽位不完整)

cluster_slots_assigned / cluster_slots_ok

Redis 总共有 16384 个槽位

两者都为 16384 表示所有槽位正常分配

cluster_slots_pfail / cluster_slots_fail

pfail:主观下线(可能故障)

fail:客观下线(多数节点判定故障)

都应为 0,否则集群可能不可用

cluster_known_nodes

集群已识别的节点数量

典型 3 主 3 从集群应为 6

cluster_size

主节点数量(masters)

此处为 3

cluster_current_epoch / cluster_my_epoch

集群的版本号,用于处理 failover

递增正常,无需特别关注

cluster_stats_messages_sent / received

节点之间发送的心跳消息(ping/pong)

数值对称说明节点通信正常

total_cluster_links_buffer_limit_exceeded

通信 buffer 是否溢出

0 为最佳状态,大于 0 表示可能出现网络延迟或阻塞


四、总结

本文梳理了 Redis 在不同业务规模下的典型部署方式,包括安装、主从复制、Sentinel 哨兵机制以及 Cluster 集群架构。随着业务对高可用性与可扩展性的要求不断提升,Redis 的部署也呈现出由简单到复杂、由单节点到分布式的演进路径。

单机模式 是 Redis 的基础形态,部署简单,但不具备容错能力。

主从复制 提供数据冗余与读写分离机制,但仍然无法解决主节点故障带来的服务不可用风险。

Sentinel 哨兵 在主从架构基础上引入自动故障转移能力,实现了高可用部署,是生产环境常用方案。

Cluster 集群 则通过槽位(slot)分片机制实现水平扩展,在保证高可用的同时支持大规模数据存储与高吞吐访问。

通过对以上模块的逐步构建,可以形成一个从基础可用、高可用到分布式可扩展的完整 Redis 架构体系。

相关推荐
白帽子黑客杰哥2 小时前
CTF Web题目常用考点与解题技巧合集
前端·数据库·web安全·网络安全·ctf·信息收集
CN-Dust2 小时前
MongoDB|Windows版安装教程(附资源)
数据库·windows·mongodb
落日漫游2 小时前
MySQL vs Redis vs MongoDB:三大数据库
数据库·redis·sql
程序边界2 小时前
金仓数据库助力Oracle迁移的深度体验:PL/SQL与函数支持全解析
数据库·sql·oracle
杜子不疼.2 小时前
AI Ping:大模型时代的“性能罗盘”——从选型到落地的全流程指南
数据库·人工智能·redis
元闰子2 小时前
20亿tpmC刷新记录,PolarDB做了哪些优化?· VLDB‘25
数据库·redis·mysql
rit84324992 小时前
嵌套粒子群优化(Nested PSO)的电力系统经济调度方案
数据库
自不量力的A同学2 小时前
MongoDB 数据库 ORM/ODM 新工具
数据库·mongodb
小明说Java2 小时前
MySQL慢查询优化:从2秒到2毫秒的蜕变
数据库·mysql