深度干货 | 如何兼顾性能与可靠性?一文解析YashanDB主备高可用技术

2024【崖山论”见“】已强势回归!即日起,将不定期把 Meetup 中YashanDB 技术专家的精彩分享整理成文章,方便大家学习回顾。今天带来第一篇主备高可用技术文章。
作者介绍

背景

数据库高可用(High Availability,HA)是指在系统遇到故障或异常情况时,能够自动快速地恢复并保持服务可用性的能力。如果数据库只有一个实例,该实例所在的服务器一旦发生故障,那就很难在短时间内恢复服务。长时间的服务中断会造成很大的损失,因此数据库高可用一般通过多实例副本冗余实现,如果一个实例发生故障,则可以将业务转移到另一个实例,快速恢复服务。
常见的高可用架构有两种,一种是主备架构,另一个是多活架构。
在这里插入图片描述图1 两种常见的高可用架构
主备架构中,有一个实例是主库,其他实例是备库。主库发送日志给备库,备库通过回放日志来同步主库的数据,一旦主库发生故障,可以选择其中一个备库升主,接管业务。主备架构根据日志类型分两种,物理主备和逻辑主备。

  • 物理主备:传输物理日志,备库只读,不可执行写业务,比如Oracle Dataguard;
  • 逻辑主备:传输逻辑日志,备库可以执行写业务,比如MySQL。多活架构中,每个实例都可以执行读写业务,一个实例宕机后,业务可以转移到其他实例。

多活架构有基于共享存储的共享集群,比如Oracle RAC,也有基于逻辑日志的多活架构,比如MySQL的双主多活。
YashanDB目前支持物理主备和共享集群两种高可用方案,本文将聚焦于物理主备的高可用介绍。

主备高可用方案挑战

主备高可用方案的挑战通常有以下几点:

  • 性能开销:主备高可用方案会对主数据库的性能产生一定的开销,包括增加网络传输、归档IO等资源消耗等。在部署主备环境时,需要权衡可用性和性能之间的平衡,还需要考虑部署成本。
  • 同步延迟:主备数据库之间的数据同步存在一定的延迟,主要由于网络延迟和日志应用的处理时间所导致。延迟会影响备库只读性能,在主库发生故障时,备库中的数据也可能不是最新的。
  • 故障切换:在主备高可用环境中,当主库发生故障时,需要手动或自动进行故障切换,将备库切换为主库。故障切换过程中,需要尽量减少服务中断时间,还要确保数据的完整性和一致性。
  • 数据一致性:主备同步至少要保证最终一致性,如果备库需要支持只读,还要保证备库查询的瞬时一致性。

YashanDB主备针对上述挑战,做了深度优化,使得主备同步性能和自动切换能力达到极致。下面将介绍YashanDB高性能主备复制,以及自动故障转移的技术解析。

YashanDB高性能主备复制

01 整体架构
在这里插入图片描述
图2 YashanDB物理主备架构图

YashanDB的物理主备架构如上图所示,左边是主库的组件,右边是备库的组件。
各组件解释如下:

  • Log Cache:日志缓存。主库上Redo日志会首先写入日志缓存,备库收到Redo日志后也会写入日志缓存。
  • logFlush:日志刷盘线程。将日志缓存里的Redo日志持久化到磁盘。
  • logSend:日志发送线程。依次从日志缓存,Redo文件,归档日志里读取Redo日志,发送给备库。
  • logRecv:日志接收线程。接收来自主库的Redo日志,写入日志缓存。
  • archProc:归档线程。在Redo文件被复用前,将其拷贝为归档日志文件。
  • stbyRcy:备库日志回放线程。依次从日志缓存,Redo文件,归档日志里读取Redo日志,回放Redo日志,更新备库数据。
  • archSvr:归档发送线程。当备库请求归档日志时,主库将归档日志发送到对端。
  • archCli:归档接收线程。当备库出现归档GAP时,系那个主库发起请求,并接收来自主库的归档日志文件。

02 主备部署
YashanDB支持一主多备部署,最多可达32个备库。备库可以在线添加,并且一次可以并行添加多个备库。在并行创建备库的过程中,主库只从磁盘读取一次数据,然后将数据转发给多个备库。

YashanDB还支持级联备库,即备库可以从另一个备库接收Redo日志,无需和主库建立连接。级联备可以减少主库的压力,可用于异地容灾。YashanDB的每个备库可以连接多个级联备库。
在这里插入图片描述
图3 级联备库
03 保护模式
YashanDB主备对数据的保护是基于事务级别的。一个事务提交前,如果这个事务的日志已经在备库落盘,那么该事务就不会在主库故障后丢失。
为方便用户对数据的保护程度和可用性进行权衡配置,YashanDB提供3种不同的保护模式:

  • 最大性能:主机事务提交无需等待备机收到Redo,备机对主机性能影响最小。该模式下如果主机故障,备机升主后可能丢失数据
  • 最大保护:主机事务提交前,至少有一个备机将日志刷盘。这种模式能保证数据不丢失,但是对主机性能有影响,并且所有备机都断连后,主机事务将阻塞。
  • 最大可用:在正常情况下,最大可用和最大保护是一样的。如果所有备机断连,会降级为最大性能模式,不阻塞主机事务。

04 日志发送和接收
YashanDB在日志发送方面,做了很多优化,来提高日志发送的性能:

  • 优先从日志缓存读取Redo日志,不产生磁盘读IO。主备同步正常的情况下,待发送的Redo基本都在日志缓存里,因此不会对Redo磁盘产生IO争抢。只有当日志缓存里的Redo被淘汰时,才会从Redo文件或归档日志里读取Redo。

  • 日志批量发送,多条Redo一次发送,只回一次ACK(Acknowledgment)**。一段时间内产生的Redo日志批量发送,这一批Redo只需要一个ACK,这样可以减少网络交互次数,提高吞吐量。

  • 异步接收备库的ACK。每执行一次Redo日志发送,并不会等待这批日志的ACK,而是异步的接收备库的ACK,不阻塞下一次发送。

  • Redo缓存则发送,不等主库落盘。数据库产生的Redo优先写入日志缓存,然后进行本地刷盘,在本地刷盘的同时,日志发送即可进行,减少了一次等IO的时间。不过这种方式会带来一个问题,就是在主库发生故障后,备库的Redo可能比主库多,这就需要通过一些机制来判断备库的多余Redo,在后面的未决日志这一章节将介绍这个机制。

  • 备库在日志落盘前返回ACK。如果在备库落盘前返回ACK,则性能可进一步提升,但是在主备同时故障的情况下,可能有数据丢失的风险。该模式在大部分场景下能做到数据不丢失,同时性能更好,不过因为在极端场景下有丢失数据的风险,所以仅支持最大可用模式下使用。
    在这里插入图片描述

图4 日志发送与接收流程
05 归档GAP
备库停机一段时间后,会落后主库较多Redo文件。

YashanDB的备库重连后,直接从主库日志缓存接收最新Redo,其余未接收到的Redo,将通过归档日志拉取线程补齐,这部分归档称为归档GAP。

由于最新Redo是通过日志缓存发送的,所以不会产生额外的Redo磁盘IO,对主库性能影响较小,同时归档拉取线程逐个获取主库归档,可加速备库追赶主库。
在这里插入图片描述
图5 归档GAP修复流程

06 未决日志
在最大保护模式下,主库的Redo日志没有被备库接收前,这部分日志对应的事务提交将阻塞。如果此时主库宕机,备库升主,新主库不包含这部分日志,旧主库降备后,需要将这部分日志回退,这部分日志称为未决日志。

未决日志可能会回退,其对应的事务不可提交,相应的脏页不能刷盘(如果脏页刷盘后,日志被回退了,就会违反WAL原则)。

未决日志不能被备库回放,因为主库上可能没有提交对应的事务。

如果日志被主库和所有同步备持久化,则这部分日志不会被回退,这个日志点称为commit index。主库维护commit index识别未决日志,同时主库会将commit index同步给备库。
在这里插入图片描述
图6 未决日志场景1
上图场景中,主备处于最大保护模式,备库还没有收到主库的log 4和log 5这两条日志。虽然这两条Redo日志在主库落盘了,但是如果主库此时发生故障,备库升主,旧主库降备后,这两条日志将会被回退。
在这里插入图片描述
图7 未决日志场景2
上图场景中,主库的log 4这条日志已经写入主库的日志缓存,并且被发送到备库,但是主库还没有将log 4落盘。如果主库此时发生宕机重启,主库上不会包含log 4这条日志,备库上这条日志将会被回退。

07 并行回放
YashanDB的备库支持并行回放,来提高备库回放Redo的性能。

备库通过一个协调线程读取和分析Redo日志,然后将Redo按照会话ID哈希分配给后台回放线程,让这些后台线程并行回放Redo。
并行回放大大提高了回放速率,使得备库Redo不积累,备库查询延迟低,并且故障切换的RTO很低。

YashanDB的备库并行回放,复现了主库的session执行顺序,可以保证事务瞬时一致性,解决备库读一致性和回放性能难以兼顾的痛点问题。即使主库在高并发业务下,备库查询延迟也可以做到很低。
在这里插入图片描述
图8 备库并行回放

自动故障转移技术解析

当主库发生故障时,需要将某个备库切换为主库,并将业务转移到新的主库上。除了手动执行故障切换,YashanDB还支持自选主、仲裁切换两种方式的自动故障切换。

01 RAFT自动切换
YashanDB的自选主切换是基于Raft算法实现的。Raft是一种共识算法,能确保节点故障或网络分区下保持强一致性。

主备通过心跳检测对方是否存活,主库定期会给所有备库发送心跳,如果备库在超时时间内没有主库的心跳,那么备库就认为主库发生了故障。主库事务提交,要等待多数派节点将Redo落盘,除了主库节点,至少要有节点总数/2(下取整)个备库收到主库Redo 。主库故障,备库心跳超时后,会发起选举投票,如果收到多数派节点的投票,则升为新的主库。投票算法可保证,新主是多数派里Redo最多的,而事务提交要等待多数派落盘,因此新主库一定落盘了所有已提交事务的Redo,不会丢数据。

Raft的每次选举都会产生一个新的任期(term),在一个任期内,最多只有一个主库。
Raft将系统中的角色分为Leader、Follower和Candidate。工程上为了提高系统稳定性,加入了PreCandidate角色:

  • Leader:对应于主库,向Follower发送Redo日志;当日志同步到多数派节点上后,通知Follower更新commit
    index。
  • Follower:对应于稳态下的备库,接受并持久化Leader发送的日志,并回放commit index之前的日志。
  • Candidate:对应于选举中的备库,从PreCandidate到Leader的中间角色。
  • PreCandidate:对应于选举中的备库,从Follower到Candidate的中间角色。
    在这里插入图片描述
    图9 Raft节点状态转移图
    如上图所示,数据库启动后都是Follower角色,如果没有收到Leader的心跳,到达超时时间后,会发起预选举。预选举成功后,会增加自己的任期然后发起正式选举,正式选举成功后,就成为Leader,即从备库升为主库。在选举过程中,如果遇到任期比自己高的节点,或者发现当前任期的Leader,则会中断选举,回到Follower角色。

02 仲裁切换
Raft至少需要3个节点,不适合一主一备的自动切换,为此YashanDB提供了基于外部组件的一主一备仲裁切换功能。

yasom是YashanDB的轻量级的数据库管理进程,一般部署在非数据库服务器,可对主备状态进行监控。yasom和数据库之间有个yasagent进程进行代理通信,yasagent部署在数据库所在服务器。

yasom检测到主库异常后,在满足切换条件的情况下,给备库下发failover命令进行切换。切换条件为yasom和备库都感知不到主库,如果其中任一个能感知到主库,说明主库正常。
在这里插入图片描述
图10 OM仲裁切换场景
如上图3种情况,情况1表示主库所在服务器故障,yasom和备库都感知不到主库,可以切换。情况2表示主库进程故障宕机,yasom和备库都感知不到主库,可以切换。情况3表示yasom和主库所在服务器网络异常,但是主库和备库之间网络正常,此时不会切换。

零丢失模式
零丢失模式下,只有确定备库不丢失数据的情况下,才可以升主,牺牲一定的可用性,但是不会丢失数据。

  • 主备优先使用最大保护模式,保证数据全部同步到备库。
  • 当备库异常时,yasom将主库切换为最大可用模式,保证数据库可用,不阻塞业务。
  • 主库故障时,如果处于最大保护模式,则yasom进行自动切换。
  • 主库故障时,如果处于最大可用模式,则yasom不会切换,因为有数据丢失的风险,此时需要人工介入。

脑裂自动修复
非零丢失模式下,旧主库和新主库的数据可能不一致,旧主库降备后,与新主库发生脑裂。yasom发现备库脑裂后,将下发脑裂修复命令,修复备库不一致的数据,使主备复制恢复正常。

首先找到主备的日志分歧点,然后扫描备库Redo得到分歧点之后修改过的页面,将这些页面的ID发给主库,从主库获取对应页面并覆盖备库本地文件。再以分歧点lsn为基线,将主库上大于该lsn的数据页面发送到备库覆盖,最后将主库分歧点之后的Redo发送到备库,进行回放。回放完成后,主备将正常同步Redo,脑裂修复完成。
在这里插入图片描述
图11 脑裂修复流程

总结及未来规划

在客户实际运用数据库的过程中,性能与业务连续性无疑是最为重要的两大考量因素。尽管主备高可用方案在业界极为普遍,但在真实业务场景中仍面临多重挑战。我们在架构技术与编程实现等方面进行了深入的优化工作,以提升主备部署模式的同步性能及高可用保障。接下来,我们会继续丰富功能和性能,还将在以下几个方面继续打磨和增强:

  • 逻辑主备:主要用于逻辑复制,滚动升级,HTAP场景;
  • 条件故障切换:非网络故障,比如文件损坏,服务器资源异常时自动切换。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 Docker 自建一款怀旧游戏之 - 扫雷

1)扫雷 简介 扫雷 是一种经典的单人电脑游戏,最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中。游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块,而不触发地雷。每个方块上都标有数字,表示周围 8 个方块中…

LeetCode55:跳跃游戏

题目描述 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 解题思想 每次…

深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作

码到三十五 : 个人主页 OceanBase与MySQL模式下兼容性序 在当今的大数据时代,数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库,在与MySQL模式的兼容性方面展现出了显著的优势&#xff0c…

java语言开发的商城系统有哪些?

最近,有小伙伴问我有没有靠谱的java商城系统,经过我一顿扒拉,终于给大家整理出来了。 目前java语言开发的商城系统主要有shop、javashop、ejavashop、yuanfeng、mall4j、lilishop等。在没有深入了解这些系统前,我们可以从产品推出…

面包屑-文件夹

1.需求: 类似于 百度网盘、阿里云盘的 云文件夹管理功能 2.问题点 1.页面刷新 导致面包屑子级未持久化 2.浏览器的 前进、后退 ;面包屑未能 跳转到指定 子级 3.数据不同步问题 3.解决方法 1.后端提供 根据 id 查询面包屑 text 的 api【这里并没有…

【已解决】如何打开ZIP格式的压缩文件?

压缩文件格式的种类比较多,ZIP是最常见的压缩格式之一。那收到ZIP压缩文件,要如何打开呢?不清楚的小伙伴一起来看看吧! 方法一:使用系统自带的解压缩功能 很多电脑操作系统都内置了解压缩功能,并且支持大…

Matlab|含sop的33节点配电网优化

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序以IEEE33节点为例,分析含sop的配电网优化,包括sop有功约束、无功约束和容量约束,非线性部分通过转换为旋转锥约束进行编程,并且包括33节点配电网潮流及对应…

微信小程序个人中心、我的界面(示例四)

微信小程序个人中心、我的界面,九宫格简单布局(示例四) 微信小程序个人中心、我的界面,超简洁的九宫格界面布局,代码粘贴即用。更多微信小程序界面示例,请进入我的主页哦! 1、js代码 Page({…

《深入解析WIndows操作系统》第9章读书笔记

1、闪存类型:常见的闪存类型有NOR和NAND。NOR闪存在操作上最接近RAM,它的每个字节都可以被独立地寻址,而NAND闪存则被组织成以块为单位,就像磁盘一样。NOR类型的闪存用来设计保存计算机主板上的BIOS,而NAND类型的闪存被…

【哈希】Leetcode 217. 存在重复元素

题目讲解 217. 存在重复元素 算法讲解 使用set集合完成元素的存储,当我们将当前元素插入到集合单中,如果insert的返回值的pair.second等于false说明当前元素已经存在,反之元素在集合中存在 class Solution { public:bool containsDuplica…

【触摸案例-手势解锁案例-九宫格 Objective-C语言】

一、手势解锁案例,九宫格,我们先来分析一下怎么实现: 首先呢,我们先来运行一下, 这一块儿,上面的这九个东西,肯定是要有一个九宫格的一个算法的问题,然后呢,上边的这九个小圆圈儿,这是什么东西,Button,为什么是Button,因为可以点,是吗,就因为这个?实际上,你用…

UE5像素流部署以及多实例部署(兼容ue4)

像素流部署请看我之前的文章就行,今天讲的是多实例部署 在这里可以配置多实例的数量 如果设置800端口 设置两个实例 那么就是800 801端口 我的个人显卡是4060TI,最多开三个

kaggle之皮肤癌数据的深度学习测试

kaggle之皮肤癌数据的深度学习测试 近期一直在肝深度学习 很久之前,曾经上手搞过一段时间的深度学习,似乎是做轮胎花纹的识别,当初用的是TensorFlow,CPU版本的,但已经很长时间都没弄过了 现在因为各种原因&#xff…

【论文阅读】ELAN-Efficient Long-Range Attention Network for Image Super-resolution

ELAN-Efficient Long-Range Attention Network for Image Super-resolution 论文地址简介1 引言2相关工作2.1 基于 CNN 的 SR 方法2.2 基于 Transformer 的 SR 方法 3 方法论3.1 ELAN 的整体流程3.2 Efficient Long-range Attention Block (ELAB) 4实验4.1实验设置4.2 与轻量级…

Gray Zone Warfare灰区战争无法启动、登不上、加载失败解决办法

《灰区战争》是由捷克独立工作室开发、虚幻5引擎打造的开放世界FPS游戏,现已上线Steam页面,游戏将于2024年推出,暂不支持中文。当行动者 在对手做出反应之前迅速取得小规模胜利时,就出现了既成事实。例如:没收有争议的…

如何利用AI智能名片B2B2C商城系统将关键客户转化为数据驱动的会员

在数字化浪潮席卷全球的今天,数据无疑是企业发展的核心驱动力。然而,如何将这些无形的数字转化为企业实际增长的动力,却是许多企业面临的难题。特别是对于关键客户的管理,如何深入挖掘他们的价值,并转化为企业的忠实会…

【论文笔记】Training language models to follow instructions with human feedback A部分

Training language models to follow instructions with human feedback A 部分 回顾一下第一代 GPT-1 : 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式;模型架构是基于 Transformer 的叠加解码器(掩码自注意…

力扣:61. 旋转链表(Java,双指针)

目录 题目描述:输入:输出:代码描述: 题目描述: 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 输入: head [1,2,3,4,5], k 2 输出: [4,5,1,…

Java项目:基于SSM框架实现的视康眼镜网店销售管理系统眼镜商城(ssm+B/S架构+源码+数据库+毕业论文+PPT)

一、项目简介 本项目是一套基于SSM框架实现的视康眼镜网店销售管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简…

Android4.4真机移植过程笔记(三)

如果文章字体看得不是很清楚,大家可以下载pdf文档查看,文档已上传~oo~ 7、安装加密APK 需要修改文件如下: 相对Android4.2改动还是蛮大的,有些文件连路径都变了: //Android4.2 1、frameworks/native/libs…
最新文章