Skip to content

polardb support acceptance report

jimin edited this page Dec 21, 2023 · 1 revision

Seata AT事务模式适配 PolarDB 数据库 - 结项报告

PR链接:#5907

PolarDB 2.0 的库表模式

PolarDB 分区模式

  • 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)进行建表。

关于两种分区模式的说明

  1. 从PolarDB-X 5.4.13(2.X)版本开始,新增支持AUTO模式的数据库(也称为自动分区数据库)。AUTO模式的数据库支持自动分区,即创建表时无需指定分区键,数据即可自动在集群内均匀分布;同时也支持使用标准的MySQL分区表语法,对表进行手动分区。可以让用户享受到分布式数据库的透明式分布、弹性伸缩和分区管理等功能。数据库的分区模式不可更改,创建数据库时一旦指定,不能变更。

  2. PolarDB-X 5.4.13 版本之前的数据库称为DRDS模式的数据库。这种模式的数据库不支持自动分区,创建表时需使用DRDS专用的分库分表语法,指定分库分表键,否则创建的是一张单表。

  3. AUTO模式数据库和DRDS模式数据库在5.4.13及以上版本都支持,并且可以共存在一个实例中。

建表样例

1. DRDS模式(HASH、UNI_HASH、RIGHT_SHIFT、RANGE_HASH等路由算法)

以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;

2. AUTO模式(HASH、KEY、RANGE、LIST等分区策略)

以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;

PolarDB 2.0适配

借助于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模式数据库的文档。

Clone this wiki locally