-
Notifications
You must be signed in to change notification settings - Fork 8.8k
polardb support acceptance report
PR链接:#5907
-
drds:DRDS模式
- 不支持自动分区;
- 分库分表的路由算法是HASH值按物理分表数目取模,如果要变更分区数目(例如分表数目由4个变成5个),所有数据都需要进行rehash,无法提供分区级的变更能力;
- 全库只能使用DRDS模式的CREATE TABLE(DRDS模式语法(如dbpartition by/tbpartition by)进行建表。
-
auto:AUTO模式
- 支持自动分区。不手动指定分区定义时,自动按主键分区,即创建表时不指定任何分区定义(如分区键、分区策略等),PolarDB-X能够自动选择分区键并对表及其索引进行水平分区的功能;
- 分区表的默认路由算法是基于range的一致性HASH算法,这种算法天然支持通过分裂、合并操作等变更分区,并且无须rehash所有数据,因此AUTO模式的分区表具备分区级的变更能力;
- 全库只能使用新的CREATE TABLE(AUTO模式)语法(如partition by hash/Range/List)进行建表。
-
从PolarDB-X 5.4.13(2.X)版本开始,新增支持AUTO模式的数据库(也称为自动分区数据库)。AUTO模式的数据库支持自动分区,即创建表时无需指定分区键,数据即可自动在集群内均匀分布;同时也支持使用标准的MySQL分区表语法,对表进行手动分区。可以让用户享受到分布式数据库的透明式分布、弹性伸缩和分区管理等功能。数据库的分区模式不可更改,创建数据库时一旦指定,不能变更。
-
PolarDB-X 5.4.13 版本之前的数据库称为DRDS模式的数据库。这种模式的数据库不支持自动分区,创建表时需使用DRDS专用的分库分表语法,指定分库分表键,否则创建的是一张单表。
-
AUTO模式数据库和DRDS模式数据库在5.4.13及以上版本都支持,并且可以共存在一个实例中。
以HASH算法为例,建一张表,既分库又分表,每个库含有3张物理表,分库拆分方式为按照ID列进行哈希,分表拆分方式为按照bid列进行哈希。您可以先根据ID列的值进行哈希运算,将表中数据分布在多个子库中,每个子库中的数据再根据bid列值的哈希运算结果分布在3个物理表中。
CREATE TABLE multi_db_multi_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
primary key(id)
) dbpartition by hash(id) tbpartition by hash(bid) tbpartitions 3;
以KEY分区为例,Key分区也是PolarDB-X的默认分区方式。 Key分区支持向量分区键。例如,用户想按用户名字name列与用户ID两个列作为分区键进行分区,预建分区数目可以指定为8,可以使用以下的语法建表:
CREATE TABLE key_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(name, id)
PARTITIONS 8;
借助于Seata在数据库适配上的扩展性,在AT模式中适配PolarDB数据库中的工作主要包括以下几个模块的扩展和修改:
- rm-datasource:数据类型判别
- sqlparser:SQL语法兼容性扩展
- rm-datasource:exec 执行器扩展
- rm-datasource:元数据缓存Key识别
- rm-datasource:undo log 生成的扩展
除必要的单测外,在PolarDB-X 2.0企业版上对不同分区算法、分区策略的库表,对现有支持的MySQL语法(Insert、(Multi)Update、(Multi)Delete、Select (For Update)、Insert On Duplicate Update、Update Join)进行了测试,在当前版本中,暂未发现适配性问题。待进一步调研DRDS模式下的方案,在非自动分区的情况下是否需要针对不同物理分表做相应Sharding和RM的抽象。
测试库表(以AUTO模式为例)
create database seata_order mode='auto' collate utf8mb4_general_ci;
use seata_order;
create table if not exists order_tbl
(
id int auto_increment
primary key,
user_id varchar(255) null,
commodity_code varchar(255) null,
count int default 0 null,
money int default 0 null
)
charset = utf8;
create table if not exists undo_log ...
create database seata_stock mode='auto' collate utf8mb4_general_ci;
use seata_stock;
create table stock_tbl
(
id int auto_increment
primary key,
commodity_code varchar(255) null,
count int default 0 null,
constraint commodity_code
unique (commodity_code)
)
charset = utf8;
create table undo_log ...
-
重构AT模式
-
结合对Seata AT模式的理解和适配OceanBase、PolarDB数据库的经验,在官网产出一篇关于如何适配AT模式数据库的文档。