本文将介绍如何生成列存快照的快照点,以及生成快照点后对列存只读实例和主实例的数据同步延迟所产生的影响。
版本限制
实例版本需要在5.4.20及以上,且引擎版本为MySQL 5.7或MySQL 8.0。
手动生成
执行如下代码,生成实例级别的快照点:
CALL polardbx.columnar_flush();
说明执行
CALL polardbx.columnar_flush()
函数会产生一个快照点,并返回一个unsigned long
类型的值,代表该快照点的版本(一个与时区无关的时间戳)。执行如下代码,对指定的列存索引生成快照点:
CALL polardbx.columnar_flush(schema_name, table_name, index_name); -- 例如:索引名可添加实际后缀,或不加后缀(通过 show columnar status 可查看后缀) CALL polardbx.columnar_flush('db1', 'tb1', 'cci'); CALL polardbx.columnar_flush('db1', 'tb1', 'cci_$09a9');
说明其中
index_name
为列存索引名称。如何获取index_name
,请参见SHOW COLUMNAR STATUS。列存索引级别快照点是整个实例的一致性快照,并不是单个表的一致性快照。效果等同于实例级别快照点。
自动生成
执行如下代码,可以让系统定期地生成快照点:
-- 调整生成的间隔,单位:分钟
CALL polardbx.columnar_config(cci_id, 'auto_gen_columnar_snapshot_interval', 10);
使用快照点查询快照
执行如下代码,查询
INFORMATION_SCHEMA.COLUMNAR_SNAPSHOTS
视图,来获取当前可用的快照点(包括手动生成和自动生成的快照点):SELECT * FROM INFORMATION_SCHEMA.COLUMNAR_SNAPSHOTS;
返回结果示例如下:
+------------------------+------------+------------+---------------------+ | SCHEMA_NAME | TABLE_NAME | INDEX_NAME | TSO | +------------------------+------------+------------+---------------------+ | test_columnar_snapshot | tb1 | cci_$09a9 | 7249374192586457152 | | polardbx | __global__ | __global__ | 7249332223843762240 | | polardbx | __global__ | __global__ | 7249374271451955264 | +------------------------+------------+------------+---------------------+
参数说明:
参数名称
说明
SCHEMA_NAME
模式名称。值为
polardbx
时,表示该快照点是一个实例级别的快照点。SCHEMA_NAME
为其他值时,表示该快照点是一个列存索引级别的快照点。INDEX_NAME
列存索引的物理名称,相比创建索引时指定的逻辑名字,会带有一个随机后缀
_$09a9
。更多信息,请参见SHOW COLUMNAR STATUS。TABLE_NAME
列存索引对应的逻辑表名。
说明如果快照点个数过多,建议您使用
SCHEMA_NAME
、TABLE_NAME
、INDEX_NAME
、TSO
这些列作为条件进行过滤。否则可能会对实例性能造成影响。使用
TIME_TO_TSO()
函数将时间戳转成TSO值后,作为过滤条件查询,以提升查询效率。
执行如下代码,可以查询特定列存索引在某个时间段内的所有快照点:
-- 查询 2024-07-01 14:00:00 到 2024-07-01 18:00:00 之间的快照点 SELECT TIME_TO_TSO("2024-07-01 14:00:00") as tso; +---------------------+ | tso | +---------------------+ | 7213421061734400000 | +---------------------+ SELECT TIME_TO_TSO("2024-07-01 18:00:00") as tso; +---------------------+ | tso | +---------------------+ | 7213481459712000000 | +---------------------+ -- 获取指定列存索引的快照点 SELECT * FROM INFORMATION_SCHEMA.COLUMNAR_SNAPSHOTS WHERE SCHEMA_NAME = 'your_schema' AND TABLE_NAME = 'your_table' AND INDEX_NAME = 'your_snapshot_cci_name' AND TSO >= 7213421061734400000 AND TSO <= 7213481459712000000; +-------------+------------+------------------------+---------------------+ | SCHEMA_NAME | TABLE_NAME | INDEX_NAME | TSO | +-------------+------------+------------------------+---------------------+ | polardbx | __global__ | __global__ | 7213421061734400000 | | your_schema | your_table | your_snapshot_cci_name | 7213481459712000000 | +-------------+------------+------------------------+---------------------+
性能影响测试
使用CALL polardbx.columnar_flush()
函数生成快照点不会对行存上的读写造成影响,但频繁调用CALL polardbx.columnar_flush()
时,可能会增大列存只读实例和主实例的数据同步延迟。
测试设计
测试数据量
基于1000 Warehouse,其中主要表的数据量如下:
bmsql_order_line
表3亿行。bmsql_stock
表1亿行。bmsql_customer
、bmsql_history
、bmsql_oorder
各3000万行。
测试所用实例规格
节点名称
节点规格
节点数
计算节点
4核16 G
2
存储节点
4核16 G
4
列存引擎
4核32 G
2
测试所用压力机规格
ecs.g6.4xlarge(16核64 GB)。如何购买ECS实例,请参见控制台自定义购买并使用ECS实例。
测试方法
完成TPC-C测试的环境搭建。具体操作,请参见TPC-C测试。
执行如下代码,对测试数据库中最大的三个表
bmsql_stock
,bmsql_customer
,bmsql_order_line
分别创建列存快照:CREATE CLUSTERED COLUMNAR INDEX cci ON `bmsql_stock`(s_i_id) PARTITION BY KEY(s_w_id) COLUMNAR_OPTIONS='{ "type":"snapshot", "snapshot_retention_days":"30", "auto_gen_columnar_snapshot_interval":"-1" }'; CREATE CLUSTERED COLUMNAR INDEX cci ON `bmsql_customer`(c_id) PARTITION BY KEY(c_w_id) COLUMNAR_OPTIONS='{ "type":"snapshot", "snapshot_retention_days":"7", "auto_gen_columnar_snapshot_interval":"-1" }'; CREATE CLUSTERED COLUMNAR INDEX cci ON `bmsql_order_line`(ol_i_id) PARTITION BY KEY(ol_w_id) columnar_options='{ "type":"snapshot", "snapshot_retention_days":"365", "auto_gen_columnar_snapshot_interval":"-1" }';
当压测到计算节点和存储节点的CPU占用都接近50%时,以不同的频率调用
CALL polardbx.columnar_flush()
生成快照点,并观察列存只读实例和主实例的数据同步延迟。
测试结果
每分钟60次调用
CALL polardbx.columnar_flush()
生成快照点时,列存只读实例和主实例的数据同步延迟如下图所示:每分钟480次调用
CALL polardbx.columnar_flush()
生成快照点时,列存只读实例和主实例的数据同步延迟如下图所示:说明压测的过程中,同步延迟稳定在1秒左右,最高在4秒左右。
每分钟960次调用
CALL polardbx.columnar_flush()
生成快照点时,列存只读实例和主实例的数据同步延迟如下图所示:说明在频率加大到每分钟960次时,列存只读实例和主实例的数据同步延迟出现了明显增长,最高达到了50秒。
测试总结
在上述测试中,以小于每分钟500次的频率调用CALL polardbx.columnar_flush()
时,并没有明显的增加列存只读实例和主实例的数据同步延迟。但是当以每分钟约1000次的频率调用CALL polardbx.columnar_flush()
时,列存只读实例和主实例的数据同步延迟会出现明显增大。在实际业务环境中,因为CALL polardbx.columnar_flush()
的调用频率对列存只读实例和主实例的数据同步延迟的影响,和实际地业务流量、列存快照地个数等都息息相关,所以建议您控制调用CALL polardbx.columnar_flush()
地频率不超过每秒1次,如果需要以更高频率调用(超过每秒1次),请务必进行充分地测试。