高性能和多级高可用,云原生数据库 GaiaDB 架构设计解析

1 云原生数据库和 GaiaDB

目前,云原生数据库已经被各行各业大规模投入到实际生产中,最终的目标都是「单机 + 分布式一体化」。但在演进路线上,当前主要有两个略有不同的路径。

一种是各大公有云厂商选择的优先保证上云兼容性的路线。它基于存算分离架构,对传统数据库进行改造,典型产品有 AWS Aurora、阿里云 PolarDB、腾讯云 TDSQL-C、百度智能云 GaiaDB。

数据库作为公有云上的核心基础设施,第一要务是实现用户上云的平滑性。目前像云网络、云主机,云盘都实现了完全透明兼容。云原生数据库也必须实现从语法、使用习惯、再到生态上的全面兼容。因此,基于现有生态做分布式化改造成为了一条首选的演进路线。使用存算分离路线的云原生数据库可以完美兼容传统的使用习惯,为交易类场景提供低延迟的写事务能力,同时读扩展性与存储扩展性借助了分布式存储的池化能力,也得到了很大增强。

另外一种路径是先搭建一套分布式框架,然后在其中填充数据库逻辑。OceanBase 和 TiDB 就是其中两个比较典型的产品。它们将事务的子系统和锁的子系统拆分为单独的模块。计算层通过与这些模块交互,可让多个节点均支持写请求。然后由统一的新事务 + 锁中心节点来进行仲裁。这样,对需要较多计算资源的写负载场景会有较好的提升。由于事务和锁都需要跨网络进行交互,因此事务延迟相对较高,在锁负载较重的情况下会成为一定的瓶颈。

目前这两个路线并不是泾渭分明,独立发展的,大家都在向着统一的目标演进。因此我们可以看到,存算分离路线在逐渐增强 SQL 的多级并行能力,同时也在探索和支持多个写节点的库表级/行级的多写能力。同时分布式事务路线也在积极探索在小数据规模下的单机部署架构。

所以在未来,这两个路线会不断融合。业务的数据规模不管多大,都可以平稳快速地运行在数据库系统上,而不需要用户去过分关注分区、索引、事务模型等信息。就像十年前如何在机器之间存储海量小文件还是一个后端研发工程师的必修课,而随着 S3 存储的出现,用户再也不需要考虑如何通过哈希等方式来保证单个文件夹不会保存太多文件一样。

GaiaDB 是从百度智能云多年数据库研发经验积累中逐渐迭代而来。GaiaDB 于 2020 年发布首个版本,首次实现了基于存算分离的大容量存储和快速弹性能力,解决了百度内部的历史库、归档库等大容量存储需求。

紧接着,为了满足集团内大部分核心业务的跨地域热活准入门槛和就近读性能需求,GaiaDB 于 2021 年发布了地域级热活功能。跨地域热活仍然使用存储层同步的方案,同步延迟与吞吐都相较逻辑同步有很大提升,从地域可以实现与主地域接近相同的同步能力,不会成为拖慢整体系统的短板,也不会像逻辑同步那样在大事务等场景下出现延迟飙升的问题。

所以 2.0 版本上线后,GaiaDB 逐渐接入了手百、贴吧、文库等多个核心产品线,解决了业务在跨地域场景下的延迟与性能痛点。

随着业务的逐渐上云,多可用区高可用的需求慢慢凸显,如何实现单机房故障不影响服务成为了很多业务上云的关注点。为此GaiaDB 打造了可支持跨可用区热活的 3.0 版本,每个可用区都可以实时提供服务并且不增加额外的存储成本。而在今年, GaiaDB 推出了更加智能化的 4.0 架构,性能进一步提升,功能完整度也在持续完成覆盖。

接下来整体介绍一下 GaiaDB。目前 GaiaDB 已经实现了线上全行业场景覆盖,最大实例达到了数百 TB,不仅兼容开源生态,还实现了 RPO=0 的高可靠能力。在成本方面,由于在架构设计上采用了融合的技术理念,GaiaDB 不依赖特殊硬件和网络环境也可以保证性能,实现云上云下一套架构。

2 GaiaDB 的高性能&多级高可用设计

接下来我来分享一下 GaiaDB 的性能核心设计理念——通过融合和裁剪,将数据库和分布式存储进行深度融合,为全链路的同步转异步化提供条件,从而实现极致的性能与通用性。

我们可以看到,如果数据库简单使用通用分布式协议和单机存储引擎,如左图所示,那么数据库需要处理主从同步,需要有 CrashSafe 所需要的物理日志。同时,一致性协议也要有主从同步,要写自己的 WAL 以及持久化快照。而单机引擎同样需要 CrashSafe 以及一套日志系统和数据存储逻辑。

我们发现,多层日志的嵌套带来了层层延迟与写放大。更复杂的是,数据流中嵌套多层逻辑后,也给系统整体数据安全带来了一定挑战。同时由于多层之间需要串行等待,所以在加入了网络延迟后会给数据库带来很大的性能下降。虽然可以使用定制化硬件与网络来缩短网络和磁盘落盘的延迟以降低链路耗时,但这又引入了新的不确定性并导致了更高的成本。

GaiaDB 的解决思路是将事务和主从同步逻辑、日志逻辑、快照和存储持久化逻辑重新组合和排布。

首先是将分布式协议的主从同步逻辑融合进数据库计算节点中。由于计算层本身就需要处理主从同步、事务和一致性问题,相关的工作量增加并不大。这样一来,最直接的收益就是将两跳网络和 I/O 精简为一跳,直接降低了链路延迟。

其次 GaiaDB 将多层增量日志统一改为使用数据库 Redo 物理日志,由 LogService 日志服务统一负责其可用性与可靠性。

除此之外,GaiaDB 也将持久化、快照和数据库回放功能融合入存储节点。由于存储层支持了数据库回放能力,可以很轻松实现数据页级别的 MVCC。这样全链路只剩下了数据库语义,数据流简单可靠,逻辑大大简化。

下面我们一起来看下共识模型上的改变。

像 Raft 协议是需要两跳网络才能实现一次提交确认的,右上角就是 Raft 的数据流架构:CN 节点将写发送给 Leader 后,需要等待 Leader 发送给 Follower 并至少收到一个返回后才能成功。

这里就带来了两跳网络和 I/O 的同步等待问题。而 GaiaDB 则是计算节点直接发送给多个 Log 服务并等待多数派返回,这样不依赖任何特殊硬件与网络就降低了延迟。这样系统里不管是事务的一致性还是多副本一致性,统一由计算节点统筹维护,所有的增量日志也统一为数据库物理日志,整体数据流简单可控。

对于数据风险最高的 Crash Recovery 场景,由于统一使用了数据库语义,整体流程更加健壮,数据可靠性更高,降低了数据在多种日志逻辑之间转换和同步带来的复杂度风险。而在性能方面,由于存储层自身具备回放能力,可以充分利用 LogService 层的日志缓存能力。对于写操作来说,不需要每次更改都刷盘,可以批次回放刷盘,大大节省了磁盘吞吐与 I/O。

经过以上改造,线上吞吐性能可以提升 40% 。同时由于链路简化,也大大优化了长尾延迟。像之前计算节点与分布式主节点之间发生网络抖动的场景,就会被多数派的返回特性来优化。

分享完一致性协议层优化,接下来我们来探讨一下链路层优化。

我们知道,总吞吐与并发度成正比,与延迟成反比。一致性协议层改造并缩短了数据链路,可以通过降低延迟来增加吞吐。那么有没有办法通过提升数据流的并发度来提升吞吐呢?答案是可以。由于数据库的物理日志自带版本号与数据长度,所以不需要像通用存储一样实现块级别串行提交。之所以使用通用存储需要串行提交,是因为存储端只能根据请求到达的先后确定数据版本,如果乱序到达,最后生效的版本是不可知的。

而对于 GaiaDB 来说,由于 LogService 具备数据库语义的识别功能,所以计算节点只需要异步进行写入,日志服务就会自动根据数据版本选取最新数据,然后根据写入情况批量返回成功,这样链路就可以实现延迟与吞吐的解耦。

当然计算层依然会等待日志层批量返回的最新落盘版本后再返回事务提交成功,所以依然可以满足提交成功的事务一致性、持久化的要求。

另外针对高负载下 I/O 请求与数据库业务请求争抢 CPU 的问题,我们使用了 I/O 线程隔离技术,通过资源隔离的方式,将 I/O 线程与数据库业务线程进行隔离。这样即使在复杂负载场景下,I/O 延迟仍可以保持在较低水平。

在分析完前面两部分之后,可能会有同学有疑问:既然日志层到存储层不是同步写,是不是最终系统的一致性降低了?有没有可能发生数据丢失或不一致的问题呢?答案是不会。因为 GaiaDB 的存储是一套支持 MVCC 的多版本系统。所以即使回放实现上是异步,但是由于请求方会提供所需要的数据版本,存储层可以提供对应版本的强一致数据视图。

GaiaDB 的存储节点支持数据页的回放功能,可以动态回放至任意目标版本后再返回,在之前的版本里,假如由于异步的因素还没有获取到这部分增量日志,存储节点也会启用优先拉取的策略实时拉取一次日志后再回放,以此来提供较好的时效性。而在最新的 GaiaDB 版本中,我们也在计算层添加了同样的回放能力,存储节点尽力回放后仍不满足需求的,由计算节点进行剩余任务。

这样对于存储慢节点的兼容能力就大大增强了,同时由于存储节点会尽力回放,所以也可以最大化利用存储层的算力资源。对于刷脏逻辑目前也完全下沉到了存储层,存储节点可以自主控制刷盘策略和时机,尽量合并多次写后再进行落盘,大大节省了磁盘 I/O 负载,平均 I/O 延迟降低了 50%。

下图中我们可以看到,在综合了多项优化后,读写性能实现了最高 89% 的提升,其中写链路线路提升尤其明显。这些都是在使用普通存储介质和网络环境的情况下测试得出的,主要得益于数据链路的缩短与同步转异步的自适应高吞吐能力。

在讨论完性能后,再分享一下 GaiaDB 在高可用方面的思考和设计理念。

数据库作为底层数据存储环节,其可用性与可靠性直接影响系统整体。而线上情况是复杂多变的,机房里时时刻刻都可能有异常情况发生,小到单路电源故障,大到机房级网络异常,无时无刻不在给数据造成可用性隐患。

作为商业数据库,具备多级高可用能力是最核心的必备能力。这样才能抵御不同级别的异常情况,有力保障客户业务的平稳运行。GaiaDB 支持多副本、跨可用区、跨地域三级别高可用,创新性地实现了多可用区热活高可用、单个实例支持跨可用区部署。在不增加成本的情况下,每个可用区均可提供在线服务,任何可用区故障都不会打破存储一致性。下面我们来分别看一下每个级别高可用能力的实现。

首先是实例的多副本高可用能力。

GaiaDB 对整体的分布式架构进行了重新设计,系统共分为三层,即计算层、日志层、存储层。

其中计算层本身无状态,仅负责事务处理与一致性维护,所以获得了很强的弹性能力,实现了秒级切换、多节点容灾,同时扩缩容只需要内存启动即可。

日志层负责系统增量日志部分的持久化,实现了多数派高可用。同时由于一致性协调角色上移到了计算层,所以该层全对称,任意节点故障不需要进行等待选主,也不会有重新选主带来的风暴和业务中断问题。

再往下是存储层,负责数据页本身持久化与更新。由于上层保留了增量日志,所以存储层可以容忍 n-1 副本故障。简单来说就是只要有一个副本完好,加上上层提供的增量日志,即可回放出所有版本的完整数据,实现了相比传统多数派协议更高的可靠性能力。

其次是跨可用区与跨地域的高可用能力。

GaiaDB 的多级高可用都是基于存储层物理日志的直接复制。相比逻辑复制,数据链路大大缩短,同步延迟也不再受上层大事务或者 DDL 等操作影响,在主从同步延迟上具有很大优势。

对于跨可用区高可用来说,由于 GaiaDB 具有对称部署架构,所以可以很方便地进行跨可用区部署。这样可以在不增加存储成本的情况下实现多可用区热活,任一可用区故障都不影响数据可靠性。

写数据流可以自适应只跨一跳最短的机房间网络,不需要担心分布式主节点不在同机房带来的两跳跨机房网络和跨远端机房问题,而读依然是就近读取,提供与单机房部署接近的延迟体验。由于跨机房传输的网络环境更为复杂,GaiaDB 添加了数据流的链式自校验机制,使数据错误可以主动被发现,保障了复杂网络环境下的数据可靠性。

对于跨地域高可用来说,由于同样使用了异步并行加速的物理同步,及时在长距离传输上,吞吐依然可以追齐主集群,不会成为吞吐瓶颈,在计入网络延迟的情况下,国内可以实现数十毫秒的同步延迟,这是因为跨地域同样可以使用异步并行写加速,自动适应延迟和吞吐之间的关系。同时地域之间还可以实现主动快速切换和默认就近读取。

所以在使用了 GaiaDB 的情况下,业务可以不做复杂的数据同步逻辑就可以实现低成本的跨可用区与跨地域高可用。

介绍完高性能和高可用两部分的设计理念后,接下来再介绍一下我们正在内部灰度中的新功能:

  • 并行查询:并行查询从并发度上进行加速的并行查询能力,这对大数据规模下的多行查询有非常好的加速作用,可以充分利用计算节点的 CPU 和内存资源和分布式存储层的并行 I/O 能力。
  • 分析型从库(HTAP):分析型从库具备多种行列加速能力,既有支持百 TB 级别数据计算的分析型节点解决方案,也有支持百万行以上检索加速的列式索引引擎。其中列式索引引擎同样采用物理日志同步,不需要业务维护数据一致性,可以和当前交易类负载的事务隔离级别兼容。
  • Serverless:我们也在探索充分利用内部潮汐算力的资源优化调度方案,在白天业务高峰期,将资源向实时性更强的交易类业务倾斜,在低峰期自动缩容,将资源复用投入到离线计算类业务中,不但客户节省了运维成本与资源成本,也避免了资源闲置和浪费,实现了更高的资源利用率。

以上功能预计都会在近期开放灰度试用。

以上是今天分享的全部内容。

欢迎大家了解数据库产品

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

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

相关文章

二叉树的非递归遍历(详解)

二叉树非递归遍历原理 使用先序遍历的方式完成该二叉树的非递归遍历 通过添加现有项目的方式将原来编写好的栈文件导入项目中 目前项目存在三个文件一个头文件,两个cpp文件: 项目头文件的代码截图:QueueStorage.h 项目头文件的代码&#xff…

鸿蒙原生应用开发【分布式数据对象】

01、什么是分布式数据对象 在可信组网环境下,多个相互组网认证的设备将各自创建的对象加入同一个 sessionId,使得加入的多个数据对象之间可以同步数据,也就是说,当某一数据对象属性发生变更时,其他数据对象会检测到这…

Redis 命令全解析之 Hash类型

文章目录 ⛄介绍⛄命令⛄RedisTemplate API⛄应用场景 ⛄介绍 Hash类型,也叫散列,其value是一个无序字典,类似于Java中的 HashMap 结构。 String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便&#xf…

Navicat 技术指引 | 适用于 GaussDB 分布式的自动运行功能

Navicat Premium(16.3.3 Windows 版或以上)正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结…

Nginx按指定格式记录访问日志

今天突然想起来一个日志的一个东西,因为拉项目无意中看到了日志文件的一些东西,现在不经常做后端了,加上其他的一些原因吧.有时候有些问题也没想太多,马马虎虎就过了,后来想想还是要记录一下这方面的处理过程吧: 一般我们作为开发人员关注的日志只是在应用程序层面的,我们称它…

51 单片机定时器

51 单片机定时器 目录 51 单片机定时器定时器作用定时器的工作模式模式1(常用)定时器时钟源中断系统定时器寄存器 补充实际使用 声明:本文以 STC89C52 单片机为例 定时器作用 主要有三个作用 1、用于计时系统,可实现软件计时,使程序每隔一段…

java:slf4j、log4j、log4j2、logback日志框架的区别与示例

文章目录 背景SLF4J - 简单日志门面:Log4j - 强大而古老的日志框架:Log4j2 - Log4j的升级版:Logback - Log4j的继任者:比较Springboot集成slf4j、log4j2参考 背景 在Java开发中,日志记录是一个不可或缺的组成部分。为了满足不同的需求,Java社区涌现出多…

Python---继承

1、什么是继承 我们接下来来聊聊Python代码中的“继承”:类是用来描述现实世界中同一组事务的共有特性的抽象模型,但是类也有上下级和范围之分,比如:生物 > 动物 > 哺乳动物 > 灵长型动物 > 人类 > 黄种人 从哲学…

Navicat 技术指引 | 适用于 GaussDB 分布式的模型功能

Navicat Premium(16.3.3 Windows 版或以上)正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结…

UG NX二次开发(C#)-求曲线在某一点处的法矢和切矢

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX中创建一个曲线3、直接放代码4、测试案例1、前言 最近确实有点忙了,好久没更新博客了。今天恰好有时间,就更新下,还请家人们见谅。 今天我们讲一下如何获取一条曲线上某一条曲…

9大高效的前端测试工具与框架!

在每个Web应用程序中,作为用户直接可见的应用程序外观,“前端”包括:图形化的用户界面、相应的功能、及其整体站点的可用性。我们可以毫不夸张地说:如果前端无法正常工作,您将无法“拉新”网站的潜在用户。这也正是我们…

VUE+webrtc-streamer 实现实时视频播放(监控设备-rtsp)

效果 下图则启动成功,此时在浏览器访问127.0.0.1:8000可以看到本机监控画面 1、下载webrtc-streamer 地址:https://github.com/mpromonet/webrtc-streamer/releases 2、解压下载包 3、双击webrtc-streamer.exe启动服务 4、将下载包html文件夹下webrt…

MySQL数据库sql语句操作

一、数据库模型 关系型数据库是一种以表格形式组织和存储数据的数据库。它使用关系模型,其中数据被组织为多个表格,每个表格包含了多个行和列。每个表格的列描述了数据的属性,而行包含了实际的数据记录。 非关系型数据库,也称为…

【ChatGLM3】第三代大语言模型多GPU部署指南

关于ChatGLM3 ChatGLM3是智谱AI与清华大学KEG实验室联合发布的新一代对话预训练模型。在第二代ChatGLM的基础之上, 更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、…

HttpComponents: 领域对象的设计

1. HTTP协议 1.1 HTTP请求 HTTP请求由请求头、请求体两部分组成,请求头又分为请求行(request line)和普通的请求头组成。通过浏览器的开发者工具,我们能查看请求和响应的详情。 下面是一个HTTP请求发送的完整内容。 POST https://track.abc.com/v4/tr…

JFlash烧写单片机bin/hex文件

1,安装压 JLink_Windows_V660c,官网可下载; 2,打开刚刚安装的 J-Flash V6.60c 选择创建新工程“Create a new project”,然后点击StartJ-Flash 点击之后跳出Select device框,选择TI 选择TI后&#xff0c…

SpringBoot 项目将jar 部署在服务器引用外部 配置文件

SpringBoot 官方给出了四种方式引用外部配置文件的方式 在jar包的同一目录下建一个config文件夹,然后把配置文件放到这个文件夹下(最常用)直接把配置文件放到jar包的同级目录在classpath下建一个config文件夹,然后把配置文件放进去在classpath下直接放配…

git操作:使用vscode集成

git操作方式 其实git操作一般有三种方式 分别是终端命令行,开发工具集成,专业的git可视化工具 我前面几章说的都是git的命令行操作,今天这篇文章主要是针对开发工具vscode集成git操作进行演示 说明一下,这里之所以选择vscode,是因为本人用的就是vscode,每个开发工具基本都有…

JAVA实现敏感词高亮或打码过滤:sensitive-word

练手项目中实现发表文章时检测文章是否带有敏感词,以及对所有敏感词的一键过滤功能 文章目录 效果预览实现步骤 效果预览 随便复制一篇内容到输入框 机器审核文章存在敏感词,弹消息提示并进入人工审核阶段(若机器审核通过,则无需审…

MATLAB基础运算

矩阵和数字相乘 就是矩阵里面每个元素跟这个数字乘一遍 矩阵和矩阵相乘 能不能相乘,需要前面矩阵的列数等于后面矩阵的行数,出来的矩阵大小是前面矩阵的行数*后面矩阵的列数。 所以大家会发现,矩阵相乘如果前后调转了,结果会完全…