9840 字
49 分钟
13:redis集群高可用

[TOC]

13:redis集群高可用#

今日工作任务路线图

image-20250623164731874

一、工作场景#

为确保 Redis 服务的高可用和数据持久化,运维团队开始一系列操作。首先,团队搭建了一主一从的 Redis 结构,将 redis67 配置为主服务器,redis68 作为从服务器,实现数据的实时同步和备份。接着,为进一步提高服务的可靠性,在 redis69 上配置了哨兵服务。在一次突发状况中,主服务器 redis67 出现故障,哨兵服务迅速响应,自动将从服务器 redis68 升级为主服务器,保障业务不受影响。当 redis67 恢复后,又自动成为新主服务器的从服务器,确保整个 Redis 服务的稳定运行。

二、为什么学#

在当今数据量激增的时代,企业对数据存储和访问的效率与稳定性要求极高。从文档可知,Redis 若没有高可用机制,一旦主节点故障,业务会中断,数据也可能丢失。而 Redis 高可用方案,如主从复制、哨兵服务、集群部署等,能保障数据的自动备份与实时同步。像哨兵服务可自动监控节点状态,在主节点故障时快速实现故障转移,将从节点提升为主节点。集群部署则能实现数据的分布式存储,避免单点性能瓶颈,让 Redis 服务在各种复杂环境下稳定运行,确保业务的连续性。

三、Redis持久化#

当前任务环节

image-20250623164803993

3.1 使用RDB文件恢复数据#

创建1台虚拟机

主机名IP地址说明
redis50192.168.90.50redis服务器

配置服务器192.168.90.50

Terminal window
[root@redis50 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis50
[root@redis50 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.50/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis50~]# nmcli connection【肯耐申】 up ens160
#配置DNS
[root@redis50 ~]# vim /etc/resolv.conf
nameserver 192.168.90.2

步骤一:设置存盘间隔为120秒且10个key改变数据自动存盘

查看 redis服务存储数据到硬盘的存盘频率

配置行含义作用
save 3600 1如果 3600 秒(1 小时)内,至少有 1 个 key 被修改,则保存快照。最宽松的持久化,防止长时间无备份
save 300 100如果 300 秒(5 分钟)内,至少有 100 个 key 被修改,则保存快照。中等频率,平衡性能与安全性
save 60 10000如果 60 秒(1 分钟)内,至少有 10,000 个 key 被修改,则保存快照。高频写入场景下的快速保护
Terminal window
[root@redis50 ~]# yum -y install【因-斯多】 redis
#修改之前
[root@redis50 ~]# vim /etc/redis/redis.conf
383 # save 3600 1
384 # save 300 100
385 # save 60 10000
#修改之后
[root@redis50 ~]# vim /etc/redis/redis.conf
383 # save 3600 1
384 save 120 10
385 # save 60 10000
#启动redis
[root@redis50 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
#目前还没有rdb文件
[root@redis50 ~]# ls /var/lib/redis/

在服务启动后,要在2分钟内存储大于等10个变量

Terminal window
#存上4个变量
[root@redis50 ~]# redis-cli
127.0.0.1:6379> mset a 1 b 2 c 3 d 4
OK
127.0.0.1:6379> exit
#还没有达到存储的条件,还没有rdb文件
[root@redis50 ~]# ls /var/lib/redis/
#继续存上6个变量
[root@redis50 ~]# redis-cli
127.0.0.1:6379> mset x 1 y 2 z 3 k 6 i 7 z 9 f 22 zz 99 cc 66
OK
127.0.0.1:6379> exit
#达到条件,数据已经持久化到rdb文件中了
[root@redis50 ~]# ls /var/lib/redis/
dump.rdb

步骤二:使用RDB文件恢复数据

Terminal window
#第1步:拷贝 dump.rdb 文件就是对数据的备份
[root@redis50 ~]# cp /var/lib/redis/dump.rdb /opt/
[root@redis50 ~]# ls /opt/
dump.rdb
#第2步:清空数据
[root@redis50 ~]# redis-cli
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)

使用备份的dump.rdb文件恢复

Terminal window
#第1步 停止内存没有数据的redis服务
[root@redis50 ~]# systemctl【西斯屯-ctl】 stop【 s 多】 redis
#第2步 把没有数据的dump.rdb文件删除
[root@redis50 ~]# rm -rf /var/lib/redis/dump.rdb
#第3步 把备份dump.rdb文件拷贝到数据库目录下
[root@redis50 ~]# cp /opt/dump.rdb /var/lib/redis/
#第4步 启动redis服务 并连接服务查看数据
[root@redis50 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis50 ~]# redis-cli
127.0.0.1:6379> keys *
1) "x"
2) "a"
3) "y"
4) "cc"
5) "f"
6) "c"
7) "zz"
8) "z"
9) "d"
10) "i"
11) "k"
12) "b"

3.2 使用AOF文件恢复数据#

操作步骤
# 1. 在 A 节点(源)安全关闭 Redis(确保 AOF 完整)
redis-cli -h A_host shutdown
# 2. 拷贝 AOF 文件到 B 节点
scp /path/to/appendonly.aof user@B_host:/redis/data/
# 3. 在 B 节点(目标):
# - 停止 Redis
# - 备份/删除原有 AOF 和 RDB
# - 放入新 AOF 文件
# - 确保 redis.conf 中 appendonly yes
# - 启动 Redis
redis-server /etc/redis.conf

步骤一:启用AOF

命令操作如下所示:

Terminal window
[root@redis50 ~]# redis-cli
#启用aof文件
127.0.0.1:6379> config set appendonly yes
OK
#查看是否启用
192.168.88.50:6379> config get appendonly
1) "appendonly"
2) "yes"
#保存配置
127.0.0.1:6379> config rewrite
OK
127.0.0.1:6379> exit
#数据库目录多了.aof文件
[root@redis50 ~]# ls /var/lib/redis/
appendonly.aof dump.rdb
#查看文件行数
[root@redis50 ~]# wc -l /var/lib/redis/appendonly.aof
2 /var/lib/redis/appendonly.aof
#存放数据
[root@redis50 ~]# redis-cli
127.0.0.1:6379> mset x 1 y 2 z 3
OK
127.0.0.1:6379> keys *
1) "x"
2) "a"
3) "y"
4) "cc"
5) "f"
6) "c"
7) "zz"
8) "z"
9) "d"
10) "i"
11) "k"
12) "b"
127.0.0.1:6379> exit
#查看文件行数
[root@redis50 ~]# wc -l /var/lib/redis/appendonly.aof
22 /var/lib/redis/appendonly.aof

步骤二:使用AOF文件恢复数据

1)备份aof文件

Terminal window
[root@redis50 ~]# cp /var/lib/redis/appendonly.aof /opt/
[root@redis50 ~]# ls /opt/
appendonly.aof dump.rdb

2)清空数据

Terminal window
[root@redis50 ~]# redis-cli
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> exit

3)恢复数据

Terminal window
[root@redis50 ~]# rm -rf /var/lib/redis/*
[root@redis70 ~]# cp /opt/appendonly.aof /var/lib/redis/
[root@redis70 ~]# chown -R redis:redis /var/lib/redis
[root@redis50 ~]# systemctl【西斯屯-ctl】 restart redis
[root@redis50 ~]# redis-cli
127.0.0.1:6379> keys *
1) "x"
2) "a"
3) "y"
4) "cc"
5) "f"
6) "c"
7) "zz"
8) "z"
9) "d"
10) "i"
11) "k"
12) "b"

四、redis高可用集群#

Redis高可用集群

当前任务环节

image-20250623164832292

4.1 准备环境#

创建6台新虚拟机

主机名IP地址说明
redis51192.168.90.51redis服务器
redis52192.168.90.52redis服务器
redis53192.168.90.53redis服务器
redis54192.168.90.54redis服务器
redis55192.168.90.55redis服务器
redis56192.168.90.56redis服务器

4.1.1 配置redis51#

配置服务器192.168.90.51

Terminal window
[root@redis51 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis51
[root@redis51 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.51/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis51~]# nmcli connection【肯耐申】 up ens160

安装redis和配置

Terminal window
[root@redis51 ~]# yum -y install【因-斯多】 redis
#修改4行配置
[root@redis51 ~]# vim /etc/redis/redis.conf
75 bind 0.0.0.0
1387 cluster-enabled yes #启用集群功能
1395 cluster-config-file nodes-6379.conf #存储集群信息文件
1401 cluster-node-timeout 5000 #集群中主机通信超时时间
[root@redis51 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis51 ~]# netstat -utnlp | grep redis-serve
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1793/redis-server 0
tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1793/redis-server 0

4.1.1 配置redis52#

配置服务器192.168.90.52

Terminal window
[root@redis52 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis52
[root@redis52 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.52/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis52~]# nmcli connection【肯耐申】 up ens160

安装redis和配置

Terminal window
[root@redis52 ~]# yum -y install【因-斯多】 redis
#修改4行配置
[root@redis52 ~]# vim /etc/redis/redis.conf
75 bind 0.0.0.0
1387 cluster-enabled yes #启用集群功能
1395 cluster-config-file nodes-6379.conf #存储集群信息文件
1401 cluster-node-timeout 5000 #集群中主机通信超时时间
[root@redis52 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis52 ~]# netstat -utnlp | grep redis-serve
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1758/redis-server 0
tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1758/redis-server 0

4.1.1 配置redis53#

配置服务器192.168.90.53

Terminal window
[root@redis53 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis53
[root@redis53 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.53/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis53~]# nmcli connection【肯耐申】 up ens160

安装redis和配置

Terminal window
[root@redis53 ~]# yum -y install【因-斯多】 redis
#修改4行配置
[root@redis53 ~]# vim /etc/redis/redis.conf
75 bind 0.0.0.0
1387 cluster-enabled yes #启用集群功能
1395 cluster-config-file nodes-6379.conf #存储集群信息文件
1401 cluster-node-timeout 5000 #集群中主机通信超时时间
[root@redis53 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis53 ~]# netstat -utnlp | grep redis-serve
tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1785/redis-server 0
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1785/redis-server 0

4.1.1 配置redis54#

配置服务器192.168.90.54

Terminal window
[root@redis54 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis54
[root@redis54 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.54/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis54~]# nmcli connection【肯耐申】 up ens160

安装redis和配置

Terminal window
[root@redis54 ~]# yum -y install【因-斯多】 redis
#修改4行配置
[root@redis54 ~]# vim /etc/redis/redis.conf
75 bind 0.0.0.0
1387 cluster-enabled yes #启用集群功能
1395 cluster-config-file nodes-6379.conf #存储集群信息文件
1401 cluster-node-timeout 5000 #集群中主机通信超时时间
[root@redis54 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis54 ~]# netstat -utnlp | grep redis-serve
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1745/redis-server 0
tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1745/redis-server 0

4.1.1 配置redis55#

配置服务器192.168.90.55

Terminal window
[root@redis55 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis55
[root@redis55 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.55/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis55~]# nmcli connection【肯耐申】 up ens160

安装redis和配置

Terminal window
[root@redis55 ~]# yum -y install【因-斯多】 redis
#修改4行配置
[root@redis55 ~]# vim /etc/redis/redis.conf
75 bind 0.0.0.0
1387 cluster-enabled yes #启用集群功能
1395 cluster-config-file nodes-6379.conf #存储集群信息文件
1401 cluster-node-timeout 5000 #集群中主机通信超时时间
[root@redis55 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis55 ~]# netstat -utnlp | grep redis-serve
tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1778/redis-server 0
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1778/redis-server 0

4.1.1 配置redis56#

配置服务器192.168.90.56

Terminal window
[root@redis56 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis56
[root@redis56 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.56/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis56~]# nmcli connection【肯耐申】 up ens160

安装redis和配置

Terminal window
[root@redis56 ~]# yum -y install【因-斯多】 redis
#修改4行配置
[root@redis56 ~]# vim /etc/redis/redis.conf
75 bind 0.0.0.0
1387 cluster-enabled yes #启用集群功能
1395 cluster-config-file nodes-6379.conf #存储集群信息文件
1401 cluster-node-timeout 5000 #集群中主机通信超时时间
[root@redis56 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis56 ~]# netstat -utnlp | grep redis-serve
tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1793/redis-server 0
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1793/redis-server 0

4.2 高可用集群原理#

4.2.1 架构与节点连接#

Redis Cluster 采用无中心结构,每个节点保存数据和整个集群状态,且每个节点都和其他所有节点连接。一组三主三从集群由 6 个 Redis 实例组成,其中 3 个为主节点,3 个为从节点,每个主节点至少对应一个从节点 。

4.2.2 分布式数据分片#

  • 哈希槽机制:Redis Cluster 将数据划分为 16384 个槽位,每个主节点负责部分槽位。例如,主节点 1 管理槽 0 - 5460,主节点 2 管理 5461 - 10922,主节点 3 管理 10923 - 16383 。当存储一个 key 时,会使用 CRC16 算法计算该 key 的哈希值,然后对 16384 取模,得到所属的槽位,进而将这个 key 分到对应槽位区间的节点上 。
  • 自动负载均衡:数据按哈希值分配到不同节点,避免单点性能瓶颈。当新增节点时,还可以进行动态地、无中断地数据重新分片 。
分布式数据分片核心好处#
  1. 水平扩展(Scalability)
  • 突破单机性能瓶颈:数据和请求负载分散到多个节点,可线性提升吞吐量(QPS)和存储容量。

  • 动态扩容/缩容:通过迁移槽位(如 redis-cli --cluster reshard),可在不停服的情况下增减节点。

    1. 高可用性(High Availability)
  • 自动故障转移:每个主节点可配置从节点(replica),主节点宕机时,从节点自动升主(由集群内部 Gossip 协议协调)。

  • 无单点故障:即使部分节点失效,其余节点仍可提供服务(只要大多数主节点存活)。

  1. 数据分布均衡
  • 确定性分片slot = CRC16(key) % 16384 确保相同 key 总路由到同一节点,避免数据重复。
  • 均匀分布:哈希算法使 key 在槽位间近似均匀分布,结合槽位均分到节点,实现负载均衡。
  1. 客户端智能路由
  • MOVED 重定向:客户端首次访问错误节点时,返回正确节点地址,后续直接连接目标节点。
  • 本地缓存槽位映射:客户端(如 redis-py-cluster)缓存 slot → node 映射,减少重定向开销。
  1. 简化运维
  • 去中心化架构:无中心调度节点,所有节点对等通信(Gossip 协议),避免单点瓶颈。
  • 自动发现与状态同步:节点通过 PING/PONG 消息交换拓扑、故障信息,无需人工干预。

总结

Redis 集群的分片机制在 性能、容量、可用性 三者间取得平衡:
通过哈希槽实现数据分布式存储,既支持弹性扩展,又保障高可用,同时保持协议简洁高效,是 Redis 大规模部署的核心方案。

4.2.3 主从复制#

主从节点的数据准实时一致,通过异步的主备复制保证。从节点启动时会连接主节点,发送 SYNC 命令。主节点接收到后,开始执行 BGSAVE 命令生成 RDB 文件,并使用缓冲区记录此后执行的所有写命令。主节点 BGSAVE 执行完后,向从节点发送快照文件,发送期间继续记录写命令。从节点收到快照文件后丢弃旧数据,载入快照。主节点快照发送完毕后,向从节点发送缓冲区中的写命令。之后主节点每执行一个写命令,都会向从节点发送相同的写命令 。

Redis 主从复制通过异步方式实现数据准实时同步,过程如下:

  1. 建立连接:从节点启动后,向主节点发起连接,并发送 PSYNC 命令(首次为 PSYNC ? -1)。
  2. 全量同步(必要时): 主节点收到首次 PSYNC 后,执行 BGSAVE 生成 RDB 快照; 同时将新写命令缓存在复制积压缓冲区(repl_backlog); RDB 生成后,主节点将其发送给从节点; 从节点清空本地数据,加载 RDB。
  3. 增量同步: 主节点将 RDB 生成期间及之后的写命令持续发送给从节点; 从节点执行这些命令,保持与主节点一致。
  4. 断线重连优化: 若网络闪断,从节点通过 PSYNC 请求部分重同步; 主节点若在 repl_backlog 中找到对应偏移量,则仅发送缺失命令,避免全量同步。

4.2.4读写分离#

在 Redis 集群中,写操作只能由主节点处理;读操作既可以在主节点上进行,也可以在从节点上进行,以此分载主节点的读操作压力 。

image-20250621174815737

4.3 创建集群#

启用集群配置#

# 1. 绑定所有接口(允许外部连接)
bind 0.0.0.0
# 2. 禁用保护模式(因未设密码,有密码情况下可以设置为yes)
protected-mode no
# 3. 监听端口
port 6379
# 4. 不以守护进程方式运行(由 systemd 管理)
daemonize no
# 5. 启用集群模式(核心!)
cluster-enabled yes
# 6. 集群节点超时(毫秒),默认 15000,可调小测试用
cluster-node-timeout 5000
# 7. 集群配置文件(自动生成,不要手动创建)
cluster-config-file nodes-6379.conf

说明:

1、在任意一台redis服务器上都可以执行创建集群的命令。

2、—cluster-replicas 1 给每个master服务器分配一台slave服务器,每个主至少要分配1台slave服务器,不然无法实现redis服务的高可用。

3、创建集群时,会自动创建主从角色,默认把主机列表中的前3台服务器创建为 Master角色的redis服务器,剩下的均配置为slave角色服务器。

4、创建集群时,会自动给master角色的主机分配hash槽 ,通过hash槽实现数据的分布式存储。

Terminal window
[root@redis51 ~]# redis-cli --cluster【克拉斯特】 create 192.168.90.51:6379 192.168.90.52:6379 192.168.90.53:6379 192.168.90.54:6379 192.168.90.55:6379 192.168.90.56:6379 --cluster-replicas 1
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.90.51:6379
192.168.90.52:6379
192.168.90.53:6379
Adding replica 192.168.90.55:6379 to 192.168.90.51:6379
Adding replica 192.168.90.56:6379 to 192.168.90.52:6379
Adding replica 192.168.90.54:6379 to 192.168.90.53:6379
M: 0eb3b7aa0493a19189cba35b0c658202cc20884b 192.168.90.51:6379
slots:0-5460 (5461 slots) master
M: a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441 192.168.90.52:6379
slots:5461-10922 (5462 slots) master
M: f2c1bdb78d8d224c3666fa6440bdf80ba563c581 192.168.90.53:6379
slots:10923-16383 (5461 slots) master
S: bdba77868965371680fa825badff59bf8ef95a81 192.168.90.54:6379
replicates f2c1bdb78d8d224c3666fa6440bdf80ba563c581
S: 11510f42bfd9cf667bab5f31c01476d94984200a 192.168.90.55:6379
replicates 0eb3b7aa0493a19189cba35b0c658202cc20884b
S: fe572ce003ee634c52adc4b42d92d15f847937d7 192.168.90.56:6379
replicates a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441
Can I set the above configuration? (type 'yes' to accept): yes #同意
....
....
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. //创建成功的提示

4.4 查看集群信息#

第一列:主服务器ip地址

第二列:主服务器ID

第三列:存储变量个数

第四列:hash槽个数 (hash槽的作用在集群存储工程过程里讲)

第五列:从服务器数量

Terminal window
[root@redis51 ~]# redis-cli --cluster【克拉斯特】 info【因否】 192.168.90.51:6379
192.168.90.53:6379 (f2c1bdb7...) -> 0 keys | 5461 slots | 1 slaves.
192.168.90.51:6379 (0eb3b7aa...) -> 0 keys | 5461 slots | 1 slaves.
192.168.90.52:6379 (a9cb8ccd...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

4.5 访问集群#

Terminal window
[root@redis51 ~]# redis-cli -c -h 192.168.90.51 -p 6379
192.168.90.51:6379> set school moershi
-> Redirected to slot [8455] located at 192.168.90.52:6379
OK
192.168.90.52:6379> set teacher jam
-> Redirected to slot [12541] located at 192.168.90.53:6379
OK
192.168.90.53:6379> set class NSD
-> Redirected to slot [741] located at 192.168.90.51:6379
OK
192.168.90.51:6379>

会发现3个变量被分别存储到集群中的3台master服务器上,实现了数据的分布式存储。当连接集群中的任意一台redis服务器存储数据时,会调用集群CRC16算法 得出此次存储变量使用的hash 槽,然后连接hash 槽 所在的master服务器存储变量。 在创建集群时会把默认的16384个槽平均的分配给集群中的3个master服务器。可以通过查看集群信息查看每个master服务器占用hash槽的个数。

Terminal window
[root@redis51 ~]# redis-cli --cluster【克拉斯特】 info【因否】 192.168.90.51:6379
192.168.90.53:6379 (f2c1bdb7...) -> 0 keys | 5461 slots | 1 slaves.
192.168.90.51:6379 (0eb3b7aa...) -> 0 keys | 5461 slots | 1 slaves.
192.168.90.52:6379 (a9cb8ccd...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

集群中slave角色的主机会自动同步master角色主机的数据,实现数据的自动备份,

分别连接集群中的3台slave服务器查看变量

Terminal window
[root@redis54 ~]# redis-cli -c -h 192.168.90.54 -p 6379
192.168.90.54:6379> keys *
1) "class"
[root@redis55 ~]# redis-cli -c -h 192.168.90.55 -p 6379
192.168.90.55:6379> keys *
1) "school"
[root@redis56 ~]# redis-cli -c -h 192.168.90.56 -p 6379
192.168.90.56:6379> keys *
1) "teacher"

当master角色的服务器宕机时,对应的slave服务器会升级为master 并接手对应的hash槽,实现redis服务的高可用,例如停止host53主机的redis服务,对应的从会升级为master 。(当宕机的master恢复后 自动做当前主的从服务器)

Terminal window
#停止redis服务
[root@redis53 ~]# systemctl【西斯屯-ctl】 stop【 s 多】 redis
#查看集群信息
[root@redis51 ~]#]# redis-cli --cluster【克拉斯特】 info【因否】 192.168.90.51:6379
192.168.90.54:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 0 slaves.
192.168.90.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves.
192.168.90.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
keys per slot on average.
#启动redis服务
[root@redis53 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
#查看集群信息
[root@redis51 ~]#]# redis-cli --cluster【克拉斯特】 info【因否】 192.168.90.51:6379
192.168.90.54:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 1 slaves.
192.168.90.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves.
192.168.90.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
keys per slot on average.

五、配置主从复制#

当前任务环节

image-20250623164908097

5.1 环境准备#

准备3台新虚拟机

主机名主机名说明
redis61192.168.90.61redis服务器
redis62192.168.90.62redis服务器
redis63192.168.90.63redis服务器

配置服务器192.168.90.61

Terminal window
[root@redis61 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis61
[root@redis61 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.61/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis61~]# nmcli connection【肯耐申】 up ens160

配置服务器192.168.90.62

Terminal window
[root@redis62 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis62
[root@redis62 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.62/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis62~]# nmcli connection【肯耐申】 up ens160

配置服务器192.168.90.63

Terminal window
[root@redis63 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis63
[root@redis63 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.63/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis63~]# nmcli connection【肯耐申】 up ens160

5.2 配置一主一从结构#

1)配置redis61为主服务器

Terminal window
[root@redis61 ~]# yum -y install【因-斯多】 redis
[root@redis61 ~]# vim /etc/redis/redis.conf
75 bind 0.0.0.0
[root@redis61 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis61 ~]# redis-cli
127.0.0.1:6379> info【因否】 replication #查看主从关系信息
# Replication
role:master # 默认就是主服务器
connected_slaves:0 #没有从服务器
master_failover_state:no-failover
master_replid:bd86b885e9e6b21e452696d472e2b2852c7fea72
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:

2)配置redids62为redis61的从服务器

Terminal window
[root@redis62 ~]# yum -y install【因-斯多】 redis
[root@redis62 ~]# vim /etc/redis/redis.conf
75 bind 0.0.0.0
[root@redis62 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis62 ~]# redis-cli
127.0.0.1:6379> replicaof 192.168.90.61 6379 #指定主服务器ip和端口
OK
127.0.0.1:6379> config rewrite #永久保存配置
OK
127.0.0.1:6379> exit
#查看文件末尾
[root@redis62 ~]# tail -1 /etc/redis/redis.conf
replicaof 192.168.90.61 6379
[root@redis62 ~]# redis-cli
127.0.0.1:6379> info【因否】 replication #查看主从关系信息
# Replication
role:slave #从角色
master_host:192.168.90.61 #主服务器ip地址
master_port:6379 #主服务器端口号
master_link_status:up #与主服务器连接状态 (up 正常 down 连接失败)
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:84
slave_repl_offset:84
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84

3)在主服务器redis61查看复制信息

Terminal window
127.0.0.1:6379> info【因否】 replication
# Replication
role:master #主角色
connected_slaves:1 #一个从
slave0:ip=192.168.90.62,port=6379,state=online,offset=98,lag=0 #从服务器信息
master_failover_state:no-failover
master_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98
127.0.0.1:6379> mset x 1 y 2 z 3 #存储数据
OK
127.0.0.1:6379> keys *
1) "x"
2) "z"
3) "y"

4)在从服务器查看是否同步数据

Terminal window
127.0.0.1:6379> keys *
1) "x"
2) "z"
3) "y"

5.3 配置一主多从结构#

把redis63也配置为redis61的从服务器

1)配置redis63为redis61的从服务器

Terminal window
[root@redis63 ~]# yum -y install【因-斯多】 redis
[root@redis63 ~]# vim /etc/redis/redis.conf
75 bind 0.0.0.0
[root@redis63 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis63 ~]# redis-cli
127.0.0.1:6379> replicaof 192.168.90.61 6379 #指定主服务器ip和端口
OK
127.0.0.1:6379> config rewrite #永久保存配置
OK
127.0.0.1:6379> exit
#查看文件末尾
[root@redis62 ~]# tail -1 /etc/redis/redis.conf
replicaof 192.168.90.61 6379
[root@redis63 ~]# redis-cli
127.0.0.1:6379> info【因否】 replication
# Replication
role:slave
master_host:192.168.90.61
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_read_repl_offset:1507
slave_repl_offset:1507
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1507
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1466
127.0.0.1:6379> keys *
1) "y"
2) "z"
3) "x"

在redis61 查看到有2台从服务器

Terminal window
127.0.0.1:6379> info【因否】 replication
# Replication
role:master
connected_slaves:2 #2个从服务器
slave0:ip=192.168.90.62,port=6379,state=online,offset=1591,lag=0 #从1
slave1:ip=192.168.90.63,port=6379,state=online,offset=1591,lag=1 #从2
master_failover_state:no-failover
master_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1591
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1591

5.4 配置主从从结构#

把redis63恢复为独立的redis服务器,然后配置为redis62的从服务器

1)配置redis63

Terminal window
127.0.0.1:6379> replicaof no one #恢复为独立的数据库服务器
OK
127.0.0.1:6379> replicaof 192.168.90.62 6379 #指定主服务器为62
OK
127.0.0.1:6379> config rewrite #保存配置
OK
127.0.0.1:6379> exit
@查看是否保存
[root@redis63 ~]# tail -1 /etc/redis/redis.conf
replicaof 192.168.90.62 6379
[root@redis63 ~]# redis-cli
127.0.0.1:6379> info【因否】 replication #查看主从关系信息
# Replication
role:slave #从角色
master_host:192.168.90.62 #主服务器IP
master_port:6379 #主服务端口
master_link_status:up #与主服务器连接状态
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:2025
slave_repl_offset:2025
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2025
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1956
repl_backlog_histlen:70

2)在redis62查看复制信息

Terminal window
127.0.0.1:6379> info【因否】 replication
# Replication
role:slave #本身是从服务器
master_host:192.168.90.61 #主服务器ip
master_port:6379 #主服务器redis服务端口
master_link_status:up #与主服务器连接状态
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_read_repl_offset:2291
slave_repl_offset:2291
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:1 #本身有一个从服务器
slave0:ip=192.168.90.63,port=6379,state=online,offset=2291,lag=0 #从服务器信息
master_failover_state:no-failover
master_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2291
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2291

3)在redis61上查看信息

Terminal window
127.0.0.1:6379> info【因否】 replication
# Replication
role:master
connected_slaves:1 #只有一个从了
slave0:ip=192.168.90.62,port=6379,state=online,offset=2403,lag=0
master_failover_state:no-failover
master_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2403
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2403

六、置带验证的主从复制#

当前任务环节

image-20250623164933059

基于案例1做如下配置:

  • 配置主机redis61,redis服务连接密码为123456
  • 主机redis62设置连接redis61的redis服务密码

给redis61主机的Redis服务设置连接密码,如果从服务器不指定连接密码无法同步数据。

6.1 配置主机redis61#

redis服务连接密码为123456

命令操作如下所示:

Terminal window
[root@redis61 ~]# redis-cli
127.0.0.1:6379> config get requirepass #查看密码,默认服务没有密码
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass 123456 #设置密码
OK
127.0.0.1:6379> auth 123456 #密码登录
OK
127.0.0.1:6379> config rewrite #保存配置
OK
127.0.0.1:6379> exit
#保存到文件的的密码
[root@redis61 ~]# grep "123456" /etc/redis/redis.conf
requirepass "123456"
#重启redis服务
[root@redis61 ~]# systemctl【西斯屯-ctl】 restart redis
[root@redis61 ~]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info【因否】 replication
# Replication
role:master
connected_slaves:0 # 没有从服务器了 因为从没有输入连接密码连接不上主服务器
master_failover_state:no-failover
master_replid:7f7c394d93a5df791bbdfb207cdeaf1eb506358f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

6.2 主机redis62设置连接redis61的redis服务密码#

命令操作如下所示:

Terminal window
#重启redis服务
[root@redis62 ~]# systemctl【西斯屯-ctl】 restart redis
[root@redis62 ~]# redis-cli
127.0.0.1:6379> info【因否】 replication #查看主从关系信息
# Replication
role:slave
master_host:192.168.90.61
master_port:6379
master_link_status:down #没设置密码 与master主机是断开状态
master_last_io_seconds_ago:-1
master_sync_in_progress:1
slave_read_repl_offset:1
slave_repl_offset:1
master_sync_total_bytes:-1
master_sync_read_bytes:0
master_sync_left_bytes:-1
master_sync_perc:-0.00
master_sync_last_io_seconds_ago:0
master_link_down_since_seconds:-1
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3383
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

指定主服务器的密码

Terminal window
127.0.0.1:6379> config set masterauth 123456 #指定主服务器密码
OK
127.0.0.1:6379> config rewrite #保存配置
OK
127.0.0.1:6379> info【因否】 replication #查看主从信息
# Replication
role:slave
master_host:192.168.90.61
master_port:6379
master_link_status:up #现在是启动状态
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:28
slave_repl_offset:28
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:1
slave0:ip=192.168.90.63,port=6379,state=online,offset=28,lag=1
master_failover_state:no-failover
master_replid:a288cad0a8747569f147c06bb63237b2751a9fb4
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28

3)在redis61上查看信息

Terminal window
[root@redis61 ~]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info【因否】 replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.90.62,port=6379,state=online,offset=70,lag=1
master_failover_state:no-failover
master_replid:a288cad0a8747569f147c06bb63237b2751a9fb4
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:70

七、哨兵服务#

当前任务环节

image-20250623164956680

7.1环境准备#

准备3台新的虚拟机

主机名IP地址说明
redis67192.168.90.67Master服务器
redis68192.168.90.68Slave服务器
redis69192.168.90.69哨兵服务

说明:

1)可以使用一主一从或 一主多从 或 主从从 + 哨兵服务 做服务的高可用 和 数据自动备份

2)如果主从结构中的redis服务设置连接密码的话必须全每台数据库都要设置密码且密码要一样,要么全都不设置密码。

3)如果Redis服务有密码宕机的服务器启动服务后,要人为指定主服务器的连接密码。

配置服务器192.168.90.67

Terminal window
[root@redis67 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis67
[root@redis67 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.67/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis67~]# nmcli connection【肯耐申】 up ens160

配置服务器192.168.90.68

Terminal window
[root@redis68 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis68
[root@redis68 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.68/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis68~]# nmcli connection【肯耐申】 up ens160

配置服务器192.168.90.69

Terminal window
[root@redis69 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 redis69
[root@redis69 ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.69/24 autoconnect【奥特欧 坑聂特】 yes
[root@redis69~]# nmcli connection【肯耐申】 up ens160

7.2 哨兵服务的原理#

Redis哨兵是一种分布式高可用解决方案,用于实现主从自动故障转移、集群监控以及充当配置中心自动更新客户端连接信息。其工作原理主要分为三个阶段:监控、共识和故障转移 。

  1. 监控(Monitoring):哨兵每秒向主/从节点发送PING命令,若节点超时(down-after-milliseconds,默认30s)无响应,该哨兵会将其标记为主观下线(SDOWN)。即单个哨兵认为实例不可用(PING无响应超过 down-after-milliseconds 配置) 。
  2. 共识(Agreement):哨兵集群通过Gossip协议交换节点状态。当多数哨兵(≥ quorum)都认为主节点下线时,会将其标记为客观下线(ODOWN)。也就是当足够数量(quorum配置)的哨兵都认为主节点不可用时,才判定主节点真正不可用 。
  3. 故障转移(Failover)
    • 选举领导者哨兵:基于Raft协议进行选举。发现主节点ODOWN的哨兵发起选举,每个哨兵在每个配置纪元(epoch)仅投一票,最先获得多数票(≥ N/2 + 1)的哨兵当选为领导者哨兵来执行故障转移;若选举超时(默认100ms),则会重新发起选举 。
    • 选择新主节点:从从节点中选出新主节点,选择规则依次基于优先级(slave-priority配置)、复制偏移量(选择数据最新的)、运行ID(选择较小的)。先排除已下线节点和replica-priority = 0的节点,然后选择优先级最高、复制偏移量最大、Run ID最小的节点 。
    • 重新配置:领导者哨兵将选中的从节点提升为主节点(执行SLAVEOF NO ONE命令);通知其他从节点复制新的主节点(执行SLAVEOF new_master_ip port命令);当旧主节点恢复时,将其配置为新主节点的从节点 。
    • 通知客户端:通过Redis的发布/订阅机制,将新主节点的IP和端口信息推送给客户端,让客户端更新配置,连接到新的主节点 。

7.3 配置主机redis67为master服务器#

命令操作如下所示:

Terminal window
[root@redis67 ~]# yum -y install【因-斯多】 redis
#替换掉75行
[root@redis67 ~]# sed -i "75c bind 0.0.0.0" /etc/redis/redis.conf
[root@redis67 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis67 ~]# redis-cli
127.0.0.1:6379> info【因否】 replication #查看主从关系信息
# Replication
role:master # 默认就是主服务器
connected_slaves:0 #没有从服务器
master_failover_state:no-failover
master_replid:bd86b885e9e6b21e452696d472e2b2852c7fea72
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:

7.4 配置主机redis68为redis67的slave服务器#

命令操作如下所示:

Terminal window
[root@redis68 ~]# yum -y install【因-斯多】 redis
[root@redis68 ~]# sed -i "75c bind 0.0.0.0" /etc/redis/redis.conf
[root@redis68 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis
[root@redis68 ~]# redis-cli
127.0.0.1:6379> replicaof 192.168.90.67 6379 #指定主服务器ip和端口
OK
127.0.0.1:6379> config rewrite #永久保存配置
OK
127.0.0.1:6379> exit
#查看文件末尾
[root@redis68 ~]# tail -1 /etc/redis/redis.conf
replicaof 192.168.90.67 6379
[root@redis62 ~]# redis-cli
127.0.0.1:6379> info【因否】 replication #查看主从关系信息
# Replication
role:slave #从角色
master_host:192.168.90.67 #主服务器ip地址
master_port:6379 #主服务器端口号
master_link_status:up #与主服务器连接状态 (up 正常 down 连接失败)
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:84
slave_repl_offset:84
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84

7.5 配置主机redis69运行哨兵服务#

  1. 安装redis软件,启动哨兵服务
Terminal window
[root@redis68 ~]# yum -y install【因-斯多】 redis
#哨兵配置文件
[root@redis69 ~]# vim /etc/redis/sentinel.conf
15 bind 0.0.0.0
26 daemonize yes
84 sentinel monitor mymaster 192.168.90.67 6379 1
#启动哨兵服务
[root@redis69 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis-sentinel
#查看端口号
[root@redis69 ~]# netstat -utnlp | grep 26379
tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 2179/redis-sentinel
[root@redis69 ~]#

2)查看日志获取监视信息

复制一个终端会话

Terminal window
[root@redis69 ~]# tail -f /var/log/redis/sentinel.log
2179:X 23 Jun 2025 15:47:44.301 * Supervised by systemd. Please make sure you set appropriate values for TimeoutStartSec and TimeoutStopSec in your service unit.
2179:X 23 Jun 2025 15:47:44.301 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2179:X 23 Jun 2025 15:47:44.301 # Redis version=6.2.18, bits=64, commit=00000000, modified=0, pid=2179, just started
2179:X 23 Jun 2025 15:47:44.301 # Configuration loaded
2179:X 23 Jun 2025 15:47:44.302 * monotonic clock: POSIX clock_gettime
2179:X 23 Jun 2025 15:47:44.302 * Running mode=sentinel, port=26379.
2179:X 23 Jun 2025 15:47:44.304 # Sentinel ID is 5ab8d490e1e7b600170a2a725b4679d25186b4d1
2179:X 23 Jun 2025 15:47:44.304 # +monitor master mymaster 192.168.90.67 6379 quorum 1
2179:X 23 Jun 2025 15:47:44.306 * +slave slave 192.168.90.68:6379 192.168.90.68 6379 @ mymaster 192.168.90.67 6379

7.6 测试配置#

思路:停止master主机的redis 服务,原slave角色会升级为主,哨兵服务会自动监视新的master服务,宕机的master 主机恢复后自动配置为当前主的从服务器。

停止master主机的redis 服务

Terminal window
[root@redis67 ~]# systemctl【西斯屯-ctl】 stop【 s 多】 redis

查看slave

原slave角色会升级为主

Terminal window
127.0.0.1:6379> info【因否】 replication
# Replication
role:slave
master_host:192.168.90.67
master_port:6379
master_link_status:down #master宕机了
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:22602
slave_repl_offset:22602
master_link_down_since_seconds:27
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:0f9c32408bfd386ab9c9ef00617298a969e89c73
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:22602
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
#重新登录
[root@redis68 ~]# redis-cli
127.0.0.1:6379> info【因否】 replication
# Replication
role:master #升级为master
connected_slaves:0
master_failover_state:no-failover
master_replid:8289cfb1acb8573be217df886ac24732f2bdb6a9
master_replid2:0f9c32408bfd386ab9c9ef00617298a969e89c73
master_repl_offset:25586
second_repl_offset:22603
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1

哨兵服务会自动监视新的master服务

image-20250623155722362

宕机的master 主机恢复后自动配置为当前主的从服务器。

Terminal window
[root@redis67 ~]# redis-cli
127.0.0.1:6379> info【因否】 replication
Error: Server closed the connection【肯耐申】
127.0.0.1:6379> info【因否】 replication
# Replication
role:slave #变成从服务器
master_host:192.168.90.68 #现在主服务器是192.168.90.68
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:41965
slave_repl_offset:41965
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:8289cfb1acb8573be217df886ac24732f2bdb6a9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:41965
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:41520
repl_backlog_histlen:446

八、作业#

1 选择题#

  1. Redis 哨兵将主节点标记为客观下线(ODOWN)的条件是? B A. 单个哨兵认为主节点不可用 B. 多数哨兵(≥ quorum)都认为主节点下线 C. 主节点主动发出下线通知 D. 主节点超过 1 分钟无响应

  2. Redis Cluster 采用的分布式数据分片机制是? A A. 哈希槽机制 B. 随机分配机制 C. 轮询机制 D. 顺序分配机制

  3. 在 Redis 主从复制中,从节点启动时会向主节点发送什么命令? A A. SYNC 命令 B. SAVE 命令 C. FLUSHALL 命令 D. info 命令

2 简答题#

  1. 简述 Redis 哨兵服务的工作原理。 答:

    1. 监控(Monitoring):哨兵每秒向主/从节点发送PING命令,若节点超时(down-after-milliseconds,默认30s)无响应,该哨兵会将其标记为主观下线(SDOWN)。即单个哨兵认为实例不可用(PING无响应超过 down-after-milliseconds 配置) 。
    2. 共识(Agreement):哨兵集群通过Gossip协议交换节点状态。当多数哨兵(≥ quorum)都认为主节点下线时,会将其标记为客观下线(ODOWN)。也就是当足够数量(quorum配置)的哨兵都认为主节点不可用时,才判定主节点真正不可用 。
    3. 故障转移(Failover)
      • 选举领导者哨兵:基于Raft协议进行选举。发现主节点ODOWN的哨兵发起选举,每个哨兵在每个配置纪元(epoch)仅投一票,最先获得多数票(≥ N/2 + 1)的哨兵当选为领导者哨兵来执行故障转移;若选举超时(默认100ms),则会重新发起选举 。
      • 选择新主节点:从从节点中选出新主节点,选择规则依次基于优先级(slave-priority配置)、复制偏移量(选择数据最新的)、运行ID(选择较小的)。先排除已下线节点和replica-priority = 0的节点,然后选择优先级最高、复制偏移量最大、Run ID最小的节点 。
      • 重新配置:领导者哨兵将选中的从节点提升为主节点(执行SLAVEOF NO ONE命令);通知其他从节点复制新的主节点(执行SLAVEOF new_master_ip port命令);当旧主节点恢复时,将其配置为新主节点的从节点 。
    4. 通知客户端:通过Redis的发布/订阅机制,将新主节点的IP和端口信息推送给客户端,让客户端更新配置,连接到新的主节点 。
  2. 说明 Redis 集群中分布式数据分片的好处。 答:

    1. 水平扩展:突破单机性能瓶颈,将数据和请求负载分散到多个节点,可线性提升吞吐量(QPS)和存储容量。动态扩容在通过迁移槽位(如 redis-cli —cluster reshard),可在不停服的情况下增减节点。
    2. 高可用性:自动故障转移,每个主节点可配置从节点(replica),主节点宕机时,从节点自动升主,主节点恢复自从加入新主节点的从节点。无单点故障,即使部分节点失效,其余节点仍可提供服务(只要大多数主节点存活)。
    3. 数据分布均衡:确定性分片,如slot = CRC16(key) % 16384 确保相同 key 总路由到同一节点,避免数据重复。均匀分布,哈希算法使 key 在槽位间近似均匀分布,结合槽位均分到节点,实现负载均衡。
  3. 请阐述 Redis 主从复制的过程。 答:

    1. 建立连接:从节点启动后,向主节点发起连接,并发送 PSYNC 命令(首次为 PSYNC ? -1)。
    2. 主节点收到首次 PSYNC 后,执行 BGSAVE 生成 RDB 快照,同时将新写命令缓存在复制积压缓冲区(repl_backlog),DB 生成后,主节点将其发送给从节点,从节点清空本地数据,加载 RDB。

3 操作题#

  1. 请写出配置 Redis 一主一从结构的详细步骤。
Terminal window
[root@redis60 ~]# 主配置
[root@redis60 ~]# systemctl start redis.service
[root@redis60 ~]# redis-cli
127.0.0.1:6379> config set protected-mode no
OK
127.0.0.1:6379> config rewrite
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:2aae21339753d355129c78fab17bd7a1c547aedf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
[root@redis61 ~]# 从配置
[root@redis61 ~]# systemctl start redis.service
[root@redis61 ~]# redis-cli
127.0.0.1:6379> config set protected-mode no
OK
127.0.0.1:6379> config rewrite
OK
127.0.0.1:6379> replicaof 192.168.88.60 6379
OK
127.0.0.1:6379> config rewrite
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.88.60
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:224
slave_repl_offset:224
replica_full_sync_buffer_size:0
replica_full_sync_buffer_peak:0
master_current_sync_attempts:160
master_total_sync_attempts:160
master_link_up_since_seconds:154
total_disconnect_time_sec:0
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:a321b83129695ff3cea398fd398097e9b99f63f5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:224
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:210
127.0.0.1:6379>
127.0.0.1:6379> 主redis状态检查
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.88.61,port=6379,state=online,offset=266,lag=1
master_failover_state:no-failover
master_replid:a321b83129695ff3cea398fd398097e9b99f63f5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:266
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:266
127.0.0.1:6379>
127.0.0.1:6379> 验证:主写入数据
127.0.0.1:6379> mset a 1 b 2 c 3 d 4 e 5 f 6
OK
127.0.0.1:6379>
127.0.0.1:6379> 验证:从数据读取
127.0.0.1:6379> keys *
1) "a"
2) "d"
3) "f"
4) "b"
5) "c"
6) "e"
127.0.0.1:6379> mget a b c d e f
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379>
  1. 描述创建 Redis 高可用集群的具体操作过程。
Terminal window
# 集群配置
[root@redis59 ~]#
[root@redis59 ~]# grep -vE "^\s*($|#)" /opt/redis/conf/redis.conf | grep -nE "bind|protected-mode|port|daemonize|cluster"
1:bind 0.0.0.0
2:protected-mode no
3:port 6379
7:daemonize no
51:cluster-enabled yes
52:cluster-config-file nodes-6379.conf
53:cluster-node-timeout 5000
[root@redis59 ~]# systemctl start redis.service
[root@redis60 ~]#
[root@redis60 ~]# grep -vE "^\s*($|#)" /opt/redis/conf/redis.conf | grep -nE "bind|protected-mode|port|daemonize|cluster"
1:bind 0.0.0.0
2:protected-mode no
3:port 6379
7:daemonize no
51:cluster-enabled yes
52:cluster-config-file nodes-6379.conf
53:cluster-node-timeout 5000
[root@redis60 ~]# systemctl start redis.service
[root@redis61 ~]#
[root@redis61 ~]# grep -vE "^\s*($|#)" /opt/redis/conf/redis.conf | grep -nE "bind|protected-mode|port|daemonize|cluster"
1:bind 0.0.0.0
2:protected-mode no
3:port 6379
7:daemonize no
51:cluster-enabled yes
52:cluster-config-file nodes-6379.conf
53:cluster-node-timeout 5000
[root@redis61 ~]# systemctl start redis.service
[root@redis62 ~]#
[root@redis62 ~]# grep -vE "^\s*($|#)" /opt/redis/conf/redis.conf | grep -nE "bind|protected-mode|port|daemonize|cluster"
1:bind 0.0.0.0
2:protected-mode no
3:port 6379
7:daemonize no
51:cluster-enabled yes
52:cluster-config-file nodes-6379.conf
53:cluster-node-timeout 5000
[root@redis62 ~]# systemctl start redis.service
[root@redis63 ~]#
[root@redis63 ~]# grep -vE "^\s*($|#)" /opt/redis/conf/redis.conf | grep -nE "bind|protected-mode|port|daemonize|cluster"
1:bind 0.0.0.0
2:protected-mode no
3:port 6379
7:daemonize no
51:cluster-enabled yes
52:cluster-config-file nodes-6379.conf
53:cluster-node-timeout 5000
[root@redis63 ~]# systemctl start redis.service
[root@redis64 ~]#
[root@redis64 ~]# grep -vE "^\s*($|#)" /opt/redis/conf/redis.conf | grep -nE "bind|protected-mode|port|daemonize|cluster"
1:bind 0.0.0.0
2:protected-mode no
3:port 6379
7:daemonize no
51:cluster-enabled yes
52:cluster-config-file nodes-6379.conf
53:cluster-node-timeout 5000
[root@redis64 ~]# systemctl start redis.service
[root@redis59 ~]# 搭建集群
[root@redis59 ~]# redis-cli --cluster create 192.168.88.59:6379 192.168.88.60:6379 192.168.88.61:6379 192.168.88.62:6379 192.168.88.63:6379 192.168.88.64:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.88.63:6379 to 192.168.88.59:6379
Adding replica 192.168.88.64:6379 to 192.168.88.60:6379
Adding replica 192.168.88.62:6379 to 192.168.88.61:6379
M: 4f75181056b5aefd90f2b1cc242e105f929ec5b4 192.168.88.59:6379
slots:[0-5460] (5461 slots) master
M: e92ce91b5b3b4587c5520482e7a825b050d02dee 192.168.88.60:6379
slots:[5461-10922] (5462 slots) master
M: 8f23c1c05cda60f570d70543c5ea3e5bf643c89c 192.168.88.61:6379
slots:[10923-16383] (5461 slots) master
S: fa61df96aea2f9a53427eae75fd0c82e4b916ffb 192.168.88.62:6379
replicates 8f23c1c05cda60f570d70543c5ea3e5bf643c89c
S: 1ca6b10204e7df92340b5c8318416340d4c5ec6b 192.168.88.63:6379
replicates 4f75181056b5aefd90f2b1cc242e105f929ec5b4
S: 0d342ee7810cadea394eb62a7da4e3a1f320f680 192.168.88.64:6379
replicates e92ce91b5b3b4587c5520482e7a825b050d02dee
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
>>> Performing Cluster Check (using node 192.168.88.59:6379)
M: 4f75181056b5aefd90f2b1cc242e105f929ec5b4 192.168.88.59:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: e92ce91b5b3b4587c5520482e7a825b050d02dee 192.168.88.60:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 8f23c1c05cda60f570d70543c5ea3e5bf643c89c 192.168.88.61:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 0d342ee7810cadea394eb62a7da4e3a1f320f680 192.168.88.64:6379
slots: (0 slots) slave
replicates e92ce91b5b3b4587c5520482e7a825b050d02dee
S: fa61df96aea2f9a53427eae75fd0c82e4b916ffb 192.168.88.62:6379
slots: (0 slots) slave
replicates 8f23c1c05cda60f570d70543c5ea3e5bf643c89c
S: 1ca6b10204e7df92340b5c8318416340d4c5ec6b 192.168.88.63:6379
slots: (0 slots) slave
replicates 4f75181056b5aefd90f2b1cc242e105f929ec5b4
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@redis59 ~]#
[root@redis59 ~]# 查看集群信息
[root@redis59 ~]# redis-cli --cluster info 192.168.88.59:6379
192.168.88.59:6379 (4f751810...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.60:6379 (e92ce91b...) -> 0 keys | 5462 slots | 1 slaves.
192.168.88.61:6379 (8f23c1c0...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
[root@redis59 ~]#
[root@redis59 ~]# 访问集群验证数据
[root@redis59 ~]# redis-cli -c -h 192.168.88.59 -p 6379
192.168.88.59:6379> set a 1
-> Redirected to slot [15495] located at 192.168.88.61:6379
OK
192.168.88.61:6379> set b 2
-> Redirected to slot [3300] located at 192.168.88.59:6379
OK
192.168.88.59:6379> set c 3
-> Redirected to slot [7365] located at 192.168.88.60:6379
OK
192.168.88.60:6379> get a
-> Redirected to slot [15495] located at 192.168.88.61:6379
"1"
192.168.88.61:6379> get a
"1"
192.168.88.61:6379> get b
-> Redirected to slot [3300] located at 192.168.88.59:6379
"2"
192.168.88.59:6379> get c
-> Redirected to slot [7365] located at 192.168.88.60:6379
"3"
192.168.88.60:6379>
  1. 说明如何使用 RDB 文件恢复 Redis 数据。
Terminal window
[root@redis59 ~]# grep -vE "^\s*($|#)" /opt/redis/conf/redis.conf | grep save
save 3600 1 120 10 60 10000
stop-writes-on-bgsave-error yes
rdb-save-incremental-fsync yes
[root@redis59 ~]# systemctl start redis.service
[root@redis59 ~]# ls /opt/redis/data/
[root@redis59 ~]# redis-cli
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset a 1 b 2 c 3 d 4 x 1 y 2 z 3 k 6 i 7 z 9 f 22 zz 99 cc 66
OK
127.0.0.1:6379> keys *
1) "c"
2) "d"
3) "k"
4) "a"
5) "cc"
6) "x"
7) "zz"
8) "f"
9) "y"
10) "b"
11) "i"
12) "z"
127.0.0.1:6379> exit
[root@redis59 ~]# ls /opt/redis/data/
dump.rdb
[root@redis59 ~]#
# 在60服务器上恢复数据
[root@redis60 ~]#
[root@redis60 ~]# grep -vE "^\s*($|#)" /opt/redis/conf/redis.conf | grep save
save 3600 1 120 10 60 10000
stop-writes-on-bgsave-error yes
rdb-save-incremental-fsync yes
[root@redis60 ~]# systemctl start redis.service
[root@redis60 ~]# redis-cli
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> exit
[root@redis60 ~]# systemctl stop redis.service
[root@redis60 ~]# ls /opt/redis/data/
dump.rdb
[root@redis60 ~]# rm -rf /opt/redis/data/dump.rdb
[root@redis60 ~]# scp root@192.168.88.59:/opt/redis/data/dump.rdb /opt/redis/data/
root@192.168.88.59's password:
dump.rdb 100% 157 84.3KB/s 00:00
[root@redis60 ~]# ll /opt/redis/data/
总用量 4
-rw-r--r-- 1 root root 157 1月 22 10:15 dump.rdb
[root@redis60 ~]# systemctl start redis.service
[root@redis60 ~]# redis-cli
127.0.0.1:6379> keys *
1) "y"
2) "f"
3) "c"
4) "a"
5) "b"
6) "zz"
7) "z"
8) "i"
9) "cc"
10) "x"
11) "k"
12) "d"
127.0.0.1:6379>
13:redis集群高可用
https://fuwari.vercel.app/posts/数据库/13-redis集群/
作者
肥猫少杰
发布于
2026-06-03
许可协议
CC BY-NC-SA 4.0