如何基于LSM-tree架构实现一写多读

本文介绍了PolarDB如何基于LSM-tree结构的存储引擎实现一写多读,对比了LSM-tree与B+tree在数据库引擎中的应用和挑战,详述了PolarDB(X-Engine)的物理复制架构、一致性读、DDL物理复制以及双引擎技术,展示了在性能测试中与RDS和InnoDB的性能差异,并展望了未来的发展方向。
摘要由CSDN通过智能技术生成

简介:传统MySQL基于binlog复制的主备架构有它的局限性,包括存储空间有限,备份恢复慢,主备复制延迟等问题,为了解决用户对于云上RDS(X-Engine)大容量存储,以及弹性伸缩的诉求,PolarDB推出了历史库(基于X-Engine引擎的一写多读)产品,支持物理复制,提供一写多读的能力,目前已经在阿里云官网售卖。本文主要阐述如何基于LSM-tree结构的存储引擎实现数据库的一写多读能力。

一 前言

PolarDB是阿里巴巴自研的新一代云原生关系型数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性、海量存储、高性能、低成本的数据库服务。X-Engine是阿里巴巴自研的新一代存储引擎,作为AliSQL的核心引擎之一已广泛用于阿里巴巴集团核心业务,包括交易历史库,钉钉历史库,图片空间等。X-Engine基于LSM-tree架构,其核心特征是数据以追加写方式写入,高压缩低成本,适用于写多读少,有低成本诉求的业务场景。传统MySQL基于binlog复制的主备架构有它的局限性,包括存储空间有限,备份恢复慢,主备复制延迟等问题,为了解决用户对于云上RDS(X-Engine)大容量存储,以及弹性伸缩的诉求,PolarDB推出了历史库(基于X-Engine引擎的一写多读)产品,支持物理复制,提供一写多读的能力,目前已经在阿里云官网售卖。本文主要阐述如何基于LSM-tree结构的存储引擎实现数据库的一写多读能力。

二 LSM-tree数据库引擎

LSM-Tree全称是Log Structured Merge Tree,是一种分层,有序,面向磁盘设计的数据结构,其核心思想是利用磁盘批量的顺序写要比随机写性能高的特点,将所有更新操作都转化为追加写方式,提升写入吞吐。LSM-tree类的存储引擎最早源于Google三驾马车之一的BigTable的存储引擎以及它的开源实现LevelDB。LSM-tree存储引擎有几个特点,首先增量数据像日志一样,通过追加方式写入,顺序落盘;其次,数据按照key来进行有序组织,这样在内存和磁盘中会形成一颗颗小的“有序树”;最后,各个“有序树”可以进行归并,将内存中的增量数据迁移到磁盘上,磁盘上的多个“有序树”可以进行归并,优化树的形状,整个LSM-tree是一个有序的索引组织结构。

在云原生数据库时代,一写多读技术已被广泛应用于生产环境中,主要云产商都有其标杆产品,典型代表包括亚马逊的Aurora,阿里云的PolarDB以及微软云的Socrates。它的核心思想是计算存储分离,将有状态的数据和日志下推到分布式存储,计算节点无状态,多个计算节点共享一份数据,数据库可以低成本快速扩展读性能。Aurora是这个领域的开山鼻祖,实现了业内第一个一写多读的数据库,计算节点Scale up,存储节点Scale out,并将日志模块下推到存储层,计算节点之间,计算与存储节点之间传输redo日志,计算节点基于Quorum协议写多副本保证可靠性,存储层提供多版本页服务。PolarDB与Aurora类似,也采用了存储计算分离架构,与Aurora相比,PolarDB它自己的特色,存储基座是一个通用的分布式文件系统,大量采用OS-bypass和zero-copy技术,存储的多副本一致性由ParallelRaft协议保证。PolarDB计算节点与存储节点同时传输数据页和redo日志,计算节点与计算节点之间只传递位点信息。与Aurora的“日志即数据库”理念一样,Socrates的节点之间只传输redo日志,也实现了多版本页服务,它的特点是将数据库存储层的持久性与可用性分开,抽象出一套日志服务。整个数据库分为3层,一层计算服务,一层page server服务和一层日志服务,这样设计的好处是可以分层进行优化,提供更灵活和细粒度的控制。

虽然Aurora,PolarDB和Socrates在设计上各有特点,但它们都共同践行了存储计算分离思想,数据库层面提供一写多读的能力。深入到存储引擎这一层来说,这几个产品都是基于B+tree的存储引擎,如果基于LSM-tree存储引擎来做呢?LSM-tree有它自己的特点,追加顺序写,数据分层存储,磁盘上数据块只读更有利于压缩。X-Engine引擎云上产品RDS(X-Engine)已经充分发挥了LSM-tree高压缩低成本特点,同样的数据量,存储空间只占到RDS(InnoDB)的1/3甚至更少,RDS(X-Engine)传统的主备架构,依然面临着主备复制延迟大,备份恢复慢等问题。基于LSM-tree引擎实现一写多读,不仅计算资源和存储资源解耦,多个节点共享一份数据还能进一步压缩存储成本。

基于LSM-tree引擎实现一写多读面临着与B+tree引擎不一样的技术挑战,首先是存储引擎日志不一样,LSM-tree引擎是双日志流,需要解决双日志流的物理复制问题;其次是数据组织方式不一样,LSM-tree引擎采用分层存储,追加写入新数据,需要解决多个计算节点一致性物理快照以及Compation问题。最后,作为数据库引擎,还需要解决一写多读模式下DDL的物理复制问题。同时,为了产品化,充分发挥B+tree引擎和LSM-tree引擎的各自优势,还面临着新的挑战,即如何在一个数据库产品中同时实现两个存储引擎(InnoDB,X-Engine)的一写多读。

三 LSM-tree引擎一写多读的关键技术

1 PolarDB整体架构

PolarDB支持X-Engine引擎后,X-Engine引擎与InnoDB引擎仍然独立存在。两个引擎各自接收写入请求,数据和日志均存储在底层的分布式存储上,其中idb文件表示的是InnoDB的数据文件,sst文件表示的是X-Engine的数据文件。这里最主要的点在于InnoDB与XEngine共享一份redo日志,X-Engine写入时,将wal日志嵌入到InnoDB的redo中,Replica节点和Standby节点在解析redo日志后,分发给InnoDB引擎和XEngine引擎分别回放进行同步。

PolarDB(X-Engine)架构图

X-Engine引擎架构

X-Engine引擎采用LSM-tree结构,数据以追加写的方式写入内存,并周期性物化到磁盘上,内存中数据以memtable形式存在,包括一个活跃的active memtable和多个静态的immutable。磁盘上数据分层存储,总共包括3层,L0,L1和L2,每一层数据按块有序组织。X-Engine最小空间分配单位是一个extent,默认是2M,每个extent包含若干个block,默认是16k。数据记录紧凑存储在block中,由于追加写特点,磁盘上的数据块都是只读的,因此X-Engine引擎可以默认对block进行压缩ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值