本文介绍了如何免费体验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后的数据一致性。
操作步骤
进入瑶池解决方案体验馆。
单击核心功能体验,然后单击透明分布式功能体验的免费体验按钮,进入如下页面:
单击页面下方创建免费体验任务按钮。
稍等片刻后,单击刷新任务列表,可以看到您创建的体验任务已开始。
单击查看详情,进入实时查询情况页面,并单击启动任务。
说明请根据页面按钮提示,手动点击按钮执行每一步操作。若在倒计时结束时没有手动点击执行,则会自动执行对应操作。
首先我们来体验PolarDB-X的Auto Partitioning特性。
单击切换到压测库,切换到PolarDB-X主库mydb。
use mydb;
单击查看压测表,自动执行如下命令,查看所用到的压测表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)
单击查看物理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)
单击查看表的分布,自动执行如下命令:
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)
单击查看压测表数据分布,自动执行如下命令:
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能够自动选择分区键(默认为主键)并对表及其索引进行水平分区。
单击启动压测,并等待30秒后进行后续操作。
启动压测后,我们来体验PolarDB-X在改变分区键前后的性能对比。
单击修改分区键,自动执行如下命令,将分区方式变更为k列:
alter table sbtest1 partition by hash(k) partitions 8;
单击再次查看表的分布,自动执行如下命令:
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)
单击再次查看压测表数据分布,自动执行如下命令:
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性能变化情况。
接下来我们来体验PolarDB-X兼容MySQL Binlog的CDC能力及CDC后的数据一致性。
单击切换到同步库,自动执行如下命令:
use cdc_db;
单击确认自建没有test_11表,自动执行如下命令:
show create table test_11 ;
返回结果如下:
ERROR 1146 (42S02): Table 'cdc_db.test_11' doesn't exist
单击PolarDB分布式版创建表,在主库自动执行如下建表命令,创建test_11表:
CREATE TABLE `test_11` ( `id` int(11) NOT NULL, `t` date NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
单击增加列test_column,自动执行如下命令,在上一步主库中创建的表中增加一列:
alter table test_11 add column test_column INT NOT NULL DEFAULT 0;
单击主库插入数据,自动执行如下命令,在主库的test_11表中添加一行数据:
insert into test_11(id,t,test_column) values (1111,now(),2);
单击从库查看test_11表情况,在从库中自动执行如下命令:
select * from test_11;
返回结果如下:
+------+------------+-------------+ | id | t | test_column | +------+------------+-------------+ | 1111 | 2024-01-08 | 2 | +------+------------+-------------+ 1 row in set (0.01 sec)
可以看到,主库中创建表、新增列以及插入数据的动作(DML)已自动同步至从库。
单击分布式节点删除test_11表结构,在主库中自动执行如下命令:
drop table test_11;
单击查看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,其数据具有一致性。