OLTP 数据库系统适用于事务处理场景, 系统需要在保证事务处理最基本 ACID 准则的基本前提下提高事务处理的吞吐能力。
按照对于不同类型云服务分离管理模式的差异, 现有云原生 OLTP 数据库系统可以划分为如下 3 类架构设计:
(1)计算-存储分离架构;
(2)计算-日志-存储分离架构;
(3)计算-缓存-存储分离架构
后续的 3 个小节将从架构 设计的动机、数据读写路径、系统优势与限制、典型系统这 4 个维度横向对比这 3 类不同的架构, 详细介绍各类架构之间的异同之处。
1.OLTP 计算-存储分离架构
存算分离架构如下图所示
从以下四方面解读这种架构。
1.1.设计动机
从设计的动机来看, 存算分离架构具备如下3个特点
(1)从弹性方面考虑, 计算资源和存储资源可以实现独立调度, 避免虚拟机内部计算存储耦合产生的资源浪费;
(2)从效率方面考虑, 持久化存储的更新依赖于日志回放, 减少计算存储层间的脏页面传输, 缓解写放大问题;
(3)从可用性方面考虑, 系统采用了多层次的故障恢复策略, 支持单个计算或存储节点级别的故障恢复, 具备更低的平均故障恢复延时。
1.2.数据读写过程
数据写入方面:主节点接收数据更新查询并生成对应的重做日志, 将重做日志写回到存储层中多数派的存储节点, 即视为写入操作完成;然后异步完成备计算节点同步以及存储节点间的同步过程。
数据读取方面:计算层节点优先通过本地缓存获取数据, 当缓存失效时向存储层请求最新数据. 存储节点内部异步将日志回放到页面, 同时节点支持直接解析未完成回放的日志数据, 避免阻塞计算层的读取请求。
1.3.优势与局限
相较于云托管数据库, 计算-存储分离架构的云原生 OLTP 数据库具备如下 3 个优势:
(1)降低数据写延时: 日志写入与记录页面同步更新分离 (异步), 副本间的记录页面同步不会阻塞写入过程;
(2)减少写放大问题: 系统采用重做日志回放实现存储层记录页面的数据更新, 避免计算存储层间的脏页面传输从而减少网络开销;
(3)提高弹性调度能力: 计算和存储采用不同的云服务, 资源调度过程完全分离。
系统的主要限制在于:
(1)计算层备节点缓存失效时读取延时较高, 需要通过存储层请求数据。
(2)存储节点在重做日志未完成回放时, 无法直接从记录页面读取数据, 需要面临在线解析日志获取最新数据的额外延时。
1.4.典型系统
基于计算-存储分离架构设计的云原生数据库系统包含 Amazon Aurora、Google AlloyDB。二者采用了类似的架构设计, 主要区别在于功能模块的实现上采用了不同的技术.
Aurora 数据库是首个提出日志即数据的云原生数据库, 其同时针对底层存储优化了现有的 Quorum 机制, 即通过增加副本数量提高了存储层的可用性和容错能力; 同时设计了 Quorum 集合机制来维护副本运行状态, 在此基础上利用备用副本提高了故障的 恢复速度
AlloyDB 数据库增加了系统对于 HTAP 工作负载的支持: 其通过计算层内自动行存转列存的方式来提 升数据查询的效率。
2.OLTP 计算-日志-存储分离架构
计算-日志-存储分离系统架构图如下所示:
从以下四方面解读这种架构。
2.1.设计动机
计算-日志-存储分离架构相较于计算-存储分离架构而言, 存储层被进一步划分为日志存储云以 及页面存储云, 以提升系统弹性。其中日志存储云和页面存储云分别处理日志和页面的存储管理、备份以及故障 恢复等工作.
此架构具备如下两个特点:
(1)从效率方面考虑, 日志存储采用高速存储可以降低日志写入延时, 进而降低系统写延时。
(2)从弹性方面考虑, 日志和页面采用不同类型的存储服务, 两种存储资源独立分配, 进一步提高了系统的弹性调度能力.
2.2.数据读写过程
数据写入方面:与存算分离架构类似, 同样采用持久化重做日志的方法完成事务的数据更新. 但是不同于存算分离架构之处在于——计算-日志-存储分离架构将日志存储和页面存储分离, 重做日志 的持久化由高速的日志存储云服务完成, 因此系统的写入延时更低. 异步处理由日志存储云向页面存储云传输重做日志, 由页面存储节点完成重做日志的回放过程.
数据读取方面:计算层优先通过本地缓存获取数据, 当缓存失效时向页面存储云请求最新数据. 值得注意的是, 数据读取过程中计算层不会直接访问日志存储的任何数据. 当日志数据没有同步到页面存储时, 计算层会等待存储层完成日志回放.
2.3.优势与局限
相较于存算分离架构而言, 计算-日志-存储分离架构具备两大优势:
(1)更低的数据写延时. 这主要得益于日志存储采用的高速云存储服务, 因此系统的写入延时能够进一步降低;
(2)更高的弹性调度能力. 因为日志存储和页面存储采用不同类型的存储服务, 且资源调度互相独立, 所以进一步强化弹性调度能力
架构主要劣势在于:
(1)当缓存失效时, 计算-日志-存储分离架构相比于存算分离架构读取延时更高, 这是因为计算层需要等待页面存储回放重做日志.
(2)日志和页面的分离管理面临更复杂的故障恢复情景. 例如, 所有页面存储节点均丢失中间日志, 仅能通过日志存储恢复的场景, 这提高了故障恢复算法的复杂性.
2.4.典型系统
典型实现系统有:Azure HyperScale、华为 Taurus。二者采用了类似的架构设计, 主要区别在于读写请求处理模块的实现, 由于日志存储与日志存储分别管理, 该模块需要管理数据在存储层的状态, 尤其是数据从日志存储到页面存储的同步状态. 二者在这个功能模块的实现上采用了不用的方案.
HyperScale 在计算层和存储层之间额外添加 XLOG 服务层负责这部分功能.
Taurus 数据库在计算层的每个节点上添加额外的存储抽象层来负责该功能.
HyperScale独立的功能模块设计有利于弹性伸缩。Taurus则分散模块的处理压力, 避免中心式的管理成为系统瓶颈.
3.OLTP 计算-缓存-存储分离架构
计算-缓存-存储分离系统架构如下所示:
从以下四方面解读这种架构。
3.1.设计动机
相比较前两种架构,计算-缓存-存储分离架构借助于远程内存服务额外增加了所有计算节点共享的远程缓存, 实现了对于本地缓存的扩充, 提高了整体的缓存命中率. 此外, 由于缓存区由所有计算节点共享, 同样兼具了 计算节点间更新同步加速的功能。
此种架构具备如下 3 个特点:
(1)从效率方面考虑, 系统实现远程共享缓存. 共 享缓存内的记录页面相较于存储层内的页面而言具备更低的数据读取延时;
(2)从吞吐方面考虑, 从存储层读取的 数据可以保留在共享缓存中, 避免了相同数据被不同计算节点多次读取时需要在存储层重复读取的问题, 从而提 高系统读取吞吐能力;
(3)从弹性调度方面考虑, 共享缓存所用的远程内存可以基于工作负载自动扩缩容, 系统增 加了对于内存资源弹性调度的支持.
3.2.数据读写过程
数据写入路径方面:与前两类架构类似, 即采用持久化重做日志的方法完成事务的数据更新. 不同之处在于, 当更新数据存在于远程缓存时, 需要同时将更新数据写入到远程共享缓存. 更新方式类似于计算-日志-存储分离架构, 日志存储异步将重做日志更新到页面存储并于页面存储节点内部完成数据回放过程.
数据读取路径方面:远程缓存作为本地缓存的补充, 当本地缓存失效时可以通过远程缓存获取数据. 当本地与远程缓存均失效时, 才会继续向存储层获取最新数据.
3.3.优势与局限
此类架构系统具备如下 3 个 优势:
(1)更低的数据读延时: 共享缓存底层由远程内存支持, 数据访问速度高于持久化存储服务, 因此系统具备更 低的数据读取延时;
(2)更高的吞吐能力, 计算节点共享远程缓存数据, 避免重复的存储层数据访问, 进而提高系统 的吞吐能力;
(3)更高的弹性调度能力: 系统增加对于远程内存资源扩缩容的支持, 弹性调度能力加强.
此类系统的缺点有:
(1)更大的共享缓存网络压力, 这是因为所有共享缓存均访问同一片远程内存区域, 容易成为系统瓶颈。
(2)共享缓存需要具备极低的网络延时, 因此必须搭建高速 RDMA (remote direct memory access) 网络作为硬件支持, 因此网络硬件部署的成本更高。
3.4.典型系统
基于计算-日志-存储分离架构设计的云原生数据库系统包含阿里 PolarDB Serverless。
PolarDB借助可弹性调度的远程共享缓存服务, 在云原生数据库中加入了多个计算节点共享的远程缓存. 数据更新可以通 过共享缓存从主节点传输到备节点, 从而提高备节点的数据读取效率. 在这类架构中一个重要的技术难点在于保证共享缓存与主节点的数据一致性.
4.OLTP数据库各架构对比
分别从读写吞吐能力、系统可用性、弹性扩容能力以及部署的成本角度进行对比。
存算分离架构系统结合计算云服务与存储云服务, 相对成本较低. 事务更新的持久化仅依赖于重做日志的持久化, 因 此系统仅需要完成重做日志到存储层的写入过程, 就可以通知上层用户事务更新操作成功, 具备良好的写吞吐能力. 存储层中日志数据和页面数据同时存储在相同的存储节点, 并且节点异步处理重做日志到记录页面的回放操 作. 当重做日志没有完成到页面的更新回放时, 节点需要进行日志解析过程才能读取到最新数据. 由于日志解析过程将增加数据读取的延时, 从而一定程度上限制了系统的读取吞吐能力.
计算-日志-存储分离系统同样结合计算云服务以及存储云服务. 这类架构与存算分离架构的核心区别在于存储云服务进一步细分成日志存储云以及页面存储云, 日志数据和页面数据独立存储于对应的云存储服务的节点中, 实现了日志和 页面数据的分离存储. 日志数据异步地更新到页面存储云, 并基于页面存储所反馈的状态信息异步清理已经完成 同步的日志. 日志存储云采用高速云存储服务, 有效降低数据写入延时. 同时, 日志存储云的清理机制保证日志存 储节点不需要庞大的存储容量, 能控制相对昂贵的高速存储服务的使用成本. 但是同样受限于日志异步更新的机 制, 未完成同步的记录要求计算节点在读取查询过程中需要向多个页面存储节点的请求数据. 且最坏情况下, 当出 现已完成回放的页面存储节点的异常时, 读取请求必须等待其余页面存储节点完成重做日志的回放, 这限制了此 类系统的读取吞吐能力.
计算-缓存-存储分离系统结合计算云服务、存储云服务以及共享内存服务. 考虑到共享内存要求所有计算节点共同访问相 同的内存区域, 因此对于网络带宽有严格要求. 此外, 共享内存同时需要具备低访问延时的特性, 才能利用共享内 存实现计算节点间高效数据同步. 因此共享内存服务依赖于高速低延时的 RDMA 网络, 具备较高的网络部署成 本. 而高速的共享缓存降低了数据更新在主节点到备节点之间的更新同步延时, 同时缓解多个计算节点重复向存 储层请求相同数据的问题, 系统的读取性能得到显著提高. 此外, 计算、缓存、存储服务三者均可独立调度, 因此 系统可以支持更细粒度的资源管理.
5.云原生 OLTP 数据库的关键技术
总体来说, 云原生 OLTP 数据库的关键技术, 包括数据组织技术、存储层副本一致性技术、主备更新同步技 术、故障恢复技术、HTAP 技术 5 个部分。如下图所示:
云原生OLTP数据库关键技术优缺点比较如下表所示:
5.1.数据组织技术
数据组织技术有两大类:
(1)日志-页面耦合的存储策略:一般应用于日志-页面耦合架构, 这类系统中存储层使用统一的存储服务, 单一存储节点内同时存储日志和页面数据. 这类架构下不存在跨存储服务的数据传输, 其关键技术在于以日志为中心的数据组织模式, 存储节点支持直接通过重做日志读取记录, 但是需要面临额外的日志解析开销。
(2)日志-页面分离的存储策略:一般应用于日志-页面分离架构, 这类系统中存储层采用不同的存 储服务管理两类数据, 单一存储节点仅保留其中之一. 这类架构下事务更新的同步需要进行跨存储服务的数据传输, 其关键技术在于降低更新同步的延时以及数据传输量, 以达到降低存储层的读取延时. 由于该结构下读取过程仅通过页面存储读取数据, 因此能够避免前者的日志解析的时间开销。
粗略对比如下表所示:
5.2.存储层副本一致性技术
指存储层用于维护多个数据副本一致性的相关技术. 这类技术 一般基于传统分布式系统的相关协议, 在原有策略基础添加对于云环境的特定优化.
可以将这类技术划分为两类:
(1)基于 Quorum 算法的协议:Quorum 算法具有简单的流程以及优秀的并发能力, 但是不能满足可线性化特征. 部分存储节点缺失更新时仍会继续运行, 这造成计算层必须向多个存储节点读取数据. 为了解决这一问题, 这类技术需要结合 Gossip 协议 等方式来提供可线性化特征.
(2)基于 Paxos 类算法的协议:基于 Paxos 类算法设计, 包括Paxos以及Raft算法及其变种,这 类算法具备可线性化的特征, 但其严格的线性化流程限制了原始算法的并发能力. 因此这类技术需要结合云环境高并发特性加强原始算法的并发能力。
两类技术对比如下表所示:
5.3.计算层主备同步技术
更新同步技术是指计算层主节点将事务的更新从主节点同步到只读备节点的技术。这类技术要求系统在保证数据一致性的前提下,降低备节点的同步延时.
可以划分为3类:
(1)基于持久化存储同步:最基 本的同步方式,在现有云数据库一写多读的架构下能够保证数据一致性。但是主要的限制在于通过持久化存储读 取数据需要经过网络 I/O,同步延时相对延时较高。
(2)基于计算节点本地缓存同步:基于本地缓存进行更新同步,主节点直接向备节点传输重做日志来更新本地数据。这类技术的难点在于限制网络传输量以避免网络瓶颈。
(3)基于远程共享缓存同步:基于所有计算节点共享的远程缓存进行同步,主节点将更新写入到共享存储后备节点可以直接从中读取。这类技术的难点在于保证主节点与远程缓存的一致性,避免备节点读取到已经变更的数据。
三类技术对比如下表所示:
5.4.故障恢复技术
指系统为应对多种异常情况而设计的多层次故障恢复策略。分离的架构设计让数据库系统不同层级间数据传输的网络成本高于传统的耦合结构,因此在故障恢复过程中,通过在层级内进行节点恢复来避免跨服务的网络传输。此外,分离的架构也同样提供了容错隔离性,促成云原生环境下特有的故障恢复技术。
包括如下两类
(1)计算层无重做的节点恢复:基于计算-存储分离的架构,不同于传统数据库系统,云数据库中数据持久性完全由存储层保证。因此计算层不需要经过重做阶段来恢复故障时的缓存状态,而是将这一阶段下推到存储层异步完成,降低计算节点故障恢复延时.
(2)计算缓存层的双层容错协议:技术基于计算-缓存分离的架构,利用缓存层作为计算层的额外检查点。利用二者容错独立特性,将共享缓存作为计算节点的可靠存储来加速故障恢复,同时持久化存储作为计算层和缓存层的可靠存储,保证二者同时异常时的故障恢复能力。这种两层容错的方式可以降低计算节点的平均故障恢复时间。
两类技术对比如下表所示:
5.5.HTAP技术
HTAP 技术是指在原有 OLTP 系统基础上添加对于 OLAP 工作负载的优化。
可以划分为 3 类
(1)计算层动态行存转列存:关注于计算层,数据从存储层导入到缓存后可以自动从行存转化为 列存格式,从而加速OLAP负载的处理速度。技术难点在于优化器需要合理选择转化的数据列以及查询所使用的数据格式。
(2)存储层行列混存数据副本:关注于存储层,系统同时维护行存和列存数据副本,行存数据异步更新到列存数据,利用列存数据优化分析型查询。技术难点在于提高列存数据的新鲜度。
(3)内存型行存加持久化列存:类技术发展自内存型数据库 MemSQL 。系统在内 存中按照行存格式进行事务处理,持久化存储中则按照列存格式进行组织数据。这种模式下,内存中的行存格式数据能高效处理事务型查询,而持久化存储中的列存格式数据能在分析型查询中加速大规模数据扫描、聚合、分组等运算。这类技术的主要限制在于内存中的行存格式数据到持久化存储的列存格式数据的转化开销高。因此系统在实际运行中要求热数据尽可能常驻于内存中来内存中数据到磁盘的转化频率,而这将产生较高的内存开销。
此三类技术对比如下表所示:
6.备注
本文参考软件学报的《云原生数据库综述》一文。