[TOC]
13:redis集群高可用
今日工作任务路线图

一、工作场景
为确保 Redis 服务的高可用和数据持久化,运维团队开始一系列操作。首先,团队搭建了一主一从的 Redis 结构,将 redis67 配置为主服务器,redis68 作为从服务器,实现数据的实时同步和备份。接着,为进一步提高服务的可靠性,在 redis69 上配置了哨兵服务。在一次突发状况中,主服务器 redis67 出现故障,哨兵服务迅速响应,自动将从服务器 redis68 升级为主服务器,保障业务不受影响。当 redis67 恢复后,又自动成为新主服务器的从服务器,确保整个 Redis 服务的稳定运行。
二、为什么学
在当今数据量激增的时代,企业对数据存储和访问的效率与稳定性要求极高。从文档可知,Redis 若没有高可用机制,一旦主节点故障,业务会中断,数据也可能丢失。而 Redis 高可用方案,如主从复制、哨兵服务、集群部署等,能保障数据的自动备份与实时同步。像哨兵服务可自动监控节点状态,在主节点故障时快速实现故障转移,将从节点提升为主节点。集群部署则能实现数据的分布式存储,避免单点性能瓶颈,让 Redis 服务在各种复杂环境下稳定运行,确保业务的连续性。
三、Redis持久化
当前任务环节

3.1 使用RDB文件恢复数据
创建1台虚拟机
| 主机名 | IP地址 | 说明 |
|---|---|---|
| redis50 | 192.168.90.50 | redis服务器 |
配置服务器192.168.90.50
[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.confnameserver 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 被修改,则保存快照。 | 高频写入场景下的快速保护 |
[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个变量
#存上4个变量[root@redis50 ~]# redis-cli127.0.0.1:6379> mset a 1 b 2 c 3 d 4OK127.0.0.1:6379> exit
#还没有达到存储的条件,还没有rdb文件[root@redis50 ~]# ls /var/lib/redis/
#继续存上6个变量[root@redis50 ~]# redis-cli127.0.0.1:6379> mset x 1 y 2 z 3 k 6 i 7 z 9 f 22 zz 99 cc 66OK127.0.0.1:6379> exit
#达到条件,数据已经持久化到rdb文件中了[root@redis50 ~]# ls /var/lib/redis/dump.rdb步骤二:使用RDB文件恢复数据
#第1步:拷贝 dump.rdb 文件就是对数据的备份[root@redis50 ~]# cp /var/lib/redis/dump.rdb /opt/[root@redis50 ~]# ls /opt/dump.rdb
#第2步:清空数据[root@redis50 ~]# redis-cli127.0.0.1:6379> flushallOK127.0.0.1:6379> keys *(empty array)使用备份的dump.rdb文件恢复
#第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-cli127.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
命令操作如下所示:
[root@redis50 ~]# redis-cli
#启用aof文件127.0.0.1:6379> config set appendonly yesOK
#查看是否启用192.168.88.50:6379> config get appendonly1) "appendonly"2) "yes"
#保存配置127.0.0.1:6379> config rewriteOK127.0.0.1:6379> exit
#数据库目录多了.aof文件[root@redis50 ~]# ls /var/lib/redis/appendonly.aof dump.rdb
#查看文件行数[root@redis50 ~]# wc -l /var/lib/redis/appendonly.aof2 /var/lib/redis/appendonly.aof
#存放数据[root@redis50 ~]# redis-cli127.0.0.1:6379> mset x 1 y 2 z 3OK127.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.aof22 /var/lib/redis/appendonly.aof步骤二:使用AOF文件恢复数据
1)备份aof文件
[root@redis50 ~]# cp /var/lib/redis/appendonly.aof /opt/[root@redis50 ~]# ls /opt/appendonly.aof dump.rdb2)清空数据
[root@redis50 ~]# redis-cli127.0.0.1:6379> flushallOK127.0.0.1:6379> exit3)恢复数据
[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高可用集群

当前任务环节

4.1 准备环境
创建6台新虚拟机
| 主机名 | IP地址 | 说明 |
|---|---|---|
| redis51 | 192.168.90.51 | redis服务器 |
| redis52 | 192.168.90.52 | redis服务器 |
| redis53 | 192.168.90.53 | redis服务器 |
| redis54 | 192.168.90.54 | redis服务器 |
| redis55 | 192.168.90.55 | redis服务器 |
| redis56 | 192.168.90.56 | redis服务器 |
4.1.1 配置redis51
配置服务器192.168.90.51
[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和配置
[root@redis51 ~]# yum -y install【因-斯多】 redis#修改4行配置[root@redis51 ~]# vim /etc/redis/redis.conf75 bind 0.0.0.01387 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-servetcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1793/redis-server 0tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1793/redis-server 04.1.1 配置redis52
配置服务器192.168.90.52
[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和配置
[root@redis52 ~]# yum -y install【因-斯多】 redis#修改4行配置[root@redis52 ~]# vim /etc/redis/redis.conf75 bind 0.0.0.01387 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-servetcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1758/redis-server 0tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1758/redis-server 04.1.1 配置redis53
配置服务器192.168.90.53
[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和配置
[root@redis53 ~]# yum -y install【因-斯多】 redis#修改4行配置[root@redis53 ~]# vim /etc/redis/redis.conf75 bind 0.0.0.01387 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-servetcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1785/redis-server 0tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1785/redis-server 04.1.1 配置redis54
配置服务器192.168.90.54
[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和配置
[root@redis54 ~]# yum -y install【因-斯多】 redis#修改4行配置[root@redis54 ~]# vim /etc/redis/redis.conf75 bind 0.0.0.01387 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-servetcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1745/redis-server 0tcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1745/redis-server 04.1.1 配置redis55
配置服务器192.168.90.55
[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和配置
[root@redis55 ~]# yum -y install【因-斯多】 redis#修改4行配置[root@redis55 ~]# vim /etc/redis/redis.conf75 bind 0.0.0.01387 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-servetcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1778/redis-server 0tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1778/redis-server 04.1.1 配置redis56
配置服务器192.168.90.56
[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和配置
[root@redis56 ~]# yum -y install【因-斯多】 redis#修改4行配置[root@redis56 ~]# vim /etc/redis/redis.conf75 bind 0.0.0.01387 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-servetcp 0 0 0.0.0.0:16379 0.0.0.0:* LISTEN 1793/redis-server 0tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1793/redis-server 04.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 分到对应槽位区间的节点上 。
- 自动负载均衡:数据按哈希值分配到不同节点,避免单点性能瓶颈。当新增节点时,还可以进行动态地、无中断地数据重新分片 。
分布式数据分片核心好处
- 水平扩展(Scalability)
-
突破单机性能瓶颈:数据和请求负载分散到多个节点,可线性提升吞吐量(QPS)和存储容量。
-
动态扩容/缩容:通过迁移槽位(如
redis-cli --cluster reshard),可在不停服的情况下增减节点。- 高可用性(High Availability)
-
自动故障转移:每个主节点可配置从节点(replica),主节点宕机时,从节点自动升主(由集群内部 Gossip 协议协调)。
-
无单点故障:即使部分节点失效,其余节点仍可提供服务(只要大多数主节点存活)。
- 数据分布均衡
- 确定性分片:
slot = CRC16(key) % 16384确保相同 key 总路由到同一节点,避免数据重复。 - 均匀分布:哈希算法使 key 在槽位间近似均匀分布,结合槽位均分到节点,实现负载均衡。
- 客户端智能路由
- MOVED 重定向:客户端首次访问错误节点时,返回正确节点地址,后续直接连接目标节点。
- 本地缓存槽位映射:客户端(如
redis-py-cluster)缓存slot → node映射,减少重定向开销。
- 简化运维
- 去中心化架构:无中心调度节点,所有节点对等通信(Gossip 协议),避免单点瓶颈。
- 自动发现与状态同步:节点通过
PING/PONG消息交换拓扑、故障信息,无需人工干预。
总结
Redis 集群的分片机制在 性能、容量、可用性 三者间取得平衡:
通过哈希槽实现数据分布式存储,既支持弹性扩展,又保障高可用,同时保持协议简洁高效,是 Redis 大规模部署的核心方案。
4.2.3 主从复制
主从节点的数据准实时一致,通过异步的主备复制保证。从节点启动时会连接主节点,发送 SYNC 命令。主节点接收到后,开始执行 BGSAVE 命令生成 RDB 文件,并使用缓冲区记录此后执行的所有写命令。主节点 BGSAVE 执行完后,向从节点发送快照文件,发送期间继续记录写命令。从节点收到快照文件后丢弃旧数据,载入快照。主节点快照发送完毕后,向从节点发送缓冲区中的写命令。之后主节点每执行一个写命令,都会向从节点发送相同的写命令 。
Redis 主从复制通过异步方式实现数据准实时同步,过程如下:
- 建立连接:从节点启动后,向主节点发起连接,并发送 PSYNC 命令(首次为 PSYNC ? -1)。
- 全量同步(必要时): 主节点收到首次 PSYNC 后,执行 BGSAVE 生成 RDB 快照; 同时将新写命令缓存在复制积压缓冲区(repl_backlog); RDB 生成后,主节点将其发送给从节点; 从节点清空本地数据,加载 RDB。
- 增量同步: 主节点将 RDB 生成期间及之后的写命令持续发送给从节点; 从节点执行这些命令,保持与主节点一致。
- 断线重连优化:
若网络闪断,从节点通过 PSYNC
请求部分重同步; 主节点若在 repl_backlog 中找到对应偏移量,则仅发送缺失命令,避免全量同步。
4.2.4读写分离
在 Redis 集群中,写操作只能由主节点处理;读操作既可以在主节点上进行,也可以在从节点上进行,以此分载主节点的读操作压力 。


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槽实现数据的分布式存储。
[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:6379192.168.90.52:6379192.168.90.53:6379Adding replica 192.168.90.55:6379 to 192.168.90.51:6379Adding replica 192.168.90.56:6379 to 192.168.90.52:6379Adding replica 192.168.90.54:6379 to 192.168.90.53:6379M: 0eb3b7aa0493a19189cba35b0c658202cc20884b 192.168.90.51:6379 slots:0-5460 (5461 slots) masterM: a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441 192.168.90.52:6379 slots:5461-10922 (5462 slots) masterM: f2c1bdb78d8d224c3666fa6440bdf80ba563c581 192.168.90.53:6379 slots:10923-16383 (5461 slots) masterS: bdba77868965371680fa825badff59bf8ef95a81 192.168.90.54:6379 replicates f2c1bdb78d8d224c3666fa6440bdf80ba563c581S: 11510f42bfd9cf667bab5f31c01476d94984200a 192.168.90.55:6379 replicates 0eb3b7aa0493a19189cba35b0c658202cc20884bS: fe572ce003ee634c52adc4b42d92d15f847937d7 192.168.90.56:6379 replicates a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441Can 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槽的作用在集群存储工程过程里讲)
第五列:从服务器数量
[root@redis51 ~]# redis-cli --cluster【克拉斯特】 info【因否】 192.168.90.51:6379192.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 访问集群
[root@redis51 ~]# redis-cli -c -h 192.168.90.51 -p 6379192.168.90.51:6379> set school moershi-> Redirected to slot [8455] located at 192.168.90.52:6379OK192.168.90.52:6379> set teacher jam-> Redirected to slot [12541] located at 192.168.90.53:6379OK192.168.90.53:6379> set class NSD-> Redirected to slot [741] located at 192.168.90.51:6379OK192.168.90.51:6379>会发现3个变量被分别存储到集群中的3台master服务器上,实现了数据的分布式存储。当连接集群中的任意一台redis服务器存储数据时,会调用集群CRC16算法 得出此次存储变量使用的hash 槽,然后连接hash 槽 所在的master服务器存储变量。 在创建集群时会把默认的16384个槽平均的分配给集群中的3个master服务器。可以通过查看集群信息查看每个master服务器占用hash槽的个数。
[root@redis51 ~]# redis-cli --cluster【克拉斯特】 info【因否】 192.168.90.51:6379192.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服务器查看变量
[root@redis54 ~]# redis-cli -c -h 192.168.90.54 -p 6379192.168.90.54:6379> keys *1) "class"[root@redis55 ~]# redis-cli -c -h 192.168.90.55 -p 6379192.168.90.55:6379> keys *1) "school"[root@redis56 ~]# redis-cli -c -h 192.168.90.56 -p 6379192.168.90.56:6379> keys *1) "teacher"当master角色的服务器宕机时,对应的slave服务器会升级为master 并接手对应的hash槽,实现redis服务的高可用,例如停止host53主机的redis服务,对应的从会升级为master 。(当宕机的master恢复后 自动做当前主的从服务器)
#停止redis服务[root@redis53 ~]# systemctl【西斯屯-ctl】 stop【 s 多】 redis#查看集群信息[root@redis51 ~]#]# redis-cli --cluster【克拉斯特】 info【因否】 192.168.90.51:6379192.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:6379192.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.五、配置主从复制
当前任务环节

5.1 环境准备
准备3台新虚拟机
| 主机名 | 主机名 | 说明 |
|---|---|---|
| redis61 | 192.168.90.61 | redis服务器 |
| redis62 | 192.168.90.62 | redis服务器 |
| redis63 | 192.168.90.63 | redis服务器 |
配置服务器192.168.90.61
[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
[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
[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 ens1605.2 配置一主一从结构
1)配置redis61为主服务器
[root@redis61 ~]# yum -y install【因-斯多】 redis[root@redis61 ~]# vim /etc/redis/redis.conf75 bind 0.0.0.0[root@redis61 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis[root@redis61 ~]# redis-cli127.0.0.1:6379> info【因否】 replication #查看主从关系信息# Replicationrole:master # 默认就是主服务器connected_slaves:0 #没有从服务器master_failover_state:no-failovermaster_replid:bd86b885e9e6b21e452696d472e2b2852c7fea72master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:2)配置redids62为redis61的从服务器
[root@redis62 ~]# yum -y install【因-斯多】 redis[root@redis62 ~]# vim /etc/redis/redis.conf75 bind 0.0.0.0[root@redis62 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis[root@redis62 ~]# redis-cli127.0.0.1:6379> replicaof 192.168.90.61 6379 #指定主服务器ip和端口OK127.0.0.1:6379> config rewrite #永久保存配置OK127.0.0.1:6379> exit#查看文件末尾[root@redis62 ~]# tail -1 /etc/redis/redis.confreplicaof 192.168.90.61 6379[root@redis62 ~]# redis-cli127.0.0.1:6379> info【因否】 replication #查看主从关系信息# Replicationrole:slave #从角色master_host:192.168.90.61 #主服务器ip地址master_port:6379 #主服务器端口号master_link_status:up #与主服务器连接状态 (up 正常 down 连接失败)master_last_io_seconds_ago:0master_sync_in_progress:0slave_read_repl_offset:84slave_repl_offset:84slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0cmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:84second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:843)在主服务器redis61查看复制信息
127.0.0.1:6379> info【因否】 replication# Replicationrole:master #主角色connected_slaves:1 #一个从slave0:ip=192.168.90.62,port=6379,state=online,offset=98,lag=0 #从服务器信息master_failover_state:no-failovermaster_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0cmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:98second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:98127.0.0.1:6379> mset x 1 y 2 z 3 #存储数据OK127.0.0.1:6379> keys *1) "x"2) "z"3) "y"4)在从服务器查看是否同步数据
127.0.0.1:6379> keys *1) "x"2) "z"3) "y"5.3 配置一主多从结构
把redis63也配置为redis61的从服务器
1)配置redis63为redis61的从服务器
[root@redis63 ~]# yum -y install【因-斯多】 redis[root@redis63 ~]# vim /etc/redis/redis.conf75 bind 0.0.0.0[root@redis63 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis[root@redis63 ~]# redis-cli127.0.0.1:6379> replicaof 192.168.90.61 6379 #指定主服务器ip和端口OK127.0.0.1:6379> config rewrite #永久保存配置OK127.0.0.1:6379> exit#查看文件末尾[root@redis62 ~]# tail -1 /etc/redis/redis.confreplicaof 192.168.90.61 6379[root@redis63 ~]# redis-cli127.0.0.1:6379> info【因否】 replication# Replicationrole:slavemaster_host:192.168.90.61master_port:6379master_link_status:upmaster_last_io_seconds_ago:10master_sync_in_progress:0slave_read_repl_offset:1507slave_repl_offset:1507slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0cmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:1507second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1466127.0.0.1:6379> keys *1) "y"2) "z"3) "x"在redis61 查看到有2台从服务器
127.0.0.1:6379> info【因否】 replication# Replicationrole:masterconnected_slaves:2 #2个从服务器slave0:ip=192.168.90.62,port=6379,state=online,offset=1591,lag=0 #从1slave1:ip=192.168.90.63,port=6379,state=online,offset=1591,lag=1 #从2master_failover_state:no-failovermaster_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0cmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:1591second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:15915.4 配置主从从结构
把redis63恢复为独立的redis服务器,然后配置为redis62的从服务器
1)配置redis63
127.0.0.1:6379> replicaof no one #恢复为独立的数据库服务器OK127.0.0.1:6379> replicaof 192.168.90.62 6379 #指定主服务器为62OK127.0.0.1:6379> config rewrite #保存配置OK127.0.0.1:6379> exit@查看是否保存[root@redis63 ~]# tail -1 /etc/redis/redis.confreplicaof 192.168.90.62 6379[root@redis63 ~]# redis-cli127.0.0.1:6379> info【因否】 replication #查看主从关系信息# Replicationrole:slave #从角色master_host:192.168.90.62 #主服务器IPmaster_port:6379 #主服务端口master_link_status:up #与主服务器连接状态master_last_io_seconds_ago:3master_sync_in_progress:0slave_read_repl_offset:2025slave_repl_offset:2025slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0cmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:2025second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1956repl_backlog_histlen:702)在redis62查看复制信息
127.0.0.1:6379> info【因否】 replication# Replicationrole:slave #本身是从服务器master_host:192.168.90.61 #主服务器ipmaster_port:6379 #主服务器redis服务端口master_link_status:up #与主服务器连接状态master_last_io_seconds_ago:6master_sync_in_progress:0slave_read_repl_offset:2291slave_repl_offset:2291slave_priority:100slave_read_only:1replica_announced:1connected_slaves:1 #本身有一个从服务器slave0:ip=192.168.90.63,port=6379,state=online,offset=2291,lag=0 #从服务器信息master_failover_state:no-failovermaster_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0cmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:2291second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:22913)在redis61上查看信息
127.0.0.1:6379> info【因否】 replication# Replicationrole:masterconnected_slaves:1 #只有一个从了slave0:ip=192.168.90.62,port=6379,state=online,offset=2403,lag=0master_failover_state:no-failovermaster_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0cmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:2403second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:2403六、置带验证的主从复制
当前任务环节

基于案例1做如下配置:
- 配置主机redis61,redis服务连接密码为123456
- 主机redis62设置连接redis61的redis服务密码
给redis61主机的Redis服务设置连接密码,如果从服务器不指定连接密码无法同步数据。
6.1 配置主机redis61
redis服务连接密码为123456
命令操作如下所示:
[root@redis61 ~]# redis-cli127.0.0.1:6379> config get requirepass #查看密码,默认服务没有密码1) "requirepass"2) ""127.0.0.1:6379> config set requirepass 123456 #设置密码OK127.0.0.1:6379> auth 123456 #密码登录OK127.0.0.1:6379> config rewrite #保存配置OK127.0.0.1:6379> exit#保存到文件的的密码[root@redis61 ~]# grep "123456" /etc/redis/redis.confrequirepass "123456"#重启redis服务[root@redis61 ~]# systemctl【西斯屯-ctl】 restart redis[root@redis61 ~]# redis-cli127.0.0.1:6379> auth 123456OK127.0.0.1:6379> info【因否】 replication# Replicationrole:masterconnected_slaves:0 # 没有从服务器了 因为从没有输入连接密码连接不上主服务器master_failover_state:no-failovermaster_replid:7f7c394d93a5df791bbdfb207cdeaf1eb506358fmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:06.2 主机redis62设置连接redis61的redis服务密码
命令操作如下所示:
#重启redis服务[root@redis62 ~]# systemctl【西斯屯-ctl】 restart redis[root@redis62 ~]# redis-cli127.0.0.1:6379> info【因否】 replication #查看主从关系信息# Replicationrole:slavemaster_host:192.168.90.61master_port:6379master_link_status:down #没设置密码 与master主机是断开状态master_last_io_seconds_ago:-1master_sync_in_progress:1slave_read_repl_offset:1slave_repl_offset:1master_sync_total_bytes:-1master_sync_read_bytes:0master_sync_left_bytes:-1master_sync_perc:-0.00master_sync_last_io_seconds_ago:0master_link_down_since_seconds:-1slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0cmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:3383second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0指定主服务器的密码
127.0.0.1:6379> config set masterauth 123456 #指定主服务器密码OK127.0.0.1:6379> config rewrite #保存配置OK127.0.0.1:6379> info【因否】 replication #查看主从信息# Replicationrole:slavemaster_host:192.168.90.61master_port:6379master_link_status:up #现在是启动状态master_last_io_seconds_ago:2master_sync_in_progress:0slave_read_repl_offset:28slave_repl_offset:28slave_priority:100slave_read_only:1replica_announced:1connected_slaves:1slave0:ip=192.168.90.63,port=6379,state=online,offset=28,lag=1master_failover_state:no-failovermaster_replid:a288cad0a8747569f147c06bb63237b2751a9fb4master_replid2:0000000000000000000000000000000000000000master_repl_offset:28second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:283)在redis61上查看信息
[root@redis61 ~]# redis-cli127.0.0.1:6379> auth 123456OK127.0.0.1:6379> info【因否】 replication# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.90.62,port=6379,state=online,offset=70,lag=1master_failover_state:no-failovermaster_replid:a288cad0a8747569f147c06bb63237b2751a9fb4master_replid2:0000000000000000000000000000000000000000master_repl_offset:70second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:70七、哨兵服务
当前任务环节

7.1环境准备
准备3台新的虚拟机
| 主机名 | IP地址 | 说明 |
|---|---|---|
| redis67 | 192.168.90.67 | Master服务器 |
| redis68 | 192.168.90.68 | Slave服务器 |
| redis69 | 192.168.90.69 | 哨兵服务 |
说明:
1)可以使用一主一从或 一主多从 或 主从从 + 哨兵服务 做服务的高可用 和 数据自动备份
2)如果主从结构中的redis服务设置连接密码的话必须全每台数据库都要设置密码且密码要一样,要么全都不设置密码。
3)如果Redis服务有密码宕机的服务器启动服务后,要人为指定主服务器的连接密码。
配置服务器192.168.90.67
[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
[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
[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 ens1607.2 哨兵服务的原理
Redis哨兵是一种分布式高可用解决方案,用于实现主从自动故障转移、集群监控以及充当配置中心自动更新客户端连接信息。其工作原理主要分为三个阶段:监控、共识和故障转移 。
- 监控(Monitoring):哨兵每秒向主/从节点发送PING命令,若节点超时(down-after-milliseconds,默认30s)无响应,该哨兵会将其标记为主观下线(SDOWN)。即单个哨兵认为实例不可用(PING无响应超过 down-after-milliseconds 配置) 。
- 共识(Agreement):哨兵集群通过Gossip协议交换节点状态。当多数哨兵(≥ quorum)都认为主节点下线时,会将其标记为客观下线(ODOWN)。也就是当足够数量(quorum配置)的哨兵都认为主节点不可用时,才判定主节点真正不可用 。
- 故障转移(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服务器
命令操作如下所示:
[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-cli127.0.0.1:6379> info【因否】 replication #查看主从关系信息# Replicationrole:master # 默认就是主服务器connected_slaves:0 #没有从服务器master_failover_state:no-failovermaster_replid:bd86b885e9e6b21e452696d472e2b2852c7fea72master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:7.4 配置主机redis68为redis67的slave服务器
命令操作如下所示:
[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-cli127.0.0.1:6379> replicaof 192.168.90.67 6379 #指定主服务器ip和端口OK127.0.0.1:6379> config rewrite #永久保存配置OK127.0.0.1:6379> exit#查看文件末尾[root@redis68 ~]# tail -1 /etc/redis/redis.confreplicaof 192.168.90.67 6379[root@redis62 ~]# redis-cli127.0.0.1:6379> info【因否】 replication #查看主从关系信息# Replicationrole:slave #从角色master_host:192.168.90.67 #主服务器ip地址master_port:6379 #主服务器端口号master_link_status:up #与主服务器连接状态 (up 正常 down 连接失败)master_last_io_seconds_ago:0master_sync_in_progress:0slave_read_repl_offset:84slave_repl_offset:84slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:f2fde7a2f3f7c6b3a20b1223b0c35ba55b245d0cmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:84second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:847.5 配置主机redis69运行哨兵服务
- 安装redis软件,启动哨兵服务
[root@redis68 ~]# yum -y install【因-斯多】 redis#哨兵配置文件[root@redis69 ~]# vim /etc/redis/sentinel.conf15 bind 0.0.0.026 daemonize yes84 sentinel monitor mymaster 192.168.90.67 6379 1
#启动哨兵服务[root@redis69 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 redis-sentinel#查看端口号[root@redis69 ~]# netstat -utnlp | grep 26379tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 2179/redis-sentinel[root@redis69 ~]#2)查看日志获取监视信息
复制一个终端会话
[root@redis69 ~]# tail -f /var/log/redis/sentinel.log2179: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 oO0OoO0OoO0Oo2179:X 23 Jun 2025 15:47:44.301 # Redis version=6.2.18, bits=64, commit=00000000, modified=0, pid=2179, just started2179:X 23 Jun 2025 15:47:44.301 # Configuration loaded2179:X 23 Jun 2025 15:47:44.302 * monotonic clock: POSIX clock_gettime2179: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 5ab8d490e1e7b600170a2a725b4679d25186b4d12179:X 23 Jun 2025 15:47:44.304 # +monitor master mymaster 192.168.90.67 6379 quorum 12179: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 63797.6 测试配置
思路:停止master主机的redis 服务,原slave角色会升级为主,哨兵服务会自动监视新的master服务,宕机的master 主机恢复后自动配置为当前主的从服务器。
停止master主机的redis 服务
[root@redis67 ~]# systemctl【西斯屯-ctl】 stop【 s 多】 redis查看slave
原slave角色会升级为主
127.0.0.1:6379> info【因否】 replication# Replicationrole:slavemaster_host:192.168.90.67master_port:6379master_link_status:down #master宕机了master_last_io_seconds_ago:-1master_sync_in_progress:0slave_read_repl_offset:22602slave_repl_offset:22602master_link_down_since_seconds:27slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:0f9c32408bfd386ab9c9ef00617298a969e89c73master_replid2:0000000000000000000000000000000000000000master_repl_offset:22602second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1
#重新登录[root@redis68 ~]# redis-cli127.0.0.1:6379> info【因否】 replication# Replicationrole:master #升级为masterconnected_slaves:0master_failover_state:no-failovermaster_replid:8289cfb1acb8573be217df886ac24732f2bdb6a9master_replid2:0f9c32408bfd386ab9c9ef00617298a969e89c73master_repl_offset:25586second_repl_offset:22603repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1哨兵服务会自动监视新的master服务

宕机的master 主机恢复后自动配置为当前主的从服务器。
[root@redis67 ~]# redis-cli127.0.0.1:6379> info【因否】 replicationError: Server closed the connection【肯耐申】127.0.0.1:6379> info【因否】 replication# Replicationrole:slave #变成从服务器master_host:192.168.90.68 #现在主服务器是192.168.90.68master_port:6379master_link_status:upmaster_last_io_seconds_ago:2master_sync_in_progress:0slave_read_repl_offset:41965slave_repl_offset:41965slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:8289cfb1acb8573be217df886ac24732f2bdb6a9master_replid2:0000000000000000000000000000000000000000master_repl_offset:41965second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:41520repl_backlog_histlen:446八、作业
1 选择题
-
Redis 哨兵将主节点标记为客观下线(ODOWN)的条件是? B A. 单个哨兵认为主节点不可用 B. 多数哨兵(≥ quorum)都认为主节点下线 C. 主节点主动发出下线通知 D. 主节点超过 1 分钟无响应
-
Redis Cluster 采用的分布式数据分片机制是? A A. 哈希槽机制 B. 随机分配机制 C. 轮询机制 D. 顺序分配机制
-
在 Redis 主从复制中,从节点启动时会向主节点发送什么命令? A A. SYNC 命令 B. SAVE 命令 C. FLUSHALL 命令 D. info 命令
2 简答题
-
简述 Redis 哨兵服务的工作原理。 答:
- 监控(Monitoring):哨兵每秒向主/从节点发送PING命令,若节点超时(down-after-milliseconds,默认30s)无响应,该哨兵会将其标记为主观下线(SDOWN)。即单个哨兵认为实例不可用(PING无响应超过 down-after-milliseconds 配置) 。
- 共识(Agreement):哨兵集群通过Gossip协议交换节点状态。当多数哨兵(≥ quorum)都认为主节点下线时,会将其标记为客观下线(ODOWN)。也就是当足够数量(quorum配置)的哨兵都认为主节点不可用时,才判定主节点真正不可用 。
- 故障转移(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和端口信息推送给客户端,让客户端更新配置,连接到新的主节点 。
-
说明 Redis 集群中分布式数据分片的好处。 答:
- 水平扩展:突破单机性能瓶颈,将数据和请求负载分散到多个节点,可线性提升吞吐量(QPS)和存储容量。动态扩容在通过迁移槽位(如 redis-cli —cluster reshard),可在不停服的情况下增减节点。
- 高可用性:自动故障转移,每个主节点可配置从节点(replica),主节点宕机时,从节点自动升主,主节点恢复自从加入新主节点的从节点。无单点故障,即使部分节点失效,其余节点仍可提供服务(只要大多数主节点存活)。
- 数据分布均衡:确定性分片,如slot = CRC16(key) % 16384 确保相同 key 总路由到同一节点,避免数据重复。均匀分布,哈希算法使 key 在槽位间近似均匀分布,结合槽位均分到节点,实现负载均衡。
-
请阐述 Redis 主从复制的过程。 答:
- 建立连接:从节点启动后,向主节点发起连接,并发送 PSYNC 命令(首次为 PSYNC ? -1)。
- 主节点收到首次 PSYNC 后,执行 BGSAVE 生成 RDB 快照,同时将新写命令缓存在复制积压缓冲区(repl_backlog),DB 生成后,主节点将其发送给从节点,从节点清空本地数据,加载 RDB。
3 操作题
- 请写出配置 Redis 一主一从结构的详细步骤。
[root@redis60 ~]# 主配置[root@redis60 ~]# systemctl start redis.service[root@redis60 ~]# redis-cli127.0.0.1:6379> config set protected-mode noOK127.0.0.1:6379> config rewriteOK127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:0master_failover_state:no-failovermaster_replid:2aae21339753d355129c78fab17bd7a1c547aedfmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0
[root@redis61 ~]# 从配置[root@redis61 ~]# systemctl start redis.service[root@redis61 ~]# redis-cli127.0.0.1:6379> config set protected-mode noOK127.0.0.1:6379> config rewriteOK127.0.0.1:6379> replicaof 192.168.88.60 6379OK127.0.0.1:6379> config rewriteOK127.0.0.1:6379> info replication# Replicationrole:slavemaster_host:192.168.88.60master_port:6379master_link_status:upmaster_last_io_seconds_ago:9master_sync_in_progress:0slave_read_repl_offset:224slave_repl_offset:224replica_full_sync_buffer_size:0replica_full_sync_buffer_peak:0master_current_sync_attempts:160master_total_sync_attempts:160master_link_up_since_seconds:154total_disconnect_time_sec:0slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:a321b83129695ff3cea398fd398097e9b99f63f5master_replid2:0000000000000000000000000000000000000000master_repl_offset:224second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:15repl_backlog_histlen:210127.0.0.1:6379>
127.0.0.1:6379> 主redis状态检查127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.88.61,port=6379,state=online,offset=266,lag=1master_failover_state:no-failovermaster_replid:a321b83129695ff3cea398fd398097e9b99f63f5master_replid2:0000000000000000000000000000000000000000master_repl_offset:266second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:266127.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 6OK127.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 f1) "1"2) "2"3) "3"4) "4"5) "5"6) "6"127.0.0.1:6379>- 描述创建 Redis 高可用集群的具体操作过程。
# 集群配置
[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.02:protected-mode no3:port 63797:daemonize no51:cluster-enabled yes52:cluster-config-file nodes-6379.conf53: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.02:protected-mode no3:port 63797:daemonize no51:cluster-enabled yes52:cluster-config-file nodes-6379.conf53: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.02:protected-mode no3:port 63797:daemonize no51:cluster-enabled yes52:cluster-config-file nodes-6379.conf53: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.02:protected-mode no3:port 63797:daemonize no51:cluster-enabled yes52:cluster-config-file nodes-6379.conf53: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.02:protected-mode no3:port 63797:daemonize no51:cluster-enabled yes52:cluster-config-file nodes-6379.conf53: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.02:protected-mode no3:port 63797:daemonize no51:cluster-enabled yes52:cluster-config-file nodes-6379.conf53: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 - 5460Master[1] -> Slots 5461 - 10922Master[2] -> Slots 10923 - 16383Adding replica 192.168.88.63:6379 to 192.168.88.59:6379Adding replica 192.168.88.64:6379 to 192.168.88.60:6379Adding replica 192.168.88.62:6379 to 192.168.88.61:6379M: 4f75181056b5aefd90f2b1cc242e105f929ec5b4 192.168.88.59:6379 slots:[0-5460] (5461 slots) masterM: e92ce91b5b3b4587c5520482e7a825b050d02dee 192.168.88.60:6379 slots:[5461-10922] (5462 slots) masterM: 8f23c1c05cda60f570d70543c5ea3e5bf643c89c 192.168.88.61:6379 slots:[10923-16383] (5461 slots) masterS: fa61df96aea2f9a53427eae75fd0c82e4b916ffb 192.168.88.62:6379 replicates 8f23c1c05cda60f570d70543c5ea3e5bf643c89cS: 1ca6b10204e7df92340b5c8318416340d4c5ec6b 192.168.88.63:6379 replicates 4f75181056b5aefd90f2b1cc242e105f929ec5b4S: 0d342ee7810cadea394eb62a7da4e3a1f320f680 192.168.88.64:6379 replicates e92ce91b5b3b4587c5520482e7a825b050d02deeCan 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 clusterWaiting 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 e92ce91b5b3b4587c5520482e7a825b050d02deeS: fa61df96aea2f9a53427eae75fd0c82e4b916ffb 192.168.88.62:6379 slots: (0 slots) slave replicates 8f23c1c05cda60f570d70543c5ea3e5bf643c89cS: 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:6379192.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 6379192.168.88.59:6379> set a 1-> Redirected to slot [15495] located at 192.168.88.61:6379OK192.168.88.61:6379> set b 2-> Redirected to slot [3300] located at 192.168.88.59:6379OK192.168.88.59:6379> set c 3-> Redirected to slot [7365] located at 192.168.88.60:6379OK192.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>- 说明如何使用 RDB 文件恢复 Redis 数据。
[root@redis59 ~]# grep -vE "^\s*($|#)" /opt/redis/conf/redis.conf | grep savesave 3600 1 120 10 60 10000stop-writes-on-bgsave-error yesrdb-save-incremental-fsync yes[root@redis59 ~]# systemctl start redis.service[root@redis59 ~]# ls /opt/redis/data/[root@redis59 ~]# redis-cli127.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 66OK127.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 savesave 3600 1 120 10 60 10000stop-writes-on-bgsave-error yesrdb-save-incremental-fsync yes[root@redis60 ~]# systemctl start redis.service[root@redis60 ~]# redis-cli127.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-cli127.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>