| 导语 TDSQL-C PostgreSQL(CynosDB)是腾讯云数据库团队自研的新一代云原生数据库,融合了传统数据库、云计算与新硬件技术的优势,采用计算和存储分离的架构,100%兼容 PostgreSQL,高度兼容Oracle语法,提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务。本文旨在从数据库内核的角度揭秘TDSQL-C PostgreSQL存储层的技术内幕。本文适合读者:腾讯云售后服务,TDSQL-C用户,TDSQL-C开发者,需要有基本的数据库与存储知识。
一、概述
TDSQL-C采用计算和存储分离的架构,所有计算节点共享一份数据,存储容量高达128TB,单库最高可扩展至16节点,提供秒级的配置升降级、秒级的故障恢复和数据备份容灾服务。TDSQL-C既融合了商业数据库稳定可靠、高性能、可扩展的特征,又具有开源云数据库简单开放、自我迭代的优势。《TDSQL-C PostgreSQL(CynosDB) 内核解密》文章已总体介绍了TDSQL-C核心架构与关键技术,本文下面将介绍TDSQL-C 存储层内核实现细节。
二、CynosStoreNode 存储实现
CynosStoreNode负责Segment日志的处理、BLOCK数据的异步回放、读请求的页面多版本支持等,同时还负责将日志备份到Cold Backup Storage(COS),进行增量备份,根据增量备份,可以灵活的生成全量备份和差异备份。CynosStoreNode以Segment为维度进行资源管理,Segment Group内3个Segment实际存储同一份数据,通过一致性协议(Raft)进行同步。Pool、SG、BLOCK映射关系如图所示下,Segment对应为一个spdk_file文件(10GB)。
相比于传统的开源数据库以及其他云数据库,云原生数据库TDSQL-C计算层仍然包含传统内核的大部分组件(查询处理器、事务管理、锁、缓存实现以及MVCC),但有几个重要核心功能(redo日志记录、日志回放、持久存储、崩溃恢复和备份/恢复)均下沉到CynosStore存储层。在工程实现上,CynosStoreNode(无锁实现)与CynosStoreAgent的设计理念与目标是一样,使用了创新的share-nothing的编程异步框架,无共享模型的异步框架,结合现代新硬件技术,实现存储层的极致性能。
Write Log
1) 存储节点接收日志记录并添加到内存队列 2) Write Server写日志到落盘,并行发起RAFT日志复制 3) Leader及Follower日志落盘成功,Follower成功后向主发送ACK确认 4) RAFT多数派提交成功,返回StoreAgent写日志成功 5) 异步的将日志记录挂载到对应数据BLOCK的更新链上,会对更新的数据BLOCK形成1个更新链,从而支持数据BLOCK多个版本,提供数据页面多版本访问(注意:与CynosPG 页面内的MVCC多版本不同) 6) 异步的将日志备份到冷备系统腾讯云COS
TDSQL-C将页面CRC操作由计算层下放到了StoreNode存储中,充分利用存储服务器的CPU资源。同时StoreAgent下发的MRPL会合并更新链中的日志记录到数据基页BLOCK,以及GC回收无用日志。BLOCK页面由基页 日志链构成,实现存储页面多版本。
Read Page
1) 存储节点Leader接收读Page(BLOCK)请求 2) Read Server根据请求的Page(BLOCK)及对应访问LSN号去DATA PAGE查找,基于基页合并日志返回请求页面或者直接返回基页 3) 返回StoreAgent请求Page(BLOCK)
备份回档
CynosStoreNode还包含了StoreLearner/StoreReplayer/StoreUploader三个组件,主要功能如下: StoreLearner:负责持续接收StoreNode Leader发过来log写入本地,在log流中断场景,StoreNode Leader重新add learner segment做完snapshot后,通知StoreUploader将log或snapshot上传到COS上。
StoreReplayer:负责备份/回档,接受CynosStoreMeta发过来备份/回档命令,请求StoreUploader从COS上下载log和snapshot文件,然后进行log应用,做完备份/回档完毕后,告诉CynosStoreMeta最终结果。
StoreUploader:负责持续备份log和snapshot文件上传到COS上和下载log和snapshot用于生成备份和回档新的实例。
通过以上功能组件的协调配合,基于CynosStore数据页面多版本的秒级快照备份对用户的数据进行连续备份保护,免去主从架构备份回档数据的同步和搬迁,最高以GB/秒的速度极速并行回档,保证业务数据迅速恢复。整个备份回档组件仍然采用share-nothing无锁实现,对实例存储无任何影响。
三、CynosStoreMeta 存储元数据服务
CynosStoreMeta负责CynosStore Service资源的分配和调度,采用一主两从架构,包括 Pool调度和SG调度,以及维护Pool和SG的对应关系。 CynosStoreMeta两类调度一个是资源池Pool调度(自动扩缩容 Pool),另一个是SegmentGroup调度(增减副本,leader切换,资源均衡等)。
CynosStoreMeta核心功能如图所示:
1) SN(CynosStoreNode)注册到SCM(Storage Cluster Manager),SN的物理布局信息通过标签组labels(每个标签label采用key-value键值对表示)进行定义,标签名依次是Region->Zone->Rack->Host,标签值是具体部署的物理信息,如北京->北京一区->rack_01->host_01。一个SN负责处理一个NVME设备上的数据读写。 2) DCM(管控DB Cluster Manager)开始创建Pool,SCM接收到创建操作后,保存该Pool的元数据信息到ETCD上,然后把该Pool加入到内部调度队列。 3) Pool调度器:定期从调度队列上获取各个Pool来调度,调度包括Pool的初始化(分配第一个SG),根据Pool状态及使用情况进行扩缩容,以及Pool的销毁。 4) SG调度器:每个Pool下对应一个SG调度器,负责该Pool内所有SG的调度,包括SG的初始化,增减副本,SG内leader切换,迁移等,通过装箱算法选择最佳Storage Node作为该SG的成员以及整个存储资源的调度。 5) CynosFS通过CynosStoreAgent会定期同步SG的使用情况,Pool信息到SCM,并从SCM获取该Pool的所有SG信息以及SG的变更情况(如SG内leader切换)。
元数据管理详细内容见《TDSQL-C PostgreSQL(CynosDB) 元数据管理》文章介绍分析。
备份回档调度也由CynosStoreMeta控制:
1) SG添加 Learner,并记录Pool 和 SG 创建和销毁事件到 CDB 2) 增加备份和回收调度:根据备份策略进行快照备份和回收 3) 增加回档调度
备份功能:增加全局备份调度状态,每日备份调度信息(调度时间,备份加载情况,执行情况等)。
回档功能:1.管控发起回档任务,StoreMeta生成Pool的回档任务并保存到CDB, 返回该回档任务的ID给管控供后续查询回档进度; 2. 生成该回档时间的快照; 3.根据快照回档出新的Pool。
回收功能:增加全局回收调度状态,每日回收调度信息(最新回收时间),其过程与备份类似。
备份回档详细内容见《TDSQL-C PostgreSQL(CynosDB) 备份回档》文章介绍分析。
四、总结
本文从内核开发的角度介绍云原生数据库TDSQL-C存储层CynosStoreNode、CynosStoreMeta实现核心原理,后续文章内核团队会由点及面的分享存储层的各个技术点细节。
广告时间:TDSQL-C PG数据库团队广招天下英才,这里拥有全球顶尖的数据库专家,汇集了一批极具极客精神的数据库爱好者,团队不断的吸收业界最新的理论和工程成果,最新的硬件和软件技术,将其应用到自研系统中,设计和实现高性能新一代云数据库,TDSQL-C PG还有很长的路要走,如果你也对数据库领域技术感兴趣,欢迎加入我们,让我们一起见证TDSQL-C PG 攀登世界的顶峰。
参考资料: 1. 源代码库:《CynosStore源码》、《CynosStoreMeta源码》 3. 《腾讯云CSIG数据库产品中心PG内核团队WIKI》