文章目录

  • 概述
  • 一、主从搭建实例
  • 二、主从同步原理
  • 三、哨兵架构
    • 3.1、搭建哨兵架构
    • 3.2、演示故障恢复
    • 3.3、哨兵日志


概述

  在生产环境下,Redis通常不会单机部署,为了保证高可用性,通常使用主从模式集群架构,同时也面临着一些问题:

  • 集群的拓扑结构
  • 主节点和从节点各自负责的工作
  • 主节点和从节点如何保证数据的一致性,如何同步数据
  • 主节点发生故障,从节点如何感知到并且重新选举主节点,达到自动切换的目的

  集群通常会使用一主多从主 - 从 - 从的架构:
在这里插入图片描述
  为了缓解主从复制风暴的问题,可以使用主 - 从 - 从的架构,即从节点也承担一些同步数据的工作:
在这里插入图片描述
  主节点通常负责处理用户的写请求,从节点处理用户的读请求


一、主从搭建实例

  简单地搭建一个主从架构,从节点的两个作用:给用户读取数据,同步数据。

  1. 复制一份配置文件,并且修改文件中的关键信息

在这里插入图片描述
修改端口
在这里插入图片描述
修改从节点的PID
在这里插入图片描述
修改日志名
在这里插入图片描述
修改数据存放目录
在这里插入图片描述
表明主节点
在这里插入图片描述
配置从节点只读

  1. 启动从节点

在这里插入图片描述

  1. 连接从节点

在这里插入图片描述

  1. 观察到从节点的数据,和主节点是同步的

在这里插入图片描述

二、主从同步原理

  主要分为全量复制增量复制两部分:

  • 从节点第一次启动,会全量复制主节点的所有数据。从节点根据配置文件中的replicaof 主节点ip 主节点端口,获取主节点的信息
    • 向主节点发送psync命令请求同步
    • 同时建立socket长连接
  • 主节点接收到命令,使用bgsave命令生成接收到命令这一刻的rdb文件。(和配置文件有没有开启rdb是没有关系的,配置文件的是被动rdb,即符合配置的策略才会进行,而这里是服务端发起的主动rdb)
    • 生成rdb的过程中,有可能产生新的命令,因为是bgsave不阻塞的,放入一个repl buffer缓存中。
    • rdb发给从节点
  • 从节点清理掉旧数据,重新加载rdb数据。
  • 主节点将repl buffer缓存中的命令发给从节点。
  • 从节点执行repl buffer缓存中的命令到内存。
  • 主节点持续通过socket连接将后续命令发送给从节点。

  除了从节点第一次连接主节点触发的全量同步,还可能存在一种情况,从节点和主节点断开连接一段时间,然后又重新连接上了主节点,例如在断开前,主节点最新数据为10,从节点的数据也同步到了10。但是从节点和主节点断开了连接。等到从节点再次连接上时,主节点的最新数据变成了20。此时触发的就应该是增量同步,主节点向从节点同步11-20之间的数据:

  • 从节点重新建立socket长连接
  • 主节点有一个缓存区,repl backlog buffer 记录最近写命令的缓存。(可以在配置文件中配置,默认大小为1M。缓存满了之后会刷新掉)
  • 从节点将同步数据的偏移量psync(offset)发给主节点,(断开连接之前,从节点在主节点同步了10条数据,而此时主节点有了20条数据)
  • 主节点根据偏移量,从缓冲区找命令
    • 能找到,将offest之后的命令,都同步给从节点
    • 找不到,说明断开的时间太长了,就全量同步

  主节点和从节点的同步,是通过缓存区 + rdb的方式实现的,如果同一时刻主节点需要生成快照复制给大量的从节点,那么对于性能的损失较大,这种场景也称为主从同步风暴,可以通过使用主 - 从 - 从架构的方式缓解。

三、哨兵架构

  哨兵架构是指,在主从架构上,使用哨兵集群去进行监控。普通的主从架构,主节点挂了,需要手动操作更换从节点为主节点,让其他从节点去复制。在哨兵架构下则可以自动恢复。哨兵去监听主节点和从节点,当主节点挂了,哨兵去重新选举主节点。
  客户端访问的是哨兵,但是哨兵可以监控到所有节点。哨兵会将主节点的信息推送给客户端,相当于客户端还是和主节点通信。

3.1、搭建哨兵架构

  哨兵架构的搭建:

  1. 复制一份redis目录下的sentinel.conf文件,并且修改配置

在这里插入图片描述
端口号,文件目录,pid等
在这里插入图片描述
设置有多少个sentinel认为master失效时,master才算真正失效,才能开启新的选举

  1. 哨兵也推荐集群部署(3台),可以复制上面的配置文件,对于端口号等信息进行对应的修改,然后启动哨兵:

在这里插入图片描述
目前的架构:

  • 6379:主节点
  • 6380:从节点1
  • 6381:从节点2
  • 26379:哨兵节点1
  • 26380:哨兵节点2
  • 26381:哨兵节点3

3.2、演示故障恢复

  案例工程:配置信息

server:port: 8080spring:redis:database: 0timeout: 3000sentinel:    #哨兵模式master: mymaster #主服务器所在集群名称nodes: 192.168.101.128:26379,192.168.101.128:26380,192.168.101.128:26381
#    cluster:
#      nodes: 192.168.101.128:8001,192.168.101.128:8002,192.168.101.128:8003,192.168.101.128:8004,192.168.101.128:8005,192.168.101.128:8006lettuce:pool:max-idle: 50min-idle: 10max-active: 100max-wait: 1000

  案例工程,访问/test_sentinel接口,每隔1s向redis中存入一条数据

@RestController
public class IndexController {private static final Logger logger = LoggerFactory.getLogger(IndexController.class);@Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 测试节点挂了哨兵重新选举新的master节点,客户端是否能动态感知到** @throws InterruptedException*/@RequestMapping("/test_sentinel")public void testSentinel() throws InterruptedException {int i = 1;while (true){try {stringRedisTemplate.opsForValue().set("test"+i, i+""); //jedis.set(key,value);System.out.println("设置key:"+ "test" + i);i++;Thread.sleep(1000);}catch (Exception e){logger.error("错误:", e);}}}}

  连接虚拟机上的redis,需要开放端口或者关闭防火墙,否则报图上的错误:
在这里插入图片描述
  启动程序,不断地向redis中塞值:
在这里插入图片描述

  将主节点的进程关闭:
在这里插入图片描述
  6379主节点断开连接
在这里插入图片描述
  观察哨兵重新选举:
在这里插入图片描述
  6381被设置成了新的主节点,可以通过info命令查询
在这里插入图片描述
  6380从节点的新主节点为6381:
在这里插入图片描述
  如果旧的主节点恢复运行了,会变成从节点

在这里插入图片描述

3.3、哨兵日志

  通过哨兵日志的部分信息,可以体现出监控集群重新选举的过程:

# 哨兵监控到主节点下线
44861:X 25 Jun 2025 21:52:18.410 # +sdown master mymaster 192.168.101.128 6379	
# 标记主节点为不可用,quorum 2/2表示至少有两个哨兵认定了主节点为不可用,可以下定论为主节点下线。
44861:X 25 Jun 2025 21:52:18.505 # +odown master mymaster 192.168.101.128 6379 #quorum 2/2
# 发起一次新的选举周期
44861:X 25 Jun 2025 21:52:18.506 # +new-epoch 1
# 启动故障转移,将会选举新的主节点。
44861:X 25 Jun 2025 21:52:18.506 # +try-failover master mymaster 192.168.101.128 6379
# 投票给67638d61e36685f6509df1622f17bb60041dbabb 节点
44861:X 25 Jun 2025 21:52:18.507 # +vote-for-leader 67638d61e36685f6509df1622f17bb60041dbabb 1
# 哨兵集群中的其他两个节点,都投票给67638d61e36685f6509df1622f17bb60041dbabb 节点
44861:X 25 Jun 2025 21:52:18.509 # cf6af8e65382739aa40cd0407e8a3d8f0e122d06 voted for 67638d61e36685f6509df1622f17bb60041dbabb 1
44861:X 25 Jun 2025 21:52:18.509 # 191cb89148e07d0e79a5ded4fcfe8320ae976b5a voted for 67638d61e36685f6509df1622f17bb60041dbabb 1
# 67638d61e36685f6509df1622f17bb60041dbabb 成为新的主节点,并获得领导者身份。
44861:X 25 Jun 2025 21:52:18.566 # +elected-leader master mymaster 192.168.101.128 6379
# 选择一个从节点作为主节点
44861:X 25 Jun 2025 21:52:18.566 # +failover-state-select-slave master mymaster 192.168.101.128 6379
# 选择从节点 192.168.101.128:6381 作为新的主节点。
44861:X 25 Jun 2025 21:52:18.659 # +selected-slave slave 192.168.101.128:6381 192.168.101.128 6381 @ mymaster 192.168.101.128 6379
# 新的主节点 192.168.101.128:6381 会停止同步原来的主节点,并准备成为独立的主节点。
44861:X 25 Jun 2025 21:52:18.659 * +failover-state-send-slaveof-noone slave 192.168.101.128:6381 192.168.101.128 6381 @ mymaster 192.168.101.128 6379
# 等待新的主节点完成晋升过程。
44861:X 25 Jun 2025 21:52:18.721 * +failover-state-wait-promotion slave 192.168.101.128:6381 192.168.101.128 6381 @ mymaster 192.168.101.128 6379
# 192.168.101.128:6381 成为新的主节点,完成晋升。
44861:X 25 Jun 2025 21:52:18.785 # +promoted-slave slave 192.168.101.128:6381 192.168.101.128 6381 @ mymaster 192.168.101.128 6379
# 将其他从节点重新配置,使其从新的主节点同步数据。
44861:X 25 Jun 2025 21:52:18.785 # +failover-state-reconf-slaves master mymaster 192.168.101.128 6379
# mymaster 恢复到正常状态,移除其不可用状态。
44861:X 25 Jun 2025 21:52:19.675 # -odown master mymaster 192.168.101.128 6379
#将 192.168.101.128:6380 配置为从新的主节点同步。
44861:X 25 Jun 2025 21:52:19.802 * +slave-reconf-inprog slave 192.168.101.128:6380 192.168.101.128 6380 @ mymaster 192.168.101.128 6379
# 192.168.101.128:6380 完成了重新配置,开始从新的主节点同步。
44861:X 25 Jun 2025 21:52:19.802 * +slave-reconf-done slave 192.168.101.128:6380 192.168.101.128 6380 @ mymaster 192.168.101.128 6379
# 故障转移过程完成,192.168.101.128:6381 成为新的主节点,集群恢复正常。
44861:X 25 Jun 2025 21:52:19.894 # +failover-end master mymaster 192.168.101.128 6379
# 原来的主节点 192.168.101.128:6379 被替换为新的主节点 192.168.101.128:6381。
44861:X 25 Jun 2025 21:52:19.894 # +switch-master mymaster 192.168.101.128 6379 192.168.101.128 6381
# 6380 6379 作为从节点,从6381进行同步
44861:X 25 Jun 2025 21:52:19.894 * +slave slave 192.168.101.128:6380 192.168.101.128 6380 @ mymaster 192.168.101.128 6381
44861:X 25 Jun 2025 21:52:19.894 * +slave slave 192.168.101.128:6379 192.168.101.128 6379 @ mymaster 192.168.101.128 6381

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86369.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86369.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86369.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习yolov5的安全帽实时识别检测系统

摘要:在现代工业和建筑行业中,确保员工的安全是至关重要的一环。安全帽作为一项基础的个人防护设备,对于降低头部受伤的风险发挥着关键作用。然而,确保工作人员在施工现场始终正确佩戴安全帽并非易事。传统的人工检查方法不仅效率…

GitLab 18.1 发布 Runner、无效的个人访问令牌查看等功能,可升级体验!

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…

量子计算与AI融合 - 企业级安全威胁应对

量子计算(QC)虽带来万亿级市场机遇(2025-2035年),但潜藏重大安全风险:可能破解现有加密系统,催生"现在窃取,未来解密"攻击。美国NIST已启动后量子加密标准,但技…

Excel:filter函数实现动态筛选的方法

filter的意思是“过滤、筛选”,动态筛选,FILTER()函数可以将对筛选区域内容,并将结果自动溢出生成一个新区域,以下是函数的使用方法: (一)情景:给定两列数据,我需要根据…

兰洋科技上合组织论坛发表专题分享,全球液冷布局引领绿色算力未来

2025年6月17-19日,中国—上海合作组织数字技术合作发展论坛在新疆克拉玛依市举办。作为第四次上海合作组织成员国信息通信技术发展部门负责人会议的配套会议,论坛以“数字化转型助力可持续发展,数字包容促进上合共同繁荣”为主题,…

LED-Merging: 无需训练的模型合并框架,兼顾LLM安全和性能!!

摘要:对预训练大型语言模型(LLMs)进行微调以适应特定任务,会带来巨大的计算和数据成本。虽然模型合并提供了一种无需训练的解决方案,用于整合多个特定任务的模型,但现有方法存在安全性与效用性之间的冲突&a…

火山引擎向量数据库 Milvus 版正式开放

资料来源:火山引擎-开发者社区 随着AI技术的不断演进发展,非结构化数据也迎来了爆发式的增长。Milvus作为一款为大规模向量相似度搜索和 AI 应用开发设计的开源向量数据库系统,目前已在业界占据领导地位。当前 Milvus 已经被 5,000 家企业所…

SQL SERVER存储过程

什么是存储过程 SQL 存储过程(Stored Procedure)是一个在数据库中预编译并存储的一组 SQL 语句。它们可以包含查询、插入、更新、删除等数据库操作,甚至包括控制流语句(如条件判断、循环等)。存储过程可以通过调用来执…

Lombok注解 - 提高Java开发效率

01 繁琐编码 初入 Java 开发领域时,编写实体类的琐碎经历想必各位都深有感触。 每当创建一个实体类,铺天盖地的 getter、setter、toString 方法接踵而至,手指在键盘上频繁敲击,酸痛不已。 而 Lombok 这一神器的出现&#xff0c…

Linux修改uboot启动延时方法详细攻略,触觉智能RK3568开发板演示

修改uboot延时 首先查找defconfig文件 ./build.sh uboot #通过编译日志查看使用的defconfig文件ls u-boot/configs/*3568* #在SDK根目录下执行该操作 如图标注处就是所使用的u-boot配置文件。 然后修改延时数: vim u-boot/configs/rk3568_defconfig 将CONFIG_BOO…

dockers virbox 安装

sudo apt remove docker docker-engine docker.io containerd runc 更新包索引并安装依赖 sudo apt update sudo apt install ca-certificates curl gnupg 添加Docker官方GPG密钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux…

Restormer: Efficient Transformer for High-Resolution Image Restoration 论文阅读

题目 (Title): Restormer:用于高分辨率图像恢复的高效Transformer 摘要 (Abstract): 由于卷积神经网络(CNN)在从大规模数据中学习可泛化的图像先验方面表现出色,这些模型已被广泛应用于图像恢复及相关任务。最近,另一…

音视频开发协议栈全景解析

音视频开发协议栈全景解析 引言:协议栈的重要性与演进 在当今数字化时代,音视频技术已成为互联网基础设施的核心组成部分。从视频会议、直播到智能安防、元宇宙应用,音视频协议栈的设计直接影响着用户体验质量(QoE)。作为开发者&#xff0c…

Java面试题025:一文深入了解数据库Redis(1)

欢迎大家关注我的JAVA面试题专栏,该专栏会持续更新,从原理角度覆盖Java知识体系的方方面面。 一文吃透JAVA知识体系(面试题)https://bl

Python:调用json.dumps处理datetime对象数据

文章目录 前言一、查询SQL语句中数据转换1、思路2、示例3、常用格式化模式4、注意事项 二、自定义JSONEncoder处理1、思路2、示例3、使用方法 写在结尾 前言 使用Python开发查询PostgreSQL数据库,返回数据中有timestamp类型数据字段。如果使用json.dumps转换成json对…

QT6 源(130)视图模型架构中的字符串列表模型 QStringListModel:成员函数,本类的继承关系图以及源码注释

(1)字符串列表型的 model ,可以交给视图 view 来显示,也可以由组合框 comboBox 读取其中的内容 : (2)以下开始学习本字符串 model 里的成员函数,本类没有再定义信号与槽函数 &#x…

dockerfile命令及构建+docker-compose安装构建

一,dockerfile常用命令 命令介绍FROM–指定基础镜像LABEL作者信息USER切换运行属主身份WORKDUR切换工作目录ENV用于docker容器设置环境变量RUN用来执行命令行的命令COPY把宿主机文件复制到镜像中去ADD将文件路径复制添加到容器内部路径EXPOSE为容器打开指定要监听的…

数学:逆元,同余

逆元,同余 0.引言1.同余1.1 同余的基本性质1.2 解同余线性方程 2.逆元费马小定理求逆元(m必需为质数)扩展欧几里得求逆元(使用任意互质的a和m) 0.引言 本文讲述什么是逆元,如何求逆元。求逆元的两种常规方法。然后知道…

广州华锐互动:技术与创意双驱动的 VR 先锋​

广州华锐互动能够在众多 VR 公司中崭露头角,离不开其强大的技术实力和源源不断的创意灵感 。在技术研发方面,广州华锐互动组建了一支专业的技术团队,团队成员均具备扎实的技术功底和丰富的行业经验,他们专注于 VR、AR、3D 等核心技…

教育培训教学通用PPT模版

教育培训通用PPT模版,儿童教育PPT模版,公开课件教学PPT模版,读书笔记PPT模版,古风PPT模版,教育教学通用PPT模版 教育培训教学通用PPT模版:https://pan.quark.cn/s/6c2ed020e398