浅析 Redis 主从同步与故障转移原理

news2024/12/28 23:57:35

我们在生产中使用 Redis,如果只部署一个 Redis 实例,当该实例宕机,到恢复之前都不可用;虽说 Redis 一般都用来做缓存,但不可用给业务系统带来的影响也是不小的,流量大时甚至会导致整个服务宕机。所以 Redis 的高可用也非常重要,Redis 的高可用简单来说就是增加冗余副本,将一份数据保存在多个实例上;即使有一个实例宕机,其他服务仍然可以对外提供服务,不影响业务使用。

一. Redis 主从同步

Redis 提供了主从模式(一主多从)来提高 Redis 的可用性,主从库之间采用的是读写分离

  • 读操作:主从库都能接收

  • 写操作:主库能接收,执行完后同步给从库

主从同步原理

首次全量同步

主从第一次同步会经历三个步骤:

(1)主从库建立连接,二者连接完成后开始同步。

(2)首次同步需要全量数据,主库会 fork 出一个子进程来生成 RDB 快照,接着将 RDB 文件发送给从库(不会阻塞主线程),从库收到后清空旧数据,最后加载 RDB 文件完成全量数据同步。

(3)在主库生成 RDB 后接收的命令会暂存到一块内存区域:replication buffer,当从库加载完 RDB 快照后,再将这块暂存的数据发送给从库执行,最终完成首次主从同步。

为什么要单独维护全量同步阶段的增量数据呢?

  • 单独维护是为了保证命令执行的顺序性,这批增量数据需要等到 RDB 文件加载完后再发送给从库,否则会因为先后顺序不同导致主从不一致。

当完成首次同步后,主从之间维护一个长连接,后续写命令通过这个长连接进行同步。

长连接因为网络问题断开了期间的写命令会丢吗?

  • 当发生网络分区导致长连接断开,主库也会将写命令暂存到一块环形的内存区域,等待连接恢复后将暂存的写命令发送给从库,保证主从一致

做主从复制的作用是?

数据冗余:主从复制实现了数据的热备份;

高可用:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;

负载均衡:在主从的模式下,配合读写分离,可以大大提供 Redis 整体的吞吐量。

二. Redis 故障转移

主从模式能做到数据备份,也能支持读写分离,但一旦主节点宕机,需要人工介入切换主节点

Redis 提供了哨兵机制保证 Master 出现故障时自动进行主从切换,也就是故障转移

哨兵机制

哨兵节点的作用分为三点:监控,选主,通知;一般哨兵会集群部署,原因是为了保证哨兵的高可用防止下线误判下线误判在下面分析)。

哨兵实现故障转移原理

1. 哨兵监控

Sentinel 节点会监控 matser、slave 及其他 Sentinel 节点的状态。这个是通过 Redis 自身的 pub/sub 机制实现的。Redis 的哨兵一共有三个定时监控任务,来完成节点的发现与监控。

  • 监控主从拓扑信息:每隔 10 s,每个 Sentinel 节点会向主从库发送 info 命令,来获取最新的拓扑结构;

  • Sentinel 集群节点之间交换信息:每隔 2 s,每个 Sentinel 节点会向 _sentinel_:hello 频道上发送自身的信息,以及对主节点的判断信息。这样,Sentinel 节点之间就可以交换信息。

  • 节点状态监控:每隔 1 s,每个 Sentinel 节点会向 master、slave 及其他 Sentinel 节点发送 ping 命令做心跳检测(服务端回复 pong 代表节点正常),来判断这些节点是否可达

2. 主观下线

Sentinel 每隔 1 s 会对数据节点发送 ping 命令做心跳检测,当节点超过 down-after-milliseconds 没有进行回复,Sentinel 会对该节点做失败判定,这个行为被称作主观下线

主观下线,顾名思义是主观的,可能会误判,假设主观下线后就进行主从切换,实际主库并没有发生故障,后续的选主和通知操作会带来额外的开销

发生误判的场景:网络拥塞、节点发生短暂网络分区,或是节点压力较大响应超时。

3. 客观下线

为了防止下线误判,只有当大多数的哨兵节点认为 master 下线才算真正下线,这个行为叫做客观下线

客观下线过程:

(1) 当某个 Sentinel 节点发生判断主库“主观下线”后,会给其他哨兵实例发送 is-master-down-by-addr 命令,其他哨兵节点会根据自己和主库的连接情况,做出 Y(赞同)或 N(反对)的响应。

(2) 当哨兵获取到了“客观下线”所需的赞成票数后,就可以标记主库为“客观下线”,这个所需要的票数由 quorum 配置项决定(例如,现在有 5 个哨兵,quorum 为 2,当两个哨兵判断主服务器下线后则触发故障转移)。

4.Sentinel Leader 选举

当发生了客观下线后,哨兵节点集群就会选出一个 Leader 来进行实际的故障转移操作。Redis 使用 Raft 算法来实现哨兵领导者的选举,大致过程如下:

(1)哨兵节点设置主服务器为“客观下线”后,向其他哨兵节点发送命令,表明希望自己来执行主从切换,其他哨兵节点会进行投票。

(2)当哨兵节点拿到半数以上的赞成票且票数大于等于哨兵配置文件中的 quorum 值就会成为 Leader。

Leader 选举的投票逻辑很简单:在这一轮投票中,如果没有投过票就回复同意,如果投过票就回复拒绝。

(3)如果此过程没有选出 Leader 则会等待故障超时间的 2 倍时长,然后进入下一轮选举。

什么情况会选不出 Leader?

哨兵集群能够成功投票,很大程度上取决于正常的网络传输。如果网络压力大或短暂阻塞就可能导致没有哨兵节点拿到半数以上的票。而网络问题一般都会持续一小段时间,所以在没有选出 Leader 后会等待一段时间再进入下一轮。

5. 故障转移

选出哨兵的 Leader 后就会进行故障转移,也就是从 slave 中选出一个新 master 替换故障 master,主要有以下判断标准:

(1)跟 master 断开链接的时长:如果一个 slave 和 master 的断开链接时长已经超过 down-after-milliseconds 的 10 倍,那哨兵就会认为该 slave 不适合被选为 master。

(2)slave 的优先级配置:slave priority 参数越小,优先级越高。

(3)主从复制进度:当 优先级 相同时,哪个 slave 和 master 的数据越接近,优先级越高。

(4)run id:如果 优先级配置主从复制进度 都相同,则哪个 slave 的 run id 越小,优先级越高。

选出 master 后,对它执行 slaveof no one 命令让其成为主节点,并对剩余 slave 节点发送命令让他们成为新 master 的从节点,最后和其他哨兵节点交换信息完成故障转移

主从切换过程中,是否能对外正常提供读写服务?

如果采用读写分离,还是可以正常处理读请求,但是对于写请求,服务端就无法处理了。如果需要应对写请求,业务系统中可以将写缓存的操作改成异步或放到队列处理。

脑裂问题

如果碰巧客观下线也误判会发生什么?

会发生脑裂。

脑裂就是在主从集群中同时有两个主节点,他们都能接收写请求。而不同的客户端会往不同的主节点上写数据,甚至导致数据丢失。

Redis 的脑裂一般发生在主从切换时原主库假故障的场景下:

当主库因为一些原因无法处理哨兵节点的心跳检测时,就会被判定为“客观下线”,接着就会进行主从切换,但在主从切换完成之前,原主库又恢复服务,就又会处理写请求,当主从切换完成后通知客户端之前就会有两个主节点,即发生脑裂。

Redis 的脑裂可能会造成数据丢失,根本原因是 Redis 内部没有通过共识算法来维护多个数据节点的强一致性,因为强一致性的成本太大,而 Redis 主打性能,所以 Redis 放弃 C(一致性) 而选择 A(可用性)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.0.4:GrapeCity Documents for Excel GcExcel Crack

在更短的时间内生成 Excel 电子表格,不依赖于 Excel! 在任何应用程序中转换、计算、格式化和解析电子表格。 快速高效:其轻巧的尺寸意味着 Documents for Excel 针对快速处理大型 Excel 文档进行了优化 使用适用于 Windows、Linux 和 Mac 的…

Spring Cloud Sentinel实战(一)- Sentinel介绍

Sentinel介绍 什么是Sentinel 分布式系统的流量防卫兵:随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点,在流量控制、断路、负载保护等多个领域开展工作,保障服务可靠性。 特点: 1. 2…

【尚硅谷MySQL入门到高级-宋红康】数据库概述

1、为什么要使用数据库 数据的持久化 2、数据库与数据库管理系统 2.1 数据库的相关概念 2.2 数据库与数据库管理系统的关系 3、 MySQL介绍 MySQL从5.7版本直接跳跃发布了8.0版本 ,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&a…

c++提高篇——STL常用算法

STL常用算法一、常用遍历算法一、for_each 遍历容器二、transform 搬运容器到另一个容器中二、常用查找算法一、find二、find_if三、adjacent_find四、binary_search五、count六、count_if三、常用排序算法一、sort二、random_shuffle三、 merage四、reverse四、常用拷贝和替换…

推荐系统遇上深度学习(一四三)-[快手]一致性终身用户行为建模方法TWIN

标题:《TWIN: TWo-stage Interest Network for Lifelong User Behavior Modeling in CTR Prediction at Kuaishou》链接:https://arxiv.org/pdf/2302.02352.pdf今天给大家分享的是快手近期发表的终身行为序列建模上的工作,当前工业界主流的方…

一文打通计算机字符编码

有关编码的基础知识 1. 位 bit 最小的单元 字节 byte 机器语言的单位 1byte8bits 1KB1024byte 1MB1024KB 1GB1024MB 2.进制 二进制 binary 八进制 octal 十进制 decimal 十六进制 hex 3.字符 字符:是各种文字和符号的总称&#x…

Linux 自带的 LED 灯驱动实验

目录 一、配置内核 二、设备树节点编写 1、确定compatible 属性值 2、编写节点 三、验证 测试 其实 Linux 内核已经自带了 LED 灯驱动,要使用 Linux 内核自带的 LED 灯驱动首先得先配置 Linux 内核,使能自带的 LED 灯驱动。 一、配置内核 在Linux内…

【LeetCode】剑指 Offer(10)

目录 题目:剑指 Offer 27. 二叉树的镜像 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 28. 对称的二叉树 - 力扣&#xff0…

【人脸识别】FROM:提升遮挡状态下的人脸识别效果

论文题目:《End2End Occluded Face Recognition by Masking Corrupted Features》 论文地址:https://arxiv.org/pdf/2108.09468v3.pdf 代码地址:https://github.com/haibo-qiu/from 1.前言 人脸识别技术已经取得了显著的进展,主要…

几个开源 RUST 安全算法库

这段时间把 RUST 语法过了一遍,写一些简单的 Demo 程序没啥问题了,但离掌握这门语言还差的远,需要项目实战才行。我决定从之前研究过的国密算法入手,使用 RUST 实现国密算法。从头编写算法不太现实,上网搜了一下&#…

pandas数据分析36——快速独热和反独热处理

做数据预处理的时候,很多文本分类变量需要变为数值型。 下面提供一些方法,就以最经典的泰但尼克号数据集作为例子。 先导包读取数据 import numpy as np import pandas as pd datapd.read_csv(train.csv) datadata.drop(columns[Name,Ticket,Cabin],…

jmeter报错: java.io.EOFException: Unexpected end of ZLIB input stream

一、背景: 1.1 报错信息 java.io.EOFException: Unexpected end of ZLIB input stream at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240) at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158) at java.util.zip…

分割线-----

各位好,之前的文章就不再回复和更新了,都是大学的时候随便玩玩的。真的不能算学术研究。致敬过去的自己。努力真的可以幸福!虽然还是一样在搬砖!

Allegro如何快速锁定整板测试点操作指导

Allegro如何快速锁定整板测试点操作指导 在做PCB设计的时候,会需要给整板添加测试点,用于飞针测试,如下图 在测试点添加好之后,文件输出之前需要把测试点全部锁定,避免因为测试点模具开好,测试点被移动的情况出现 如果逐个锁定Via,容易遗漏 Allegro支持快速锁定整板测…

计算机网络高频知识点(一)

目录 一、http状态码 二、浏览器怎么数据缓存 三、强缓存与协商缓存 1、强缓存 2、协商缓存 四、简单请求与复杂请求 五、PUT 请求类型 六、GET请求类型 七、GET 和 POST 的区别 八、跨域 1、什么时候会跨域 2、解决方式 九、计算机网络的七层协议与五层协议分别指…

华纬科技冲刺A股上市:毛利率下降幅度较大,金雷为实控人

近日,华纬科技股份有限公司(下称“华纬科技”)递交招股书,准备在深圳证券交易所主板上市。本次冲刺上市,华纬科技计划募资4.34亿元,将用于新增年产8000万只各类高性能弹簧及表面处理技改项目、高精度新能源…

经验之谈——指标异常了怎么办?

本文参考了数据万花筒的文章,结合我自己工作经验。希望给大家一些帮助。 指标异常排查,是数据分析师的工作重点之一,是各行各业数据分析师都绕不开的话题。 本文试图回答: 1、指标波动的影响因素有哪些? 2、如何快速…

Verilog 数据类型和数组简介

在这篇文章将讨论 verilog 中最常用的数据类型,包括对数据表示,线网类型、变量类型,向量类型和数组的讨论。尽管 verilog 被认为是一种弱类型语言(loosely typed),但设计者仍必须在 Verilog 设计中为每个端…

处理器管理

处理器状态处理器管理是操作系统中重要组成部分,负责管理、调度和分配计算机系统的重要资源——处理器,并控制程序执行由于处理器管理是操作系统最核心的部分,无论是应用程序还是系统程序,最终都要在处理器上执行以实现其功能&…

5.OCR文本识别CRNN算法

文章目录1.基础介绍2.CRNN模型结构2.1 特征提取2.2 双向循环神经网络层2.3 转录层(Transcription Layers)参考资料欢迎访问个人网络日志🌹🌹知行空间🌹🌹 title: 2.OCR文本识别Convolution Recurrent Neural Network toc: true ca…