GaussDB架构介绍(四)从云原生关键技术架构&关键技术方案两方面对GaussDB云原生架构进行了解读,本篇将从关键技术方案的事务存储组件、SQL引擎组件、DCS组件、实时分析组件等方面继续介绍GaussDB云原生架构。
目录
4、本地缓存远程页面地址,页面地址共享,全RDMA/UB单边读写。
事务存储组件
云原生数据库支持透明多写,所有节点对等,每个计算节点都可以读写全部的数据页面,事务在本节点执行,没有分布式事务。每个计算节点都有Local buffer pool,采用Remote memory pool扩展计算节点的内存,在多个计算节点之间共享buffer地址,避免页面在多个计算节点之间传来传去。存储引擎采用Inplace update引擎,底层存储接口统一采用段页式存储方式。事务ID本节点分配,保证唯一性。事务提交时间戳统一分配,合并原来的CLOG和CSN LOG统一记录。存储层采用Log is data,把数据库存储引擎的持久化卸载到Page Store执行日志持久化,日志回放修改页面,创建检查点。
图1 分布式缓冲池示意图
在计算节点,分布式缓冲池位于数据访问层和分布式存储层的中间,所有的数据访问都要经过缓冲池。分布式缓冲池需要保证页面数据的一致性和页面查找访问的高效性,是云原生数据库实现透明多写,内存资源弹性的关键模块。具体设计如下:
1、本地内存和远程内存两级缓存
本地内存和远程内存的读写时延差别非常大(30~100ns 和 800ns~5us的区别), 哪些页面在本地缓存,哪些页面在远程缓存非常关键。同时还有一个重要的因素需要考虑,那就是页面是否在多个计算节点被读写,因此云原生数据库把页面分为三大类,一类是页面在多个计算节点被读写(Heap页面,FSM页面),适合存放在远程内存里,页面地址共享;一类是页面大概率被读,几乎不被修改或者极低概率被修改(索引的非叶子页面,系统表的页面)适合存放在本地内存;另外一类是页面只在固定的单节点被读写,(智能路由优化后索引的叶子节点页面),适合存放在本地内存。
理想的页面分布情况如下图所示:
图2 理想页面分布示意图
2、页面查找机制
每个页面缓存对应一个元信息,称为page directory(PD),它描述了页面的最新版本在哪个节点,也就是page owner node(PON),页面是否是共享的远程页面地址,以及远程页面地址。PD 也是分布在各个计算节点上,每个计算节点管理一部分PD, 采用一致性Hash的方法管理PD。
图3 页面查找示意图
索引页面按照Range自动汇聚算法,根据SQL访问把相关页面汇聚到一个节点,提高索引访问的本地内存的亲和性。
索引的叶子节点本身就是从左到右按照索引key的大小顺序存放的,因此很容易根据索引的叶子节点自动划分Range,SQL优化器的路由模块按照Range路由就可以让索引页面按照Range汇聚到SQL节点的本地缓存里实现亲和性访问。针对多个索引的多个Range的亲和性场景,优先选择主键作为亲和性的Range路由。
3、支持远程内存池, 内存独立扩展。
云原生数据库在云上支持各种业务负载,CPU、MEM和Storage的配比很难一开始就配置合适,有的是计算密集型的业务,有的是内存密集型的业务,有的是存储容量大的业务。针对各类业务场景,云原生数据库需要提供精细的各种资源的独立扩展能力。支持远程内存池,实现了集群物理内存独立扩展。内存池是可选服务,也可以跟计算节点合部署。