免费体验PolarDB-X透明分布式

本文介绍了如何免费体验PolarDB-X的透明分布式特性。

背景

PolarDB-X推出"透明分布式"系列能力,从连接、开发到管理行为均最大限度保留单机MySQL的使用体验,让用户的分布式改造周期大幅缩短,研发运维团队的原有技术栈最大限度保留。

PolarDB-X具备从单机到分布式的平滑演进能力,支持通过DDL将一张大表动态调整为分布式的分区表,结合分布式事务、以及兼容MySQL Binlog的数据回流,可完成单机到分布式的快速改造。本体验从PolarDB-X的Auto Partition,以及兼容MySQL Binlog的CDC能力两个方面演示透明分布式能力。

  • 基于自动化拆分和分布式Online DDL,保证单机MySQL平滑演进到分布式

  • 引入全局Binlog回流单机MySQL,确保分布式可上可下

阿里云提供了数据库解决方案功能体验馆,提供真实免费的PolarDB分布式版实例环境和开箱即用的测试方法,您可以在线快捷体验PolarDB-X的透明分布式能力。

影响

本功能体验不涉及生产环境的部署,因此不会影响业务。

费用

本次体验中,由于体验涉及到的资源不归属于您,因此不会产生任何费用,您可以放心体验。

体验内容

体验环境

在本免费体验中,阿里云提供了预置环境供您操作体验,预置环境的详情如下:

  • 集群:提供了一个PolarDB-X实例。具体如下:

    • 内核版本:V5.4.18-17034692

    • 计算节点规格:4核16GB

    • 计算节点数量:2个

    • 存储节点规格:4核16GB

    • 存储节点数量:2个

    • 兼容性:MySQL 5.7

  • 提供了一台安装了Sysbench压测工具的压测机,向PolarDB-X实例运行压测任务。压测细节如下:

    • 测试模式:oltp_point_select_k,即对k字段进行仅含分区键的单点等值查询

      说明

      本体验中用到的Sysbench压测模式相比标准oltp_point_select模式进行了一定调整:标准oltp_point_select模式为对ID字段进行点查,而oltp_point_select_k模式则是对k字段进行点查。

    • 压测数据表大小:1张表,每张表10000条数据

    • 压测并发线程数:4线程

    • 压测持续时间:一共1分钟

观测指标

  • 观测表的物理分布,可以按主键进行拆分。

  • 观测改变分区键后与使用主键进行分区的性能对比。指标为TPS(Transactions Per Second),即数据库每秒执行的事务数,以COMMIT成功次数为准。该指标可用于观测集群性能。

  • 观测CDC后的数据一致性。

操作步骤

  1. 进入瑶池解决方案体验馆

  2. 单击核心功能体验,然后单击透明分布式功能体验免费体验按钮,进入如下页面:

    image

  3. 单击页面下方创建免费体验任务按钮。

  4. 稍等片刻后,单击image.png刷新任务列表,可以看到您创建的体验任务已开始。

    image

  5. 单击查看详情,进入实时查询情况页面,并单击启动任务

    image

    说明

    请根据页面按钮提示,手动点击按钮执行每一步操作。若在倒计时结束时没有手动点击执行,则会自动执行对应操作。

  6. 首先我们来体验PolarDB-X的Auto Partitioning特性。

    1. 单击切换到压测库,切换到PolarDB-X主库mydb。

      use mydb;
    2. 单击查看压测表,自动执行如下命令,查看所用到的压测表sbtest1的建表语句。

      show create table sbtest1;

      返回结果如下:

      +---------+-----------------------------------------------------+
      | Table   | Create Table                                        |
      +---------+-----------------------------------------------------+
      | sbtest1 | CREATE TABLE `sbtest1` (
      	`id` int(11) NOT NULL AUTO_INCREMENT,
      	`k` int(11) NOT NULL DEFAULT '0',
      	`c` char(120) NOT NULL DEFAULT '',
      	`pad` char(60) NOT NULL DEFAULT '',
      	PRIMARY KEY (`id`)
      ) ENGINE = InnoDB AUTO_INCREMENT = 10001 DEFAULT CHARSET = utf8 |
      +---------+-----------------------------------------------------+
      1 row in set (0.01 sec)
    3. 单击查看物理DN,自动执行如下命令,查看表在存储节点的分布情况。

      show storage; 

      返回结果如下:

      +------------------------------+--------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
      | STORAGE_INST_ID              | LEADER_NODE        | IS_HEALTHY | INST_KIND | DB_COUNT | GROUP_COUNT | STATUS | DELETABLE | DELAY | ACTIVE |
      +------------------------------+--------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
      | pxc-xdb-m-hzrth7pjc07vyb5509 | 11.197.3.159:3406  | true       | META_DB   | 2        | 2           | 0      | false     | 1     | 10     |
      | pxc-xdb-s-hzrth7pjc07vyb3208 | 11.197.8.96:3247   | true       | MASTER    | 3        | 4           | 0      | false     | 0     | 10     |
      | pxc-xdb-s-hzrth7pjc07vyb44da | 10.127.205.70:3039 | true       | MASTER    | 3        | 3           | 0      | true      | 0     | 10     |
      +------------------------------+--------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
      3 rows in set (0.02 sec)
    4. 单击查看表的分布,自动执行如下命令:

      show topology from sbtest1; 

      返回结果如下:

      +------+-------------------+--------------------+----------------+-------------------+-------------+------------------------------+-------------------+
      | ID   | GROUP_NAME        | TABLE_NAME         | PARTITION_NAME | SUBPARTITION_NAME | PHY_DB_NAME | DN_ID                        | STORAGE_POOL_NAME |
      +------+-------------------+--------------------+----------------+-------------------+-------------+------------------------------+-------------------+
      |    0 | MYDB_P00000_GROUP | sbtest1_R8tg_00000 | p1             |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |    1 | MYDB_P00001_GROUP | sbtest1_R8tg_00001 | p2             |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      |    2 | MYDB_P00000_GROUP | sbtest1_R8tg_00002 | p3             |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |    3 | MYDB_P00001_GROUP | sbtest1_R8tg_00003 | p4             |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      |    4 | MYDB_P00000_GROUP | sbtest1_R8tg_00004 | p5             |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |    5 | MYDB_P00001_GROUP | sbtest1_R8tg_00005 | p6             |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      |    6 | MYDB_P00000_GROUP | sbtest1_R8tg_00006 | p7             |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |    7 | MYDB_P00001_GROUP | sbtest1_R8tg_00007 | p8             |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      |    8 | MYDB_P00000_GROUP | sbtest1_R8tg_00008 | p9             |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |    9 | MYDB_P00001_GROUP | sbtest1_R8tg_00009 | p10            |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      |   10 | MYDB_P00000_GROUP | sbtest1_R8tg_00010 | p11            |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |   11 | MYDB_P00001_GROUP | sbtest1_R8tg_00011 | p12            |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      |   12 | MYDB_P00000_GROUP | sbtest1_R8tg_00012 | p13            |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |   13 | MYDB_P00001_GROUP | sbtest1_R8tg_00013 | p14            |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      |   14 | MYDB_P00000_GROUP | sbtest1_R8tg_00014 | p15            |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |   15 | MYDB_P00001_GROUP | sbtest1_R8tg_00015 | p16            |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      +------+-------------------+--------------------+----------------+-------------------+-------------+------------------------------+-------------------+
      16 rows in set (0.00 sec)
    5. 单击查看压测表数据分布,自动执行如下命令:

      select TABLE_SCHEMA,TABLE_NAME,STORAGE_INST_ID,PHYSICAL_TABLE,PARTITION_NAME as p_name,TABLE_ROWS as row 
      from information_schema.TABLE_DETAIL 
      where table_schema='mydb' and table_name= 'sbtest1' ;

      返回结果如下:

      +--------------+------------+------------------------------+--------------------+--------+------+
      | TABLE_SCHEMA | TABLE_NAME | STORAGE_INST_ID              | PHYSICAL_TABLE     | p_name | row  |
      +--------------+------------+------------------------------+--------------------+--------+------+
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_MXlT_00000 | p1     |  610 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_MXlT_00001 | p2     |  632 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_MXlT_00002 | p3     |  680 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_MXlT_00003 | p4     |  686 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_MXlT_00004 | p5     |  576 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_MXlT_00005 | p6     |  682 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_MXlT_00006 | p7     |  627 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_MXlT_00007 | p8     |  609 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_MXlT_00008 | p9     |  633 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_MXlT_00009 | p10    |  632 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_MXlT_00010 | p11    |  593 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_MXlT_00011 | p12    |  606 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_MXlT_00012 | p13    |  586 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_MXlT_00013 | p14    |  598 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_MXlT_00014 | p15    |  609 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_MXlT_00015 | p16    |  641 |
      +--------------+------------+------------------------------+--------------------+--------+------+
      16 rows in set (0.02 sec)

      可以看到,表sbtest1的建表语句中,并未指定任何分区定义(如分区键、分区策略等)。但从其拓扑分布和数据分布可以看到,PolarDB-X能够自动选择分区键(默认为主键)并对表及其索引进行水平分区

  7. 单击启动压测,并等待30秒后进行后续操作。

  8. 启动压测后,我们来体验PolarDB-X在改变分区键前后的性能对比。

    1. 单击修改分区键,自动执行如下命令,将分区方式变更为k列:

      alter table sbtest1 partition by hash(k) partitions 8;
    2. 单击再次查看表的分布,自动执行如下命令:

      show topology from sbtest1; 

      返回结果如下:

      +------+-------------------+-------------------------+----------------+-------------------+-------------+------------------------------+-------------------+
      | ID   | GROUP_NAME        | TABLE_NAME              | PARTITION_NAME | SUBPARTITION_NAME | PHY_DB_NAME | DN_ID                        | STORAGE_POOL_NAME |
      +------+-------------------+-------------------------+----------------+-------------------+-------------+------------------------------+-------------------+
      |    0 | MYDB_P00000_GROUP | sbtest1_mewg_qpne_00000 | p1             |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |    1 | MYDB_P00001_GROUP | sbtest1_mewg_qpne_00001 | p2             |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      |    2 | MYDB_P00000_GROUP | sbtest1_mewg_qpne_00002 | p3             |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |    3 | MYDB_P00001_GROUP | sbtest1_mewg_qpne_00003 | p4             |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      |    4 | MYDB_P00000_GROUP | sbtest1_mewg_qpne_00004 | p5             |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |    5 | MYDB_P00001_GROUP | sbtest1_mewg_qpne_00005 | p6             |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      |    6 | MYDB_P00000_GROUP | sbtest1_mewg_qpne_00006 | p7             |                   | mydb_p00000 | pxc-xdb-s-hzrth7pjc07vyb3208 |                   |
      |    7 | MYDB_P00001_GROUP | sbtest1_mewg_qpne_00007 | p8             |                   | mydb_p00001 | pxc-xdb-s-hzrth7pjc07vyb44da |                   |
      +------+-------------------+-------------------------+----------------+-------------------+-------------+------------------------------+-------------------+
      8 rows in set (0.00 sec)
    3. 单击再次查看压测表数据分布,自动执行如下命令:

      select TABLE_SCHEMA,TABLE_NAME,STORAGE_INST_ID,PHYSICAL_TABLE,PARTITION_NAME as p_name,TABLE_ROWS as row 
      from information_schema.TABLE_DETAIL 
      where table_schema='mydb' and table_name= 'sbtest1' ;

      返回结果如下:

      +--------------+------------+------------------------------+-------------------------+--------+------+
      | TABLE_SCHEMA | TABLE_NAME | STORAGE_INST_ID              | PHYSICAL_TABLE          | p_name | row  |
      +--------------+------------+------------------------------+-------------------------+--------+------+
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_mewg_qpne_00000 | p1     |  937 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_mewg_qpne_00001 | p2     |  847 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_mewg_qpne_00002 | p3     | 1338 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_mewg_qpne_00003 | p4     | 1296 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_mewg_qpne_00004 | p5     | 1917 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_mewg_qpne_00005 | p6     |  986 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb3208 | sbtest1_mewg_qpne_00006 | p7     | 1297 |
      | mydb         | sbtest1    | pxc-xdb-s-hzrth7pjc07vyb44da | sbtest1_mewg_qpne_00007 | p8     | 1423 |
      +--------------+------------+------------------------------+-------------------------+--------+------+
      8 rows in set (0.02 sec)

      可以看到,压测数据发生了重分布。

      在整个过程中可以观测左侧实例的TPS性能变化情况。

      image.png

  9. 接下来我们来体验PolarDB-X兼容MySQL Binlog的CDC能力及CDC后的数据一致性。

    1. 单击切换到同步库,自动执行如下命令:

      use cdc_db;
    2. 单击确认自建没有test_11表,自动执行如下命令:

      show create table test_11 ;

      返回结果如下:

      ERROR 1146 (42S02): Table 'cdc_db.test_11' doesn't exist
    3. 单击PolarDB分布式版创建表,在主库自动执行如下建表命令,创建test_11表:

      CREATE TABLE `test_11` (
       `id` int(11) NOT NULL,
       `t` date NOT NULL,
       PRIMARY KEY (`id`)
       ) 
       ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 
    4. 单击增加列test_column,自动执行如下命令,在上一步主库中创建的表中增加一列:

      alter table test_11 add column test_column INT NOT NULL DEFAULT 0; 
    5. 单击主库插入数据,自动执行如下命令,在主库的test_11表中添加一行数据:

      insert into test_11(id,t,test_column) values (1111,now(),2); 
    6. 单击从库查看test_11表情况,在从库中自动执行如下命令:

      select * from test_11;

      返回结果如下:

      +------+------------+-------------+
      | id   | t          | test_column |
      +------+------------+-------------+
      | 1111 | 2024-01-08 |           2 |
      +------+------------+-------------+
      1 row in set (0.01 sec)

      可以看到,主库中创建表、新增列以及插入数据的动作(DML)已自动同步至从库。

    7. 单击分布式节点删除test_11表结构,在主库中自动执行如下命令:

      drop table test_11;
    8. 单击查看test_11表结构,在从库中自动执行如下命令:

      show create table test_11 ;

      返回结果如下:

      ERROR 1146 (42S02): Table 'cdc_db.test_11' doesn't exist

      可以看到,主库中删除表的语句(DDL)也已自动同步至从库。

结果分析

PolarDB-X支持自动分区

PolarDB-X支持自动分区,默认主键拆分。从而让移植到PolarDB-X的数据和业务摆脱对设计分区键的依赖,实现从单机MySQL到分布式的平滑演进。

也支持指定分区键拆分,从而提高整体性能。

PolarDB-X支持数据回流及数据一致性

事务型的分布式数据库除了面向在线业务的高并发写入以外,一般还需要将在线数据同步给下游的灾备数据、汇聚业务或数据仓库系统等,下游业务对于事务日志的一致性也有比较强的诉求,例如事务不能乱序、事务原子性、DDL支持同步等。

从本体验可以看到,PolarDB-X支持将数据实时同步给下游的MySQL,其数据具有一致性。

相关内容