VLDB顶会论文解读|PolarDB MySQL高性能强一致集群核心技术详解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 论文中,PolarDB-SCC提出了一个全局强一致的主从架构的云原生数据库。目前该架构已在PolarDB架构中上线一年有余,是业内首个在业务无感知情况下实现全局一致性读的主从架构云原生数据库,解决了一直以来海量客户的一致性痛点。

1.引言


日前,在加拿大温哥华召开的数据库领域顶会VLDB 2023上,来自阿里云瑶池数据库团队的论文《PolarDB-SCC:A Cloud-Native Database Ensuring Low Latency for Strongly Consistent Reads》,成功入选VLDB Industrial Track(工业赛道)


论文中,PolarDB-SCC提出了一个全局强一致的主从架构的云原生数据库。目前该架构已在PolarDB架构中上线一年有余,是业内首个在业务无感知情况下实现全局一致性读的主从架构云原生数据库,解决了一直以来海量客户的一致性痛点。


2.现状分析


现有的基于共享存储的云原生一写多读数据库通常都是采用异步的日志传输和日志回放,导致RO上会返回过期的数据,只能保证最终一致性。我们测试了几款数据库,发现其RO节点都会返回过期的数据。在我们的测试中,首先在RW节点写入数据,然后过一小段时间后在RO节点读取该数据,统计在RO节点上读到过期数据的比例。结果如下所示,其中DB-A和DB-B为两个商业的云原生数据库,这里做了匿名处理。PolarDB指的是没有SCC功能的形态。QueryFresh是来自学术界的一个解决方案。我们可以发现只有PolarDB-SCC可以完全避免读到过期数据。



为了实现RO节点的强一致性,现有的常用算法主要是commit-wait和read-wait。在commit-wait中,RW在事务提交之前需要等待该事务的日志已经传输到所有RO节点,并且已经回放完。这种做法严重影响了RW节点的性能。Read-wait算法中,在RO节点处理请求时,首先需要获取RW节点当前的最大提交时间戳,然后等RO节点的日志回放到该时间戳后,再实际处理请求。这种做法会使RO的处理延迟变大。


为了实现低延迟的全局一致性,我们重新设计并实现了PolarDB-SCC,其基于与RDMA的深度融合,采用了交互式多维度主从信息同步机制取代了传统的主从日志复制架构,并通过巧妙的设计,减少RO节点获取时间戳的次数,同时避免了不必要的日志回放等待,最终在几乎没有性能损失的情况下实现了RO的全局强一致读。


3.总体架构


PolarDB-SCC采用了基于共享存储的一写多读架构,包含一个读写(RW)节点和多个只读(RO)节点。RW和RO节点可以进一步连接到代理节点上。代理节点可通过将读请求分发到RO节点并将写请求转发到RW节点来实现读写分离,从而提供透明的负载平衡。RW节点和RO节点通过基于RDMA的网络连接,可快速传输日志和获取时间戳。


PolarDB的事务系统是一套重新设计的基于时间戳的事务系统,其完全重构了MySQL基于活跃事务数组的传统事务系统,以支持分布式的事务扩展和提升单机性能,这是PolarDB-SCC的基线。PolarDB-SCC的核心设计主要是以下三个:


▶︎ 线性Lamport时间戳。由于最新修改的时间戳保存在RW节点上,因此RO节点必须在每次处理请求时从RW节点获取该时间戳。虽然RDMA网络速度很快,但如果RO节点的负载很重,开销仍然很大。为了减少时间戳获取的开销,我们提出了线性Lamport时间戳。在线性Lamport时间戳的基础上,RO节点从RW节点获取时间戳后,可将其存储在本地。任何早于该时间戳到达RO节点的请求都可以直接使用本地存储的时间戳,而不用从RW节点获取新的时间戳。当RO节点负载较重时,这可以节省许多获取时间戳造成的开销。


▶︎ 分层的细粒度的修改跟踪。在RW维护全局、表级、页面(page)级的更新时间戳。当RO处理请求时,首先获取全局的时间戳,如果全局时间戳比RO回放日志的时间戳小,RO不会立即进入等待,而是继续比较请求需要访问的表、page的时间戳。只有当需要访问的page的时间戳仍然不满足时,才会等待日志回放。这样可以避免一些不必要的日志回放等待。


▶︎ 基于RDMA的日志传输。PolarDB-SCC采用了单边RDMA的接口来实现RW到RO的数据传输,极大地提高了日志传输速度,同时减少了日志传输时带来的CPU开销。


4.方案实现


1. 线性Lamport时间戳


RO在处理读请求时,必须获取RW节点的最新时间戳。如果RO节点的负载很重,一方面会占用更多的网络带宽,另一方面会给RO的请求带来更大的延迟。而通过设计线性Larmport时间戳,可以在高并发时让一个时间戳服务多个请求。其核心思想是,如果一个请求发现在其到达时间之后已经有其他请求从RW获取了一个时间戳,那么它可以直接重用该时间戳,而不需要再向RW获取一个新的时间戳,这样仍然可以保证强一致性。可以用下面的例子来证明。



上图中一个RO上有两个并发的读请求r1r2r2t2时向rw发送读取时间戳的请求,在t3时刻拿到了RW的时间戳TS3rw。我们可以得到这几个事件的关系:e2TS3rwe3r1t1时刻到达。通过在RO给每个事件分配一个时间戳,可以确定同一个RO上不同事件的先后关系。如果t1t2之前,我们可以得到,e1e2TS3rwe3。也就是说r2拿到的时间戳,其实已经反应了r1到达之前的所有更新,所以r1就可以直接使用r2的时间戳,而不必去拿新的时间戳。基于这个原则,RO每次拿到RW的时间戳时,都会把这个时间戳保存在本地,并且会记录获取到该时间戳的时间,如果某个请求的到达时间早于本地缓存时间戳的获取时间,则该请求可以直接使用该时间戳。


2. 分层的细粒度的修改跟踪


为了在RO上实现强一致读,RO需要首先获取RW当前的最大时间戳。然后等待RO上的日志回放到该时间戳,最后才可以实际处理读请求。然而实际上,RO在等待日志回放时,可能当前请求的数据已经是最新的了,并不需要再等待日志回放。为了避免这些不必要的等待时间。PolarDB-SCC使用了更加细粒度的修改追踪。在RW上维护三层修改信息:全局的最新修改的时间戳,表级的时间戳和页面(page)级别的时间戳。


RO在处理读请求时,首先获取RW上全局时间戳,如果全局时间戳不满足条件,可以进一步获取当前所访问的表的时间戳,如果仍不满足,进一步检查需要访问的对应的page的时间戳是否满足条件。只有当page的时间戳仍然比RO日志回放时间戳还大时,RO才需要等待日志回放。


RW上三个层次的时间戳都是放在内存哈希表中的,为了减少这部分的内存使用量,会存在多个表或page的时间戳放到同一个位置,但是只允许大的时间戳替换小的时间戳,这样,即使RO拿到一个大的时间戳也不影响一致性。具体设计如下图所示,TID和PID分别表示表和page的ID。RO拿到对应的时间戳都会按照前面提到的线性Lamport时间戳的设计将其缓存到本地,可以给其他符合条件的请求使用。



3. 基于RDMA的日志传输


如果RO总是通过共享存储获取日志,会导致日志的传输延迟变慢,如果RW用TCP/IP的方式给RO发送日志,不仅会浪费RW/RO上的CPU资源,同时延迟也比较高。因此,在PolarDB-SCC中。RW通过单边RDMA的方式远程将日志写入到RO缓存,该过程不需要RO的CPU参与,同时延迟也很低。


具体实现如下图所示,RO和RW都维护了相同大小的log buffer。RW的后台线程会将RW的log buffer通过RDMA写入到RO的log buffer。由于RO的CPU并不参与日志的传输,所以RO是无法感知其缓存内哪些日志是有有效的,而RW也无法感知RO上哪些日志已经回放完了。所以日志传输协议需要一些额外的控制信息来保证不会出现覆盖的情况。由于篇幅限制,具体细节这里就不具体展开了,可以参考论文。



5.实验分析


PolarDB-SCC已经正式在PolarDB MySQL上商业化了,并且已经在线上运行了一年多。所以我们的实验都是在阿里云的公有云环境上进行的。大部分实验都是使用8c32g的实例。因为PolarDB-SCC是在PolarDB-MySQL上实现的,所以我们的主要比较对象也是PolarDB。我们主要和PolarDB的几个不同配置进行比较:


PolarDB-default:这种配置所有请求都是在RW上处理,整个系统是强一致的。

PolarDB-read-write:使用基本的read-write方案在RO上实现强一致读。

PolarDB-stale-read:RO直接处理请求,可能返回过期的数据。



1. 整体性能


上图展示了在SysBench read-write负载下,不同压力时各个系统的性能。在低负载时(比如16,32线程),由于系统没有达到瓶颈,不同系统性能差不多,即使所有请求都在RW上处理,也是可以的。随着压力增加。PolarDB-default和PolarDB-read-write的性能有小幅增长,但很快就饱和了。然而,PolarDB-SCC始终可以保持和PolarDB-stale-read相似的性能。所以,PolarDB-SCC不仅可以实现强一致,而且性能几乎没有损失。


2. 性能breakdown分析


我们进一步测试PolarDB-SCC不同设计带来的性能提升。LLT表示线性Lamport时间戳,HMT表示多层细粒度的修改追踪。从中可以发现,PolarDB-SCC的各个设计对总体的性能提升都是有帮助的。并且RO数量越多,性能提升越明显。



3. PolarDB-SCC和Serverless的结合


PolarDB-SCC可以通过代理提供一个统一的强一致的endpoint。用户可以将应用连接到该endpoint,并在后端动态增加或减少RO节点的数量,而无需对应用进行任何更改。PolarDB的Serverless功能能够针对动态的工作负载动态调整RO节点的数量。与PolarDB-SCC集成后,应用程序看起来像是只连接到一个拥有动态资源的RW节点,同时保证了强一致性。下图中测试了这种场景。在该测试中,工作负载在300秒、600秒和900秒时变得更重,数据库集群会在后台动态添加更多RO节点,当集群中添加更多RO节点时,性能会以几乎线性的方式迅速提高。



6.总结


实现从(只读)节点的强一致性一直以来都是数据库业内难以突破的技术难题。PolarDB-SCC颠覆了传统的主从复制架构,提出了一种全新的数据库架构。新架构利用RDMA的多种算子全面重构了主从节间的数据通信模式,通过追踪细粒度的数据修改以及设计新的时间戳方案,并融合基于时间序的新一代事务系统实现了高性能全局一致性读。目前该架构已在PolarDB上线,详见:https://help.aliyun.com/zh/polardb/polardb-for-mysql/user-guide/scc


点击链接即可下载论文。




阿里云瑶池数据库入选VLDB 2023论文列表


* Research Papers *

1. OneShotSTL: One-Shot Seasonal-Trend Decomposition For Online Time Series Anomaly Detection And Forecasting.

2. CatSQL: Towards Real World Natural Language to SQL Applications.
3. HEDA: Multi-Attribute Unbounded Aggregation over Homomorphically Encrypted Database.

* Industrial Papers *

1. Anser: Adaptive Information Sharing Framework of AnalyticDB.
2. Eigen: End-to-end Resource Optimization for Large-Scale Databases on the Cloud.
3. Real-time Workload Pattern Analysis for Large-scale Cloud Databases.
4. SimpleTS: An Efficient and Universal Model Selection Framework for Time Series Forecasting.
5. PolarDB-SCC: A Cloud-Native Database Ensuring Low Latency for Strongly Consistent Reads.
6. Lindorm TSDB: A Cloud-native Time-series Database for Large-scale Monitoring Systems.

* Demonstrations *

1. Ganos Aero: A Cloud-Native System for Big Raster Data Management and Processing.


作者陈浩、章颖强

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
监控 关系型数据库 MySQL
10亿数据如何最快速插入MySQL:技术干货分享
【8月更文挑战第2天】在大数据时代,处理并快速插入数十亿条数据到MySQL数据库是许多企业面临的关键挑战。本文将深入分享一系列高效的技术策略和实战经验,帮助读者优化这一过程,确保数据能够快速、准确地进入数据库系统。
194 1
|
10天前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
36 3
|
1月前
|
XML 关系型数据库 MySQL
MySQL 导出某些数据的技术详解
MySQL 导出某些数据的技术详解
127 2
|
2月前
|
存储 关系型数据库 MySQL
技术解析:MySQL中取最新一条重复数据的方法
以上提供的两种方法都可以有效地从MySQL数据库中提取每个类别最新的重复数据。选择哪种方法取决于具体的使用场景和MySQL版本。子查询加分组的方法兼容性更好,适用于所有版本的MySQL;而窗口函数方法代码更简洁,执行效率可能更高,但需要MySQL 8.0及以上版本。在实际应用中,应根据数据量大小、查询性能需求以及MySQL版本等因素综合考虑,选择最合适的实现方案。
363 6
|
1月前
|
关系型数据库 MySQL 数据库
MySQL技术深度解析:每次最大插入条数探秘
MySQL技术深度解析:每次最大插入条数探秘
49 0
|
1月前
|
关系型数据库 MySQL 数据库管理
MySQL技术指南:如何更改数据字段的前几位数字
MySQL技术指南:如何更改数据字段的前几位数字
55 0
|
1月前
|
消息中间件 监控 关系型数据库
MySQL数据实时同步到Elasticsearch:技术深度解析与实践分享
在当今的数据驱动时代,实时数据同步成为许多应用系统的核心需求之一。MySQL作为关系型数据库的代表,以其强大的事务处理能力和数据完整性保障,广泛应用于各种业务场景中。然而,随着数据量的增长和查询复杂度的提升,单一依赖MySQL进行高效的数据检索和分析变得日益困难。这时,Elasticsearch(简称ES)以其卓越的搜索性能、灵活的数据模式以及强大的可扩展性,成为处理复杂查询需求的理想选择。本文将深入探讨MySQL数据实时同步到Elasticsearch的技术实现与最佳实践。
88 0
|
3月前
|
关系型数据库 MySQL 分布式数据库
PolarDB 并行查询问题之保证与MySQL的兼容性如何解决
PolarDB 并行查询问题之保证与MySQL的兼容性如何解决
44 1
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技术安装配置、数据库与表的设计、数据操作解析
MySQL,作为最流行的关系型数据库管理系统之一,在WEB应用领域中占据着举足轻重的地位。本文将从MySQL的基本概念、安装配置、数据库与表的设计、数据操作解析,并通过具体的代码示例展示如何在实际项目中应用MySQL。
89 0
|
3月前
|
SQL 存储 关系型数据库
mysql加索引真的会锁表吗?揭秘背后的技术细节与规避策略
【8月更文挑战第16天】在数据库管理中,添加索引能大幅提升查询效率。MySQL执行此操作时的锁定行为常引起关注。文章详细解析MySQL中索引添加时的锁定机制及其原理。不同存储引擎及SQL语句影响锁定策略:MyISAM需全表锁定;InnoDB提供更灵活选项,如使用`ALTER TABLE... LOCK=NONE`可在加索引时允许读写访问,尽管可能延长索引构建时间。自MySQL 5.6起,在线DDL技术可进一步减少锁定时间,通过`ALGORITHM=INPLACE`和`LOCK=NONE`实现近乎无锁的表结构变更。合理配置这些选项有助于最小化对业务的影响并保持数据库高效运行。
420 4

相关产品

  • 云数据库 RDS MySQL 版
  • 云原生数据库 PolarDB
  • 推荐镜像

    更多
    下一篇
    无影云桌面