TDSQL-C PostgreSQL(CynosDB) 内核解密-披荆斩棘,勇往直前的腾讯云数据库

| 导语 TDSQL-C PostgreSQL(CynosDB)是腾讯云数据库团队自研的新一代云原生数据库,融合了传统数据库、云计算与新硬件技术的优势,采用计算和存储分离的架构,100%兼容 PostgreSQL,高度兼容Oracle语法,提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务。本文旨在从数据库内核的角度揭秘TDSQL-C PostgreSQL的核心架构与关键技术。本文适合读者:腾讯云售后服务,TDSQL-C用户,TDSQL-C开发者,需要有基本的数据库与存储知识。

一、概述

      TDSQL-C采用计算和存储分离的架构,所有计算节点共享一份数据,存储容量高达128TB,单库最高可扩展至16节点,提供秒级的配置升降级、秒级的故障恢复和数据备份容灾服务。TDSQL-C既融合了商业数据库稳定可靠、高性能、可扩展的特征,又具有开源云数据库简单开放、自我迭代的优势。TDSQL-C不仅在性能、扩展性和高可用方面有大幅提升,计算存储的解耦使得计算层和存储层都获得了很大的独立优化空间,本文下面将介绍TDSQL-C架构的实现,以及在新架构上的关键技术优势。

二、TDSQL-C PostgreSQL(CynosDB) 架构

      Primary Instance是数据库的读写实例(RW),负责接收数据库的读写请求,Replica Instance是数据库的只读实例(RO),负责处理数据库的只读请求,目前可以支持扩展最多15个Replica实例。

CynosFileSystem是用户态分布式文件系统,主要提供分布式的文件管理,为CynosPG实例提供文件存储服务。CynosFS是专为云原生数据库而打造的分布式用户态文件系统,将传统分布式文件系统优势与云原生数据库相关特征进行融合,是TDSQL-C弹性扩展、海量存储、高性价比的基石。 CynosStoreAgent、 CynosStoreMeta、CynosStoreNode 构成分布式云存储系统CynosStore(一个支持日志的、提供多版本读的、分布式的块设备存储)。其中CynosStoreNode存储节点负责数据库的实际数据存储。同时CynosStore将日志实时同步到腾讯云冷存储(COS)上,用于基于时间点的数据备份与恢复服务。       Primary Instance和分布式存储之间传输的是日志流。Primary Instance将数据变更以日志的方式发送到CynosStore中,CynosStore会定期的将日志合并到数据页面上,因此无需将脏页写到存储中,这是与传统数据库很大不同的地方。Replica Instance没有写事务,因此,不会向CynosStore发送日志信息,但是会请求读取页面。Primary Instance也会将日志同步到Replica Instance中,Replica Instance会使用收到的日志更新内存中的数据页面,当Replica Instance切换成Primary Instance时,可以直接使用这些最新的页面对外提供服务,无需再次从CynosStore中读取页面。       TDSQL-C实现原理:日志即数据库。基于此实现的数据库系统专为云原生而打造。数据库的Primary Instance会产生日志,并保存到CynosStore中,因此我们从存储上,针对于每一个数据页面,均可以拿到基于日志回放的任何时间的页面版本。也就是说,CynosStore提供了一个基于页面的多版本存储系统,每一个版本都是基于一个或者多个MTR的回放(Mini-Transaction Record:多条日志的集合,用来保证数据库中的页面或者索引结构从一个“一致性”状态,到另一个“一致性状态”)。

1.计算层

      数据库引擎CynosPG基于PostgreSQL而来,PostgreSQL是世界上功能最强大最先进的开源数据库。经过长达30年以上的积极开发和不断演进,PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。CynosPG主要对PostgreSQL日志系统和存储系统进行改造,进行Oracle语法高度兼容,以及深度的内核性能及功能优化,对于PostgreSQL SQL引擎架构改动有限,因此CynosPG可以完全兼容PostgreSQL原生的功能。

      分布式用户态文件系统CynosFileSystem,为实例提供分布式的文件管理,负责将文件的读写请求翻译为对应的BLOCK读写,CynosFileSystem为实例提供Pool维度的存储访问,如上图所示。

      CynosStoreAgent为CynosFS提供SG维度的存储访问,提供SG的读写接口,对于读写请求有不同处理。 写请求:将修改日志通过LOG API发送到CynosStoreNode,读请求:直接通过BLOCK API读取CynosStoreNode数据。CynosStoreAgent 除了承担计算层与存储层的读写交互,也负责主备间日志流同步,对于CynosPG主备实例间只通过CynosStoreAgent进行交互。在工程实现上,由于现代多核和多插槽计算机对于跨核间的数据共享(atomic instruction、cache line bouncing、memory fences)代价非常大,CynosStoreAgent(无锁实现)工程实现上使用了创新的share-nothing编程异步框架,一种无需耗时锁定即可在 CPU 内核之间共享信息的设计,面向现代新硬件技术的优势实现了极致性能。

2.存储层

      CynosStoreNode以Segment为维度进行资源管理,Segment Group内3个Segment实际存储同一份数据,通过一致性协议(Raft)进行同步。CynosStoreNode负责Segment日志的处理、BLOCK数据的异步回放、读请求的页面多版本支持等。同时还负责将日志备份到Cold Backup Storage(COS),进行增量备份,根据增量备份,可以灵活的生成全量备份和差异备份。相比于传统的开源数据库,云原生数据库TDSQL-C计算层仍然包含传统内核的大部分组件(查询处理器、事务管理、锁、缓存实现以及MVCC),但有几个重要核心功能(redo日志记录、日志回放、持久存储、崩溃恢复和备份/恢复)均下沉到存储层。在工程实现上,CynosStoreNode(无锁实现)与CynosStoreAgent一样,使用了创新的share-nothing的编程异步框架,无共享模型的异步框架,结合现代新硬件技术,实现存储层的极致性能。

CynosStoreMeta负责CynosStore Service资源的分配和调度,采用一主两从架构,包括 Pool调度和 SG 调度、备份回档调度,以及维护Pool和SG的对应关系。 CynosStoreMeta两类调度一个是资源池Pool调度(自动扩缩容 Pool),一个是 SegmentGroup 调度(增减副本,leader切换,资源均衡等)。

三、TDSQL-C PostgreSQL(CynosDB) 技术优势

日志即数据库

      TDSQL-C 引入计算存储分离的设计,存储层使用共享的分布式存储,计算层则将传统数据库不必要的IO全部卸载,如上图所示写IO只有Redo日志流,Redo日志能表达数据库的所有状态,实现计算与存储基于日志传输的新数据库架构,真正实现了将 Redo LOG 下沉到存储层,将网络 IO 减少到最低

TDSQL-C计算层实现无状态,计算层本地数据文件将不复存在,仍然包含传统数据库内核的大部分组件:查询处理器、事务管理、锁、缓存实现以及MVCC多版本,移除了PostgreSQL中的FPW特性,脏页面刷盘操作

TDSQL-C存储层实现可计算智能存储,传统内核几个重要核心功能:Redo日志记录、日志回放、持久存储、崩溃恢复和备份/恢复,均下沉到存储层,由分布式存储系统自动管理数据的多副本,实现自动扩缩容,自动故障校验检测和修复,同时实现了存储页面多版本支持。

计算与存储分离,共享分布式存储

      采用计算与存储分离的设计理念,满足业务弹性扩展的需求。各计算节点通过用户态分布式文件系统(CynosFileSystem)共享底层的存储(CynosStore),极大降低了用户的存储成本

一写多读,读写分离

      TDSQL-C 采用多节点集群的架构,集群中有一个主节点(可读可写)和至少一个只读节点。当应用程序使用集群地址时,TDSQL-C通过内部的代理层对外提供服务,应用程序的请求都先经过代理,然后才访问到数据库节点。代理层不仅可以做安全认证和保护,还可以解析SQL,把写操作发送到主节点,把读操作均衡地分发到多个只读节点,实现自动的读写分离。对于应用程序来说,就像使用一个单点的数据库一样简单

完全兼容

TDSQL-C完全兼容PostgreSQL,高度兼容Oracle语法,代码/应用无需修改或只需少量修改,业务无需改造即可平滑迁移。同时TDSQL-C 会定期实现对PostgreSQL新版本的兼容性。可以使用PostgreSQL 导入/导出工具或者快照,将PostgreSQL 数据库轻松迁移到TDSQL-C。

极致性能

深度定制的数据库内核,超高性能,可以满足高并发高性能的场景,保证关键业务的连续性,并可进一步提供读写分离以及读写扩展性。如在CynosPG,CynosFileSystem大量使用的异步、流水线、批处理、Lock Free结构等等。

新硬件技术及零拷贝技术,减少操作系统上下文切换以及数据在用户态和内核态之间拷贝引起的性能损耗,进一步优化关键路径的系统性能。如RDMA、NVME、SPDK等等。

CynosStore在工程实现上真正做到了无锁实现,创新的使用了share-nothing编程异步框架,无锁实现即可在 CPU 内核之间共享信息的设计,面向现代新硬件技术的优势实现了极致性能。

海量存储

      最高128TB的海量存储,无服务器 Serverless 架构,自动扩缩容,自动故障检测修复,并按实际使用量计费,不用不计费,轻松应对业务数据量动态变化和持续增长。自动维护数据多个副本通过Parallel-Raft协议保证数据的一致性,保障数据安全可靠。同时不再需要因为单机容量的限制而去购买多个实例做分片,由此简化应用开发,降低运维负担。

秒级故障恢复、快速弹性变配、快速只读扩展

      计算节点实现了无状态,支持秒级的故障切换和恢复,即便计算节点所在的物理机宕机也可以在1分钟之内恢复。

      计算节点根据业务需要快速升降配,升降配不断连接,根据内存大小不同升降级时间最快可到秒级,实现计算资源的成本最优。

      计算节点根据业务需要快速添加只读节点,一个集群支持秒级添加删除1个 - 15个只读节点,快速应对业务峰值和变化场景。利用日志流LSN确保读取数据时的全局一致性,避免因为主备延迟引起的不一致。利用基于Redo的物理复制代替逻辑复制,提升主备复制的效率和稳定性

快照备份回档

基于数据多版本的秒级快照备份对用户的数据进行连续备份保护,免去主从架构备份回档数据的同步和搬迁,最高以GB/秒的速度极速并行回档,保证业务数据迅速恢复。整个备份回档流程无锁实现,对实例存储无任何影响

四、总结

TDSQL-C性能上均优于其他竞品,性能数倍于社区原生PostgreSQL。由于篇幅有限,具体实现细节并没有详细地阐述,本文主要全局的介绍了TDSQL-C核心架构与关键技术,后续文章会详细揭秘TDSQL-C各个内核组件具体实现细节。腾讯云数据库团队也在不断的探索更多的功能与优化,如在执行器优化器探索,向量化执行引擎,XRDMA更低延迟IO栈,MTCP面向多核的用户态网络协议栈,DB语义下推与异构计算加速,FPGA存储引擎加速,Hybrid Storage(Optane/DRAM/AEP/ScaleFlux)等等软硬一体化融合工作,去追求更佳的功能性能以及用户体验,后续我们也会尽量给大家分享这些细节的进展与实现。如果在使用TDSQL-C中遇到疑惑,不要犹豫请立刻联系我们,我们会努力地为大家答疑,感谢对TDSQL-C的支持。

更多细节请参考: 计算层《TDSQL-C PostgreSQL(CynosDB) 内核实现剖析一》 存储层《TDSQL-C PostgreSQL(CynosDB) 内核实现剖析二

五、相关概念

Segment(Seg):Storage Service管理数据BLOCK和日志的最小单元(10GB),也是数据复制的实体。图中同样颜色的3个Segment实际存储同一份数据,通过一致性协议(Raft)进行同步,我们叫做Segment Group(SG)。

Pool:多个Segment Group(SG)从逻辑上构成一个连续的存储数据BLOCK的块设备,供上层的CynosFileSystem分配使用。Pool和Segment是一对多的关系。