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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 论文中,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
相关文章
|
2月前
|
存储 NoSQL 关系型数据库
非关系型数据库-MongoDB技术(二)
非关系型数据库-MongoDB技术(二)
|
2月前
|
NoSQL 关系型数据库 MongoDB
非关系型数据库-MongoDB技术(一)
非关系型数据库-MongoDB技术(一)
|
25天前
|
Cloud Native 关系型数据库 分布式数据库
|
1月前
|
SQL JSON 关系型数据库
MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
【10月更文挑战第3天】MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
133 5
|
1月前
|
关系型数据库 分布式数据库 数据库
PolarDB 开源:推动数据库技术新变革
在数字化时代,数据成为核心资产,数据库的性能和可靠性至关重要。阿里云的PolarDB作为新一代云原生数据库,凭借卓越性能和创新技术脱颖而出。其开源不仅让开发者深入了解内部架构,还促进了数据库生态共建,提升了稳定性与可靠性。PolarDB采用云原生架构,支持快速弹性扩展和高并发访问,具备强大的事务处理能力及数据一致性保证,并且与多种应用无缝兼容。开源PolarDB为国内数据库产业注入新活力,打破国外垄断,推动国产数据库崛起,降低企业成本与风险。未来,PolarDB将在生态建设中持续壮大,助力企业数字化转型。
85 2
|
1月前
|
关系型数据库 Unix MySQL
MySQL是一种关系型数据库管理系统
MySQL是一种关系型数据库管理系统
44 2
|
1月前
|
关系型数据库 MySQL 数据库
mysql关系型数据库的学习
mysql关系型数据库的学习
18 0
|
2月前
|
Cloud Native 关系型数据库 分布式数据库
PolarDB开源项目未来展望:技术趋势与社区发展方向
【9月更文挑战第5天】随着云计算技术的发展,阿里云推出的云原生分布式数据库PolarDB受到广泛关注。本文探讨PolarDB的未来展望,包括云原生与容器化集成、HTAP及实时分析能力提升、智能化运维与自动化管理等技术趋势;并通过加强全球开源社区合作、拓展行业解决方案及完善开发者生态等措施推动社区发展,目标成为全球领先的云原生数据库之一,为企业提供高效、可靠的服务。
91 5
|
3月前
|
存储 缓存 负载均衡
【PolarDB-X 技术揭秘】Lizard B+tree:揭秘分布式数据库索引优化的终极奥秘!
【8月更文挑战第25天】PolarDB-X是阿里云的一款分布式数据库产品,其核心组件Lizard B+tree针对分布式环境优化,解决了传统B+tree面临的数据分片与跨节点查询等问题。Lizard B+tree通过一致性哈希实现数据分片,确保分布式一致性;智能分区实现了负载均衡;高效的搜索算法与缓存机制降低了查询延迟;副本机制确保了系统的高可用性。此外,PolarDB-X通过自适应分支因子、缓存优化、异步写入、数据压缩和智能分片等策略进一步提升了Lizard B+tree的性能,使其能够在分布式环境下提供高性能的索引服务。这些优化不仅提高了查询速度,还确保了系统的稳定性和可靠性。
90 5
|
3月前
|
存储 SQL Cloud Native
揭秘!PolarDB-X存储引擎如何玩转“时间魔术”?Lizard多级闪回技术让你秒回数据“黄金时代”!
【8月更文挑战第25天】PolarDB-X是一款由阿里巴巴自主研发的云原生分布式数据库,以其高性能、高可用性和出色的可扩展性著称。其核心竞争力之一是Lizard存储引擎的多级闪回技术,能够提供高效的数据恢复与问题诊断能力。本文通过一个电商公司的案例展示了一级与二级闪回技术如何帮助快速恢复误删的大量订单数据,确保业务连续性不受影响。一级闪回通过维护最近时间段内历史数据版本链,支持任意时间点查询;而二级闪回则通过扩展数据保留时间并采用成本更低的存储方式,进一步增强了数据保护能力。多级闪回技术的应用显著提高了数据库的可靠性和灵活性,为企业数据安全保驾护航。
45 1

相关产品

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

    更多