GaussDB池化透明多写架构带来的三重突破

阅读 1

3小时前

本文根据华为数据库高级技术专家张金玉在DTCC大会华为云数据库专场的分享内容整理而成。

点击查看华为数据库高级技术专家张金玉受访视频https://mp.weixin.qq.com/s/kqZB_bV14ROA9vBT_mdFYw

常见的分布式架构

对于分布式架构,大家都比较熟悉。如下图左侧的分布式架构,采用的是分布式静态分区方式。该架构是对业务进行分片,因此对业务的设计和改造的要求非常高。原因是基于分片的架构计算和存储为一体,数据的访问与存储紧密结合,每个数据节点只能访问一个分片的数据,数据分片在哪里,计算就必须访问到哪里,因此无论是存储扩容,还是计算扩容都比较困难。

111.png

右侧的架构是分散式池化架构,采用的是基于请求的动态自适应的分区方式。对业务而言,该架构不需要进行分布式改造,只需要亲和性地接入计算节点,每个计算节点访问到的数据会从存储节点自动加载,每一层的资源可以动态弹性扩展,并且每个计算节点对等,都可以读写全量数据,计算节点访问哪些数据,对应的数据页面会自动缓存到该计算节点。

这是两种典型的分布式架构的对比。

GaussDB池化透明多写架构

GaussDB池化透明多写基于Share Everything架构,实现了计算节点对等读写,带来了性能、可用性、弹性的三重突破。

222.png01性能突破

分布式缓冲池基于PO和RA机制降低和避免节点间交互

为了优化分布式Buffer Pool的访问性能,GaussDB引入了页面属主(PO)、读授权(RA)以及页面目录(PD)机制。该机制通过优化页面访问路径,最大限度减少了节点间的交互,从而优化了分布式Buffer Pool的访问效率——当计算节点上的事务访问某页面时,若该节点是此页面的属主,或者该页面是读授权的,那么该事务完全可以直接进行本地访问;反之,若该节点是既不是页面的属主,页面也不是读授权,那么事务访问页面则需要从其他节点读取。

基于去中心化Lamport时间戳降低网络交互,解决单点性能瓶颈

数据库中有两个关键的时间序列:事务的提交顺序、事务修改页面的顺序,事务修改页面产生的日志也必须保持顺序性。在传统的单机数据库中,单节点修改页面产生的日志本身是有序的,但多节点修改同一个页面的顺序也要保证,GaussDB引入Lamport LSN解决了多个节点修改同一个页面WAL的顺序问题。

GaussDB还实现了去中心化Lamport时间戳。其核心逻辑是:运行在多个节点上的两个事务,若互相没有因果关系,则可以采用相同的提交时间戳,若互相存在因果关系,则必须保证两者提交时间戳的大小关系。这种方式有效避免了单点性能瓶颈。

基于自动分区的空闲空间亲和性分配算法降低节点间冲突

在单机数据库中,数据插入需要找到能够容纳元组的页面,相对而言比较简单,但在分布式情况下每个节点都可以增删改查,因此在多节点下的空闲空间管理必须考虑亲和性。GaussDB基于自动分区的空闲空间亲和性分配算法降低了节点间的冲突。

IUD本地亲和的表锁和事务锁

关于数据库的表锁、事务锁,在单机情况下加锁是比较简单的,且时延很低。而在分布式情况下,则需要考虑尽量降低跨节点的加锁,以避免额外的时延损耗。GaussDB重点优化了增删改查业务的时延——表锁采用本地加锁方式,无需跨节点协调。对于事务锁,每个事务启动都要有事务锁,这些锁在本地维护,当多个事务并发更新同一行数据时,若前一个事务没有提交,后一个事务则需要等待获取事务锁,只有事务冲突时才会需要等待事务锁。

02 可用性突破

基于磁盘内存双Checkpoint机制降低WAL恢复时间

在高可用上,传统的数据库磁盘检查点的问题在于其性能取决于磁盘的速率,检查点刷页的速度取决于磁盘的能力,如果业务的吞吐非常高,那么检查点的推进速度是有限的。GaussDB支持了磁盘内存双Checkpoint机制,内存检查点和磁盘检查点共同推进、混合运行。在计算节点故障下,可以从内存检查点开始恢复,这样恢复的量比较少,内存检查点推进比较快。在内存节点故障下,因为计算节点的脏页没有丢失,所以不需要从WAL恢复页面。在计算节点和内存节点同时故障的情况下,则从磁盘检查点开始恢复,通过磁盘内存双Checkpoint机制,计算节点故障恢复的日志量是非常少的。

基于邻居故障检测和按需恢复算法实现RTO<6s

邻居故障检测算法能够显著提升故障检测的鲁棒性,因为仅当所有的邻居都判定某节点故障时,系统才最终认定该节点故障。按需恢复算法除依托双检查点机制外,思路是尽可能减少日志恢复量,因为每个节点都可以读写,某一个节点故障之后,其他的存活节点业务可以不中断继续运行,只有发生故障的计算节点的脏页丢失,且后续需要访问这些脏页时才会触发日志恢复流程。在这种情况下,计算节点发生故障时,存活节点依然可以不中断继续提供业务。

基于PDB级WAL多流实现双集群非对称双活容灾

关于容灾,业界目前大多是灾备集群只读,传统数据库的设计基本上只有一个日志流,即使有多个Database,也是共享一个日志流,每个日志流有自己的LSN顺序,且只能单向复制。GaussDB透明读写支持每个PDB有独立的日志流,且每个PDB都是可插拔的,因为日志和数据都是独立的,因此能够实现基于PDB的两个集群的双向复制,资源利用率更高,而且两个集群可以非对称部署,能够独立弹性扩容和缩容。

03 弹性突破

基于分层解耦和细粒度PD Bucket迁移实现秒级在线弹性扩展

池化的架构计算层、内存层、存储层都可以分层独立弹性扩展——计算层下沉到存储节点的状态是解耦的,因此计算层能够秒级弹性扩展;内存层扩展只需要做内存状态的迁移,也能实现秒级弹性扩展;而存储层扩容添加存储节点会动态更新存储节点的元数据,文件本身会自动分配到新的节点上。

两级多租户,提高资源利用率

很多情况下,物理集群的资源利用率未必可以用满,因此需要多租户能力来提高资源利用率。GaussDB透明多写架构支持两级多租——基础设施级多租和Database级多租,这种方式提供了灵活的资源配置策略,多个租户可以共享物理资源,同时租户进程故障可以完全隔离,从而提高了资源利用率。

总结

GaussDB池化架构透明多写架构实现了性能、可用性、弹性的三重突破。

在高性能方面,分布式缓存池基于PO和RE机制降低和避免了节点间的交互;基于去中心化Lamport时间戳降低了网络交互,同时解决了单点性能瓶颈;基于自动分区的空闲空间亲和性分配算法降低了节点间的冲突;并设计了IUD本地亲和的表锁和事务锁。

在高可用方面,磁盘内存双Checkpoint机制减少了日志的恢复量,基于邻居故障检测算法和按需恢复算法实现了RTO小于6秒;同时基于PDB级WAL多流实现了双集群非对称的双活容灾,每个集群可以根据负载独立弹性扩展计算、内存、存储资源。

在高弹性方面,基于分层解耦和细粒度PD Bucket迁移,实现了秒级在线分层弹性扩展;基于两级多租——基础设施级多租(共享物理资源)、数据库多租(共享数据库服务)显著提高了资源利用率。

精彩评论(0)

0 0 举报