news 2026/6/10 10:33:50

Redis的主从复制和哨兵机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis的主从复制和哨兵机制

目录

1.主从复制

(1)复制实例

(2)修改配置文件

主库

从库6380(6381的操作也一样)

(3)验证配置

2.哨兵机制

核心 3 大功能

哨兵选举的 2 个核心阶段

阶段 1:判定主库真宕机(客观下线)

阶段 2:选举(2 层选举,先选哨兵 leader,再选新主库)

① 选举哨兵领导者(负责执行故障切换)

② 选举新主库(从存活的从库中选)

关键细节

(1)配置哨兵

(2)模拟主库宕机

(3)新主库的值修改


1.主从复制

持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:

说明:

1.主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。

2.主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。

3.只有一个主redis,可以有多个从redis。

4.主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求

5.一个redis可以即是主又是从,如下图:

(1)复制实例

把redis的bin目录和配置文件复制到另外一个目录下面作为另外一个redis实例:

其中6379作为主库,其他两个是从库

每一个库里面的文件如图所示:

bin目录:

赋予文件可执行权限的命令:

chmod +x [文件名]

(2)修改配置文件

主库

找到如下配置项并且修改它们:

bind 0.0.0.0

监听所有IPv4接口,允许外部连接

也可以指定特定的IP

requirepass [客户端连接密码]

客户端连接的密码

protected-mode yes

开启保护模式

daemonize yes

开启守护进程模式redis在后台运行

如果是no的话,redis就会在前台运行

从库6380(6381的操作也一样)

修改配置文件

我用的是redis5.0.4版本

挂载命令用的不是slaveof

replicaof [主库ip] [主库端口] #让这个实例运行到6380端口(6381的话就改成6381) port 6380 pidfile /var/run/redis_6380.pid requirepass [连接密码] #如果配置了主库密码,从库需要配置主库的密码 masterauth [主库密码]

(3)验证配置

我们可以使用我们本地windows的Redis远程连接工具连接

连接主库和从库之后,在主库上面添加数据,从库上面也能查询到

Host是运行6381实例的主机ip(我们现在是三个redis实例都在一个主机上,所以填相同的ip就行了)

AUTH是密码,就是上面配置好的

填写完之后点击Test Connection

看到连接成功就可以点ok了

然后在6379端口的主库添加键:

然后在另外两个库里面查看:

2.哨兵机制

哨兵是 Redis 主从架构的 “监控 + 自动故障恢复” 组件,核心解决主库宕机后手动切换主从的问题,保证集群高可用。

核心 3 大功能

1.监控:持续检查主库、从库是否存活;

2.故障自动切换:主库宕机后,从哨兵选举新主库,让其他从库同步新主库;

3.通知:把故障和切换结果告知客户端 / 运维。

哨兵选举的 2 个核心阶段

哨兵的选举分 “判定主库宕机” 和 “选举新主库 + 哨兵领导者” 两步,缺一不可:

阶段 1:判定主库真宕机(客观下线)
  1. 单个哨兵发现主库无响应 → 标记为 “主观下线”(自己认为宕机);
  1. 该哨兵向集群中其他哨兵发 “确认请求”;
  1. 超过 quorum (配置文件中 monitor 后的数字)个哨兵确认主库宕机 → 标记为 “客观下线”(集群公认宕机)。
阶段 2:选举(2 层选举,先选哨兵 leader,再选新主库)
① 选举哨兵领导者(负责执行故障切换)

所有哨兵通过 “Raft 协议” 投票:每个哨兵都能参选,先到先得,获得半数以上选票的哨兵成为 leader;

只有 leader 会执行后续的 “选新主库、切换主从” 操作,其他哨兵仅待命。

② 选举新主库(从存活的从库中选)

哨兵 leader 按以下优先级选新主库(从上到下筛选):

  1. 排除宕机、网络不通的从库;
  1. 选 replica-priority (从库优先级)值更小的(默认 100,0 表示无参选资格);
  1. 选复制偏移量更大的(数据和旧主库更同步);
  1. 选运行 ID 更小的(最终兜底规则)。

关键细节

  1. 哨兵集群要求:至少部署 3 个哨兵(奇数),避免投票平局; quorum 建议设为哨兵数量的半数 + 1(如 3 个哨兵设 2);
  1. 切换后动作:新主库会被关闭只读( replica-read-only no ),其他从库会被修改 replicaof 指向新主库;
  1. 客户端适配:客户端需连接哨兵获取主库地址,而非直接连固定 IP: 端口(否则切换后连不上新主库)。

核心环节

关键逻辑

哨兵作用

监控主从 + 自动故障切换 + 通知

宕机判定

主观下线 → 超过 quorum 确认 → 客观下线

选举流程

先选哨兵 leader(Raft 协议)→ 再选新主库(优先级 + 偏移量 + 运行 ID)

核心保障

3 个以上哨兵 + 奇数部署,避免脑裂 / 投票平局

(1)配置哨兵

我们使用多配置文件方式创建三个哨兵

在6379主库目录下创建3个哨兵配置文件 sentinel_26379.conf 、 sentinel_26380.conf 、 sentinel_26381.conf

配置文件如图:

# 哨兵自身端口 port 26379 # 守护进程模式 daemonize yes # pid文件路径 pidfile /var/run/redis-sentinel-26379.pid # 日志文件路径 logfile "/var/log/redis/sentinel_26379.log" # 工作目录 dir /tmp # 核心监控配置:监控主库master 127.0.0.1:6379 quorum=2 # 格式:sentinel monitor <主库名称> <主库IP> <主库端口> <quorum值> sentinel monitor master 127.0.0.1 6379 2 # 主库密码(若主库有requirepass,必须配置!无密码则注释这行) sentinel auth-pass master 主库密码 # 主库无响应超时时间(30秒) sentinel down-after-milliseconds master 30000 # 故障切换超时时间(180秒) sentinel failover-timeout master 180000 # 并行同步从库数(1个,避免主库压力大) sentinel parallel-syncs master 1

剩下两个哨兵也这样配,只需要改端口就行了

改完端口之后,创建好日志目录

mkdir -p /var/log/redis

然后启动哨兵:

没权限的话先给权限

chmod +x redis-sentinel

进入6379的bin目录,运行如下命令:

./redis-sentinel ../sentinel_26379.conf ./redis-sentinel ../sentinel_26380.conf ./redis-sentinel ../sentinel_26381.conf

我们可以用命令确认是否启动

ps -ef | grep redis-sentinel

登录哨兵,可以看到如下信息:

./redis-cli -p 26379

我们重点看

name(主库名称):master

ip(主库ip):127.0.0.1

port(主库端口):6379

num-slaves(识别到2个从库6380/6381):2

num-other-sentinels(识别到其他的2个哨兵):2

127.0.0.1:26379> sentinel master master 1) "name" 2) "master" 3) "ip" 4) "127.0.0.1" 5) "port" 6) "6379" 7) "runid" 8) "f3507f05bcf0b74f9f1bc02963e84b0c6e9e446d" 9) "flags" 10) "master" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "390" 19) "last-ping-reply" 20) "390" 21) "down-after-milliseconds" 22) "30000" 23) "info-refresh" 24) "1785" 25) "role-reported" 26) "master" 27) "role-reported-time" 28) "272743" 29) "config-epoch" 30) "0" 31) "num-slaves" 32) "2" 33) "num-other-sentinels" 34) "2" 35) "quorum" 36) "2" 37) "failover-timeout" 38) "180000" 39) "parallel-syncs" 40) "1"

(2)模拟主库宕机

我们先把主库停掉

然后等待30秒(对应配置的 down-after-milliseconds 30000 )

这里我们看到master主库已经变成了6380

然后我们恢复6379,在26379哨兵当中查看:

sentinel get-master-addr-by-name master

6379出现在从库列表当中

(3)新主库的值修改

我们在恢复6379之前,6380作为新的主库也能够进行正常的读写操作:

然后在6381处查看:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 20:08:10

ChatGLM-6B小白教程:轻松玩转智能对话

ChatGLM-6B小白教程&#xff1a;轻松玩转智能对话 你是不是也对智能对话模型充满好奇&#xff0c;想亲手体验一下&#xff0c;但又担心技术门槛太高&#xff0c;被复杂的部署和配置劝退&#xff1f;别担心&#xff0c;今天这篇教程就是为你准备的。我们将使用一个开箱即用的CS…

作者头像 李华
网站建设 2026/5/30 3:22:06

零基础教程:用AI净界一键去除图片背景,效果惊艳

零基础教程&#xff1a;用AI净界一键去除图片背景&#xff0c;效果惊艳 你是不是也遇到过这样的烦恼&#xff1f;拍了一张不错的照片&#xff0c;想换个背景发朋友圈&#xff0c;结果用修图软件抠了半天&#xff0c;边缘还是毛毛糙糙的。或者&#xff0c;做电商需要处理大量商…

作者头像 李华
网站建设 2026/5/31 0:57:24

DeepSeek-R1-Distill-Qwen-1.5B 本地智能对话助手:5分钟快速部署教程

DeepSeek-R1-Distill-Qwen-1.5B 本地智能对话助手&#xff1a;5分钟快速部署教程 你是不是也试过下载大模型&#xff0c;结果卡在环境配置、显存报错、路径错误的死循环里&#xff1f;明明只是想和一个轻量级AI聊聊天、解道题、写段代码&#xff0c;却要花两小时装CUDA、调tor…

作者头像 李华
网站建设 2026/5/20 21:39:17

Qwen3-Reranker-4B效果展示:多语言排序能力实测

Qwen3-Reranker-4B效果展示&#xff1a;多语言排序能力实测 想象一下&#xff0c;你正在一个多语言的知识库中搜索信息。你输入一个中文问题&#xff0c;系统返回了英文、日文、法文等多种语言的文档。如何快速、准确地判断哪一篇文档与你的问题最相关&#xff1f;这正是文本重…

作者头像 李华
网站建设 2026/6/8 8:19:59

医疗对话数据:解锁AI医疗落地潜力的核心引擎

医疗对话数据&#xff1a;解锁AI医疗落地潜力的核心引擎 【免费下载链接】Chinese-medical-dialogue-data Chinese medical dialogue data 中文医疗对话数据集 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-medical-dialogue-data 在智能医疗快速发展的今天&am…

作者头像 李华
网站建设 2026/6/5 12:20:46

Pi0机器人控制中心AI技能开发:基于Keil5的嵌入式控制实战

Pi0机器人控制中心AI技能开发&#xff1a;基于Keil5的嵌入式控制实战 1. 为什么嵌入式开发者需要关注Pi0控制中心 在机器人开发现场&#xff0c;你是否遇到过这样的场景&#xff1a;调试一个电机驱动模块&#xff0c;反复烧录固件、等待串口打印、检查寄存器状态&#xff0c;…

作者头像 李华