深度|带领国产数据库走向世界,POLARDB底层逻辑是什么?

  
     POLARDB是阿里云自主研发的下一代云原生分布式数据库,100%兼容MySQL、PostgreSQL等开源数据库,高度兼容甲骨文语法,使用RDS服务的客户不需要修改应用代码,可以一键迁移到POLARDB,体验更大的容量,更高的性能,更低的成本,和更灵活的弹性。      目前,POLARDB是阿里云增速最快的数据库产品,广泛应用于互联网金融,政府便民工程,新零售,教育,游戏,社交直播等行业。      作为基于计算与存储分离架构的新一代云原生数据库,POLARDB的计算节点里主要实现了SQL解析和优化,以及查询并行执行与无锁高性能事务处理,计算节点之间通过高吞吐的物理复制协议同步内存状态。      而存储层基于分布式文件系统PolarFS,通过平行筏共识算法实现多数据副本间的强一致性,在存储层进行存储引擎的多版本页管理来支持全集群跨计算节点的快照隔离隔离级别。      01基于计算与存储分离的先进架构      计算节点与存储节点之间通过理解数据库语义的智能互联协议将过滤器和投影等算子从计算层下推到存储层执行。为了保证事务和查询语句的低延迟,同时降低计算节点之间状态同步的延迟,计算节点和存储节点之间使用25 gb高速RDMA网络互联,采用旁路内核的用户态网络协议层进行通讯。      基于计算与存储分离的先进架构,POLARDB可以从1个计算节点(2个CPU核)弹性伸缩到16个计算节点(最高达到1000核)的事务扩展能力,单实例存储容量从10 gb按使用量弹性扩展到100年结核病。         
     计算节点与存储节点分离的架构设计给POLARDB带来了实时的水平扩展能力。由于单个数据库实例的计算能力有限,传统的做法是通过搭建多个数据库副本来分担压力,从而提供数据库向外扩展的扩展能力。      然而,这种做法需要存储多份全量数据,并且频繁同步日志数据造成了过高的网络开销。此外,在传统数据库集群上,增加副本需要同步所有增量数据,这带来了同步延迟上涨的问题。      POLARDB将数据库文件以及重做日志等日志文件存放在共享存储设备上,确保主实例和所有副本共享同一份全量数据和增量日志数据。节点间只需要同步内存里的元数据信息,通过MVCC机制的保证,就能支持跨节点读取数据的一致性,非常巧妙地解决了主实例和副本之间的数据同步问题,大大节约了跨节点的网络开销,降低副本间的同步延迟。      02年提升事务性能POLARDB内核层面优化揭秘      为了提高事务性能,POLARDB在内核层面进行了大量优化。把一系列性能瓶颈用无锁(无锁的)算法以及各种并行优化算法进行改造,减少甚至消除各种锁之间的相互冲突,大大增加了系统的可伸缩性能力。      同时,我们依托处理双十一这种大规模高并发场景下的经验,在POLARDB上实现了对库存等热点数据进行优化的功能,对于简单重复的查询,POLARDB支持直接从存储引擎获取结果,从而减少了优化器及执行器的开销。      此外,进一步优化已经高效的物理复制。比如,我们在重做日志加了一些元数据,以减少日志解析CPU开销。这个简单优化减少了60%日志解析时间。我们也重用一些数据结构,以减少内存分配器的开销。      POLARDB运用了一系列算法来优化日志应用,比如只有在缓冲池中的数据页面才需要日志应用。同时我们也优化了页面清洁,双写缓冲区,大大减少这些工作的成本。这一系列优化使得在性能上POLARDB远超MySQL在sysbencholtp_insert等大量并发写入的基准评测中达到最高6倍于MySQL的性能。      03支持并行查询(并行查询)      为了提高子查询和加入等复杂查询(例如tpc - h基准评测)的能力,POLARDB的查询处理器支持并行查询(并行查询),可以将一个查询同时在多个或所有可用CPU核上进行执行。并行查询能够将一个查询任务(当前只支持选择语句)划分为多个子任务,多个子任务可以并行进行处理,整体采用Leader-Worker的并发模型。      领袖线程负责生成并行查询计划,协调并行执行过程的其他组件,并行执行计划会包括并行扫描,多表并行连接,并行排序,并行分组,并行聚集等子动作。      消息队列是领袖线程和工人线程的通讯层,工人线程通过消息队列向领袖线程发送数据,而领袖线程也会通过消息队列向工人线程发送控制信息。      工人线程负责真正的执行任务.Leader线程解析查询语句生成并行计划,然后同时启动多个工人线程进行并行任务处理,为了高效的执行查询,工人上的执行不需要进行再次优化,而是直接从领袖上来拷贝生成好的计划分片。这需要实现执行计划树上所有节点的拷贝。      工人线程在进行扫描,聚集,排序等操作后将中间结果集返回给领导,领导负责收集来自工人的所有数据集,然后进行适当的二次处理(比如归并排序,二次group by等操作),最后将最终结果返回给客户端。         

深度|带领国产数据库走向世界,POLARDB底层逻辑是什么?