云原生数据库GaiaDB的核心技术演进

导读

越来越强调云原生的环境下,存算分离作为一种新的架构理念,已经是大势所趋。新的技术架构带来新的问题和挑战,GaiaDB 在自研过程中采用Quorum分布式协议、高性能网络、高可靠分布式存储引擎等技术实现更高的性能和可用性。

本文针对一系列的技术应用实践帮助大家更好的理解存算分离数据库架构的挑战和解决方案。

随着越来越多的企业将业务搬迁至云端,网络、计算和存储资源的弹性伸缩能力变得越来越重要。这些资源的弹性伸缩能力不仅可以帮助云上业务轻松应对业务尖峰,还可以大大降低资源闲置浪费,使得每一分资源都得到充分利用。作为核心基础设施之一,数据库在极致弹性和扩展性方面也进行了多种探索,例如数据的水平分片和分布式化改造。这些方法通过舍弃一部分通用性来增强扩展能力,在配合业务轻度改造的情况下,实现了很显著的体验提升。

然而,作为云上的基础设施,保证用户在迁移前后的业务一致性和可靠性是首要任务。因此,舍弃某些功能或兼容性的路线是无法被接受的。为了解决这个问题,云原生数据库GaiaDB应运而生。在保证对原有生态完全兼容的前提下,GaiaDB使用存算分离技术以及多种内核深度定制优化方案,实现了最大PB级数据存储能力与秒级弹性扩缩容能力,使云上业务可以实现全栈弹性伸缩。

GaiaDB的存算分离架构采用Quorum分布式协议、动态实时MVCC技术以及用户态高性能网络等技术,这些技术手段的应用对降低访问延迟和提高读写性能有很好的优化效果。此外,该架构不依赖于任何定制化硬件和基础设施,具有较强的通用性和经济性。下面分别介绍一下GaiaDB的技术应用实践。

引入分布式协议(DB-Quorum)

GaiaDB 基于" Log is database"的设计理念,即数据的修改只写日志,无需刷新脏页,这极大的降低写放大,简化系统 IO。GaiaDB 针对 IO 技术栈进行了充分的优化,从演化路径上看,经历了以下几个阶段:

  1. 分布式文件系统 IO:GaiaDB初期存储使用通用的分布式文件系统作为存储底座存储 innodb redo log 和 innodb page。由于分布式文件系统要实现通用的文件一致性语义,其IO提交和IO收割都存在较多的队列调度和保序逻辑,因此其单线程的异步读写吞吐和延迟都离本地盘有较大差距。

  2. 分布式raft IO:这个阶段,GaiaDB使用raft三副本进行redo 日志的持久化,数据页的存储直接使用peer三副本持久化到本地文件系统上。日志服务使用raft IO后,事务写吞吐有了明显提升;但是延时上依然相比本地磁盘性能有较大的gap,特别是长尾问题比较突出。

  3. DB-Quorum IO:随着时延敏感业务的增多,对IO的时延的要求进一步提升,GaiaDB舍弃raft 协议,采用quorum读写方案,对IO栈进行极致的性能优化。

下面是从Quorum IO替换 raft IO的主要考量:

单次Redo Raft IO 网络和磁盘过高,一次redo写IO包含以下流程

a) 主库写raft leader;

b) raft leader发送raft 日志;

c) raft日志同步到多数派;

d) raft日志apply,数据持久化到Log Store ;

e) 回复主库。

可以发现其中至少两次网络往返,且无法并行。b) d) 为磁盘写且无法并行。并且由于 RPC 和 Raft 的开销,导致 Redo 持久化的时延显著高于传统单机Mysql的本地Redo落盘时延。

通过深入分析,我们认为:Raft协议作为类paxos的分布式协议变种,除了保证分布式副本一致性外,其主要时延其实是提供线性一致性语义的额外代价,而在GaiaDB中,我们其实已经把线性一致性的约束拆解到了存储层和事务层:

  1. 存储层,我们已经保证如果 lsn = l 的日志已经持久化成功,那么所有 lsn < l 的日志都已经写成功。

  2. 事务层,我们记录当前完成IO 收割的最大lsn,这个lsn 之前的写事务都能安全提交。

基于以上两点,quorum读写模式已经能较好的满足我们的Redo IO的需求。

  • quorum协议在数据库中需要解决以下问题:

  1. 成员变更:在quorum中管理成员实现较为复杂,gaiadb 相对优雅的结合了raft和quorum的优点,raft管理成员变更等控制流,quorum管理数据流。

  2. crash safe: 当计算节点宕机时,quorum需要有一个数据对齐的过程,gaiadb使用两阶段数据对齐协议,prepare阶段协商数据持久化一致性位点,commit阶段进行数据补偿。

  • GaiaDB在分布式quorum协议中的优化

为了进一步降低远程IO对性能的影响,GaiaDB对IO流进行了改造,将核心链路上的同步IO改造为异步IO,极大了提升了事务吞吐。

高性能智能网络(DB-Network)

在存算分离架构下,网络作为系统IO的重要组成部分,其性能和效率直接影响到整个系统的性能表现。存算分离架构将存储和计算资源分开,使得数据可以在独立的存储节点上进行读写操作,而计算节点则专注于处理计算任务。这种架构的优势在于可以提高系统的扩展性和可靠性,但也增加了网络IO的复杂性和耗时。

在传统的本地IO模式下,数据的读写操作是在本地进行的,因此不需要经过网络传输。而在存算分离架构下,数据的读写操作需要在不同的节点之间进行传输和处理,因此网络IO成为了系统IO中不可或缺的一部分。由于网络传输的耗时相比本地IO要长,因此降低网络IO的耗时成为了存算分离架构必需关注的重点任务之一。

挑战

GaiaDB采用了BRPC网络框架进行场内通信,但在真实业务场景下,平均耗时为微秒级别(400us-500us左右),长尾甚至达到了毫秒级别(10ms+)。这种情况在某些范围内检索的SQL查询中尤为严重,因为这些查询需要远程访问大量的数据,从而导致IO长尾成倍放大SQL的整体耗时,容易引发系统故障。

为了保障GaiaDB大规模稳定上量,缩短远程IO的长尾和平均时延是至关重要的。通常情况优化远程IO有一下两种手段:

  1. 网络优化:采用更快速的网络设备、优化网络路径、减少网络跳数等措施可以降低网络延迟。

  2. IO优化:通过优化数据存储和访问模式,减少IO访问延迟。比如采用更高效的存储介质、缓存技术、并行访问等技术。

解决方案

GaiaDB网络优化分为两个部分:

  1. 采用网络超时重定向机制,降低单点访问延迟长尾问题

采取了BackupRequest机制,即当一个远程IO请求超时时,系统会重试其他副本,从而有效地抑制了单节点长尾问题。这种机制的应用将远程IO的平均时延由原来的10ms降低到了5ms以内。通过优化网络架构和采用适当的备份机制,BackupRequest不仅提高了数据的可用性和可靠性,也大大降低了IO延迟,提高了数据库的整体性能。

  1. 采用高性能智能网络,减少内核态TCP与用户态TCP的数据拷贝

GaiaDB引入了百度内部研发的智能网络。智能网络是一种高性能网络框架,它支持内核态TCP和用户态TCP、RDMA以及百度内部私有协议等多种协议。智能网络能够根据硬件设备的性能和网络状态,自动选择最优的网络协议和参数,从而最大程度地减少网络传输延迟。

智能网络的引入对于降低远程IO的平均时延起到了非常重要的作用。通过智能网络的选择和优化,GaiaDB能够更好地适应不同的硬件环境,并自动选择最佳的网络协议和参数,进一步提高了数据库的性能和响应速度(E2E 延迟缩短60%,达到百us)。

高可靠、高性能分布式存储引擎

存算分离架构是一种现代化的数据库架构设计方式,它的核心思想是将存储和计算分离,以提高系统的可用性、可扩展性和性能。在存算分离架构中,所有需要持久化的数据都被存储在远端的网络附加存储(NAS)、对象存储或分布式文件系统中,或者其他具备高可用能力的分布式存储系统中。而本地存储则只被用来存储临时的、暂态数据,这些数据在需要的时候可以从持久化存储中恢复和重建。

在GaiaDB中,"存"所采取的是自研分布式存储系统。该系统结合了GaiaDB的数据模型,提供了多版本高可靠高性能的数据存储能力。GaiaDB的存储系统采用了独特的3副本对等模型,这种模型与传统的Raft模型不同。在3副本对等模型中,每个节点都有相同的数据副本,这样可以提高数据的可靠性和可用性。由于没有主从节点的概念,每个节点都可以独立地提供读写服务,从而避免了单点故障的问题。此外,由于对等性,每个节点都可以同时提供IO服务,从而提高了系统的整体性能。

挑战

存算分离架构为GaiaDB带来了新的挑战。在早期阶段,GaiaDB使用容器模型来存储单副本,并将三个副本部署在不同的容器节点上。然而,由于实测时多跳网络等因素的影响,IO性能无法满足要求。为了解决这个问题,GaiaDB采用了容器+本地磁盘架构模型,虽然满足了IO时延需求,但也带来了新的问题。

  1. 成本问题逐渐显现。在存算分离架构下,需要处理突发流量但又无法共享资源,这容易导致资源浪费和成本上升。例如,每个容器节点分配了4G内存作为数据库的一个副本,这无疑增加了系统的整体成本。

  2. 管理问题也是个大问题。当处理的实例数量达到成千上万级别时,容器调度和资源分配等难度上升,实例扩容等耗时也变得更长。例如,每个节点上的端口数量、监控数量以及副本容灾分布规划等都需要大量的人力和物力来管理。

  3. 故障问题也是一个不可忽视的问题。在存算分离架构下,当磁盘或机器出现故障时,数据恢复存在调度管理问题。例如,恢复限速、排队等缺乏全局管理能力,容易造成热点,导致无法提供服务。

解决方案

为了解决在容器化环境中面临的存储问题,GaiaDB 采用了自主研发的分布式多租户存储方案。该方案不仅在架构上支持多租户模式,还实现了对资源的极大化利用。

GaiaDB 的分布式多租户存储方案将多个集群的数据统一存储在一个系统中。通过资源的闲置调度策略,该方案能够有效地利用存储资源,提高存储空间的利用率。同时,GaiaDB 还对副本管理进行了优化。该方案可根据实例规模、集群磁盘使用率、集群机器负载、集群机架位和集群机器所在交换机等因素进行管理,使存储资源得到充分利用,并满足高性能的存储需求。

然而,随着时间的推移和集群的扩容或缩容等操作,存储系统中的副本分布可能会出现不均衡的现象。为了解决这一问题,GaiaDB 的分布式多租户存储方案能够提供统一的资源均衡策略。这种策略可以在一段时间后自动调整副本的位置,使副本分布更加合理,达到最优的存储效果。

另外,GaiaDB 的分布式多租户存储方案还具备强大的故障恢复能力。当故障发生时,该方案能够实现统一的自动恢复管理。根据待恢复的副本数量等因素,该方案能够合理地分配集群资源,减少资源堆积等问题。这种设计可以在保证数据安全的同时,最大程度地降低存储系统的维护成本,提高系统的可用性和稳定性。

多地多活技术

对于高可用性需求的业务,多可用区部署和多地域部署是常见的解决方案来确保数据库的高可用性。多可用区部署是在多个可用区中复制和备份数据,以避免一个可用区故障导致服务中断,但需考虑数据一致性和同步问题,以及更高的资源和成本。多地域部署是在不同地域的机房中复制和备份数据,网络延迟更大,数据存在秒级别延迟。

挑战

数据库在多机房和多地域部署的挑战主要来自于数据的一致性、可靠性和延迟问题。以下是对这些挑战的描述:

  1. 数据一致性:在多机房和多地域部署的情况下,保持数据一致性是一个主要挑战。当多个节点在分布式系统中处理数据时,可能会出现数据一致性问题。这种一致性问题通常由网络延迟、系统故障和数据复制延迟等因素引起。为了解决这个问题,可以使用一些技术手段,如分布式事务、一致性保证协议等。

  2. 数据可靠性:在多机房和多地域部署的情况下,数据可靠性是一个重要的挑战。由于地理位置的分散,数据在传输和处理过程中可能会出现更多的错误或丢失的风险。为了提高数据可靠性,可以使用冗余数据复制、分布式数据备份等技术。

  3. 延迟问题:在多机房和多地域部署的情况下,由于地理位置的分散,网络延迟可能会成为一个主要的问题。随着距离的增加,网络延迟会增加,这可能会影响数据库操作的性能和响应时间。为了降低延迟,可以采取一些措施,如优化网络架构、使用低延迟网络协议和缓存技术等。

解决方案

在数据库多AZ的部署中,我们采用了物理同步协议,这种协议可以确保在任意切换过程中不丢失任何数据。通过多AZ热活的解决方案,我们可以同时提供服务,从而确保即使在一个区域发生故障时,其他区域也能够继续提供服务。

为了实现低延迟和平滑兼容慢节点的目标,我们采用了就近访问的策略。这个策略能够让用户在访问数据库时自动选择最接近他们的节点,从而最大程度地减少延迟。同时,我们还不断优化数据库的操作和查询,以确保即使在慢节点上也能够平滑地兼容。

在多可用区部署时,GaiaDB模块的自适应就近访问策略可以感知元数据的变化,并根据这些变化及时切换访问路线。这种策略可以有效地应对各种故障和异常情况,确保数据的可靠性和可用性。

在多地域部署时,GaiaDB的自研同步组件Replicator通过同步Redo流来支持DDL操作等高级功能。这种方案可以实现主从地域之间的时延小于2秒,从而确保数据的实时性和一致性。同时,这种方案还具有良好的可扩展性和灵活性,可以轻松地适应不同地域的需求和变化。

总结

存算分离已成为流行的架构理念,通过存算分离可以提高数据库的弹性能力,降低存储成本、提高可用性。GaiaDB在架构演进中采用Quorum分布式协议和高性能网络技术降低计算和存储之间的访问延迟,提高并发访问性能;通过高可靠的分布式存储引擎实现RPO=0,同时利用分布式存储的扩展性提升IO带宽和并发性能。未来,GaiaDB 会坚定云原生技术路线,在成本、性能、可用性方面持续深入优化,为用户提供更稳定、更高性价比的数据库选择。

 

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

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

相关文章

Opencv——霍夫变换

霍夫直线变换 霍夫直线变换(Hough Line Transform)用来做直线检测 为了加升大家对霍夫直线的理解,我在左图左上角大了一个点,然后在右图中绘制出来经过这点可能的所有直线 绘制经过某点的所有直线的示例代码如下,这个代码可以直接拷贝运行 import cv2 as cv import matplot…

element -table,多行或列合并

需求&#xff1a;后端返回的表格数据&#xff0c;如果某列值一样&#xff0c;前端表格样式需要合并他们&#xff0c;需要合并的列的行数未知&#xff08;所以需要有数据后遍历后端数据对需要合并的属性进行计数&#xff09;即动态遍历表格合并 效果 - 重点方法&#xff1b;ta…

《金融电子化》昆仑银行在应用性能监控(APM)平台的实践与探索

《金融电子化》昆仑银行在应用性能监控&#xff08;APM&#xff09;平台的实践与探索 中国人民银行印发的《金融科技发展规划&#xff08;2022-2025年&#xff09;》是对金融科技发展的重要引领。规划强调了金融科技在推动金融行业现代化转型、提升金融服务效率和风险防控水平…

【LeetCode: 25. K 个一组翻转链表 + 链表 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

大数据学习之Redis,十大数据类型的具体应用(三)

目录 3.7 Redis位图&#xff08;bitmap&#xff09; 概念 需求 是什么 说明 能干嘛? 基本命令 3.7 Redis位图&#xff08;bitmap&#xff09; 概念 由0和1状态表现的二进制位的bit数组 需求 用户是否登陆过&#xff1f;Y / N 广告是否被点击过&#xff1f; 钉钉打…

Swift Vapor 教程(项目创建)

The future of web development. 在初次接触 Swift Vapor 时&#xff0c;感觉代码比较清爽&#xff0c;用起来逻辑比较清晰。 困难点&#xff1a; Swift Vapor 使用了JWT管理三方库&#xff0c;比较吃网络Swift Vapor 搭建环境比较复杂初次使用Swift Vapor 尽量不要使用MySql。…

关于 IntelliJ IDEA 中 Schedule for Addition 的问题

IntelliJ IDEA是一款强大的Java集成开发环境&#xff0c;由JetBrAIns公司开发。它以其智能代码编辑、代码分析工具、自动代码补全、强大的调试功能和内建的版本控制等特性而闻名。此外&#xff0c;它还支持Kotlin、Groovy、Scala和Android开发等多种语言和框架。 IntelliJ IDE…

Django模型(五)

一、数据的条件查询 参考文档:QuerySet API 参考 | Django 文档 | Django 1.1、常用检索字段 字段检索,是在字段名后加 __ 双下划线,再加关键字,类似 SQL 语句中的 where 后面的部分, 如: 字段名__关键字 exact :判断是否等于value,一般不使用,而直接使用 =contai…

【QT】坐标系统和坐标变换

目录 1 坐标变换函数 1.1 坐标平移 1.2 坐标旋转 1.3 缩放 1.4 状态保存与恢复 2 坐标变换绘图实例 2.1 绘制3个五角星的程序 2.2 绘制五角星的PainterPath的定义 3 视口和窗口 3.1 视口和窗口的定义与原理 3.2 视口和窗口的使用实例 4 绘图叠加的效果 1 坐标变换函数 QPainter…

高通GAIA V3命令参考手册的研读学习(十三):GAIA通知

如前文《高通GAIA V3命令参考手册的研读学习&#xff08;四&#xff09;》所述&#xff0c;PDU一共有四种&#xff0c;前面已经讲了命令、回应以及错误码&#xff0c;现在来看最后一种&#xff1a;通知。 4. QTIL GAIA通知 通知发送的方向&#xff0c;是由设备发送到移动应用…

CI/CD 管道安全:构建和部署之外的最佳实践

鉴于对快速创新和敏捷方法论采用的需求&#xff0c;持续集成/持续部署 (CI/CD) 管道已成为构建所有 DevOps 流程的基础。他们是高效交付的支柱。 事实上&#xff0c;根据持续交付状态报告&#xff0c;使用 CI/CD 工具与所有指标上更好的软件交付性能相关。 这些管道给组织带…

java代码中调用自定义函数

定义函数 CREATE DEFINERrootlocalhost FUNCTION test_fun1(num1 FLOAT,num2 FLOAT) RETURNS float BEGINDECLARE SUM FLOAT DEFAULT 0;SET SUMnum1num2;RETURN SUM; END <select id"cunchu" resultType"java.util.Map">SELECT test_fun1(1,2) as r…

MySQL索引原理以及SQL优化

案例 struct index_failure_t{int id;string name;int cid;int score;string phonenumber;}Map<int,index_failure>; 熟悉C的同学知道&#xff0c;上述案例中&#xff0c;我们map底层是一颗红黑树&#xff0c;一个节点存储了一对kv&#xff08;键值对&#xff09;&…

WPF应用程序(.Net Framework 4.8) 国际化

1、新建两个资源字典文件zh-CN.xaml和en-US.xaml&#xff0c;分别存储中文模板和英文模板 (1) zh-CN.xaml <ResourceDictionary xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&q…

机器学习:Logistic回归(Python)

Logistic回归&#xff08;二分类&#xff09; logistic_regression_class2.py import numpy as np import matplotlib.pyplot as pltclass LogisticRegression:"""逻辑回归&#xff0c;采用梯度下降算法 正则化&#xff0c;交叉熵损失函数&#xff0c;实现二分…

机器学习 强化学习 深度学习的区别与联系

机器学习 强化学习 深度学习 机器学习 按道理来说&#xff0c; 这个领域&#xff08;机器学习&#xff09;应该叫做 统计学习 &#xff08;Statistical Learning&#xff09;&#xff0c;因为它的方法都是由概率统计领域拿来的。这些人中的领军人物很有商业头脑&#xff0c; 把…

[docker] 利用Dockerfile多级构建缩减镜像大小

一、nginx FROM centos:7 as build #基于centos7镜像 MAINTAINER nginx on centos7 by lxy-20240125 #注释信息 ADD nginx-1.24.0.tar.gz /opt/ #将nginx安装包传输到镜像中 RUN yum -y install pcre-devel zlib-devel gcc gcc-c make && \cd /opt/nginx-1.24.0 &…

什么是DDOS流量攻击,DDoS防护安全方案

随着互联网的发展普及&#xff0c;云计算成新趋势&#xff0c;人们对生活方式逐渐发生改变的同时&#xff0c;随之而来的网络安全威胁也日益严重&#xff01; 目前在网络安全方面&#xff0c;网络攻击是最主要的威胁之一&#xff0c;其中DDoS攻击是目前最为常见的网络攻击手段…

Android studio打包apk比较大

1.遇到的问题 在集成linphone打包时发现有118m&#xff0c;为什么如此之大额。用studio打开后发现都是c不同的pu架构。 2.解决办法 增加ndk配置&#xff0c;不选配置那么多的cpu结构&#xff0c;根据自己需要调整。 defaultConfig { applicationId "com.matt.linphoneca…

2023美赛A题之Lotka-Volterra【完整思路+代码】

这是2023年的成功&#xff0c;考虑到曾经付费用户的负责&#xff0c;2024年可以发出来了。去年我辅导队伍数量&#xff1a;15&#xff0c;获奖M为主&#xff0c;个别F&#xff0c;H&#xff0c;零S。言归正传&#xff0c;这里我开始分享去年的方案。由于时间久远&#xff0c;我…