本文介绍了PolarDB-X的主要技术原理。
分布式线性扩展
PolarDB-X将数据表以水平分区的方式,分布在多个存储节点(DN)中。数据分区方式由分区函数决定,PolarDB-X支持哈希(Hash)、范围(Range)等常用的分区函数。
以下图为例,shop库中的orders表根据每行数据的ID属性的哈希,被分区水平切分成orders_00~orders_11共计12个分区,均匀分布在4个数据节点上。对于用户来说,通常无需关心具体的数据分布,PolarDB-X的分布式SQL层将会自动完成查询路由、结果合并等。
扩容迁移
随着业务的增长,数据量越来越大,往往需要添加更多的数据节点以承载更多的数据。当新的数据节点加入实例时,PolarDB-X将自动触发扩容任务,将数据进行再平衡(Rebalance)。
以下图为例,orders表原本分布在4个数据节点上。用户进行扩容后,实例的数据节点数量从4个增加到6 个,触发PolarDB-X的再平衡任务,将部分数据分区从旧节点移动到新节点上。这一过程在后台利用空闲资源完成,对业务线上流量无影响。
高可用与容灾
在生产环境部署数据库时往往会搭建多个副本(Replica),保证数据库实例的高可用性以及数据的持久性。为了保证副本间的强一致性,现代数据库往往采用以Paxos算法为代表的多数派复制协议,它要求实例中至少存在3个节点,每次写入都要获得超过半数节点的确认,即便其中1个节点宕机实例也仍然能正常提供服务。PolarDB-X采用X-Paxos复制协议,X-Paxos是阿里巴巴自研的Paxos协议实现,在功能、性能上都做了大量优化,且经历了数十载的双十一考验,稳定可靠。
基于Paxos复制协议,PolarDB-X可以部署到多个机房中,以实现机房级容灾。常见的部署方式有同城三机房、两地三中心等,其中后者主要应用在混合云部署中。由于Paxos协议的特性,通常三个机房中有一个主机房负责对外提供服务。
分布式事务
PolarDB-X原生支持分布式事务,并保证事务的ACID性质——原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
PolarDB-X通过引入中心授时节点(TSO),结合多版本并发控制(MVCC),保证读取到的一定是一致的快照,而不会读到转账事务的中间状态。如下图所示,提交事务时,计算节点(CN)执行事务时从TSO 获取到时间戳,随着数据一同提交到存储节点 (DN)多版本存储引擎上。读取时,如果查询操作的数据涉及多个分区,PolarDB-X首先会获取全局时钟作为读取版本,对每行数据的MVCC多版本进行可见性判断,确保读到全局一致的数据版本。
分布式事务也是许多分布式特性的基础,例如:对于读写分离,数据的事务多版本信息也会被同步到 Learner副本,保证读只读实例不会因为同步延迟读到过期数据;Binlog日志服务中,通过时间戳保证分布式事务顺序;任意时间点的数据恢复(PITR,point-in-time recovery)中,利用分布式事务时间戳,能够精准找到相应时间的、全局一致的数据版本。
集中式与分布式一体化
PolarDB-X支持集中式和分布式一体化架构,简称集分一体化。
面相集分一体化架构,PolarDB-X兼具分布式数据库的扩展性和集中式数据库的功能和单机性能,两种形态可以无缝切换。在集分一体化数据库中,数据节点被独立出来作为集中式形态,完全兼容单机数据库形态。当业务增长到需要分布式扩展的时候,架构会原地升级成分布式形态,分布式组件无缝对接到原有的数据节点上进行扩展,不需要数据迁移,也不需要应用侧做改造。
适配集分一体化,PolarDB-X的产品主售形态主要分为标准版(集中式形态)和企业版(分布式形态),支持标准版原地升级分布式。
HTAP一体化
PolarDB-X是一款支持 HTAP (Hybrid Transaction/Analytical Processing) 的数据库:在支持高并发、事务性请求的同时,也对分析型的复杂查询提供了良好的支持。分析型查询指的是涉及数据量较大、计算比较复杂的查询,例如对一定时间区间内的数据进行聚合。相比于业务中常见的简单查询,这类查询往往要执行数秒甚至数分钟,需要消耗较多的计算资源。
为了加速复杂分析型查询,PolarDB-X引入列存索引的技术,结合向量化算子提供更好的分析加速能力。
MySQL生态兼容
PolarDB-X将兼容MySQL以及周边生态作为核心设计目标之一。本文从SQL语法、事务行为、导入导出等角度总结了兼容性相关特性,详细内容请参见MySQL兼容性。
PolarDB-X通讯协议兼容MySQL协议,可以使用常见的MySQL客户端直接连接到PolarDB-X实例,包括 JDBC Driver、ODBC Driver、Golang Driver等。兼容MySQL SSL、Prepare、Load等传输协议。
PolarDB-X兼容MySQL的各种DML、DAL、DDL语法,包括:
兼容绝大部分MySQL函数(包括JSON函数、加密解密函数等)。
兼容MySQL 8.0的视图、CTE、窗口函数、分析函数等。
支持MySQL的各种数据类型,包括支持类型精度(比如时间戳、Decimal 类型)。
兼容常见的MySQL字符串Charset及Collation。
兼容绝大部分information_schema视图。
另外,PolarDB-X兼容 MySQL binlog 复制协议。用户可以将PolarDB-X集群看作一个普通的MySQL 节点,将其他MySQL节点作为PolarDB-X的同步源端或目标端。PolarDB-X的binlog格式和MySQL原生格式一致,因此也可以用于CDC场景,例如利用canal等将PolarDB-X的写入数据同步到其他存储中。