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 架构体系。

相关推荐
それども8 小时前
redis scan和keys对比
数据库·redis·缓存
亚空间仓鼠8 小时前
Docker容器化高可用架构部署方案(十五)
android·redis·docker·架构·sentinel
basketball6168 小时前
SQL 基础面试考点总结
数据库·sql·面试
深蓝轨迹9 小时前
缓存雪崩终极防御:Caffeine + Redis 多级缓存
数据库·redis·缓存·caffine
新时代农民工~9 小时前
PostgreSQL 主从故障恢复自动化:实战脚本与最佳实践
数据库·postgresql·自动化
woshilys10 小时前
sql server 查询外键
数据库·sql·sqlserver
瀚高PG实验室10 小时前
开发管理工具打不开No way to find ori gi nal streamhand er for jar protocol
java·数据库·jar·瀚高数据库
__zRainy__10 小时前
Redis系列:缓存抽象封装与最佳实践
数据库·redis·缓存
cen__y11 小时前
Linux13(数据库)
linux·服务器·c语言·开发语言·数据库
__zRainy__11 小时前
Redis系列:核心数据类型与基础 API 解读
数据库·redis·缓存