以前根据Canal在测试环境中测试其产品性能,其测试报告如下。根据Canal性能测试结果,感觉不是很理想。和官方的测试报告偏差很大。根据官方的建议,用其测试类测试其各个Canal模块的性能出测试报告如下。测试canal版本1.1.4。
一、测试环境
环境 | 测试版本 | 类型 | 配置 |
---|---|---|---|
官方环境 | 疑是1.0.26 | MySQL A | Intel® Xeon® CPU E5-2430 0 @ 2.20GHz (24core 96G) 日常业务库 |
MySQL B | Intel® Xeon® CPU E5-2430 0 @ 2.20GHz (24core 96G) | ||
Canal Server | Intel® Xeon® CPU E5-2430 0 @ 2.20GHz (24core 96G) | ||
Canal Server | Intel® Xeon® CPU E5-2430 0 @ 2.20GHz (24core 96G) | ||
本人环境 | 1.1.4、1.1.5 | MacBookPro14,1 | Intel Core i5 数据库、Canal Server都在本机 |
二、测试过程及结果
2.1、本地测试环境准备
作者虽然给我们测试类了,但是这些类和方法如何传递参数?我们这些平时很少和binlog打交道的开发来说还是比较懵逼的。下面介绍如何用起来作者的测试类。这些测试类最重要的几个参数 binlogfilename(binlog名称)、binlogPosition(binlog位点)、slaveId(canal从机Id)。这些参数哪里获取?这是有逻辑意义的随便填写会报错,然后自己也比较懵逼。这些参数都是从mysql binlog中获取的,下面有获取的命令。
#获取binlog日志名称
show binary logs;
#打开binlog日志
show binlog events in 'mysql-bin.000001';
#查看binlog日志模式 row,statement,mixed
show global variables like '%binlog_format%';
#设置客户端超时防止拉取超时
SET @wait_timeout='999999999';
2.2、测试表结构
CREATE TABLE `table` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'xxx',
`delivery_order_id` varchar(60) NOT NULL COMMENT 'xxx',
`type` tinyint(4) NOT NULL COMMENT 'xxx',
`ticket_id` bigint(20) NOT NULL COMMENT 'xxx',
`price` decimal(10,2) NOT NULL COMMENT 'xxx',
`quantity` int(11) NOT NULL COMMENT 'xxx',
`amount` decimal(10,2) NOT NULL COMMENT 'xxx',
`source` tinyint(4) NOT NULL COMMENT 'xxx',
`status` tinyint(4) NOT NULL COMMENT 'xxx',
`station_id` bigint(20) DEFAULT NULL COMMENT 'xxx',
`emp_id` bigint(20) DEFAULT NULL COMMENT 'xxx',
`delivery_start_time` datetime NOT NULL COMMENT 'xxx',
`delivery_end_time` datetime NOT NULL COMMENT 'xxx',
`complete_time` datetime DEFAULT NULL COMMENT 'xxx',
`create_user` varchar(45) NOT NULL DEFAULT 'system' COMMENT 'xxx',
`update_user` varchar(45) NOT NULL DEFAULT 'system' COMMENT 'xxx',
`create_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'xxx',
`update_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'xxx',
`product_id` varchar(45) DEFAULT NULL COMMENT 'xxx',
`product_name` varchar(255) DEFAULT NULL COMMENT 'xxx',
`shop_id` int(11) DEFAULT NULL COMMENT 'xxx',
PRIMARY KEY (`id`),
KEY `idx_order_id` (`delivery_order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='xxx';
2.3、测试结果对比及环对比
测试模块 | 版本 | 测试人 | 批量操作Insert/Update/Delete (导入业务) | 单条操作 (普通业务) |
---|---|---|---|---|
1.Binlog接收 | 1.0.26 | 官方 | 200w TPS (网络 117MB/s) | 71w TPS (网络 112MB/s) |
1.1.4 | 本地环境 | 源码报错无法测试 | 未测试 | |
1.1.5 | 本地环境 | 源码报错无法测试 | 未测试 | |
2.Binlog Event解析 | 1.0.26 | 官方 | 200w TPS (网络 117MB/s) | 70w TPS (网络 110MB/s) |
1.1.4 | 本地环境 | 62399–97943 TPS | 未测试 | |
1.1.5 | 本地环境 | 69783 - 76219 TPS | 未测试 | |
3.Insert/Update/Delete深度解析 | 1.0.26 | 官方 | 200w TPS (网络 117MB/s) | 65w TPS (网络 105MB/s) |
1.1.4 | 本地环境 | 163937 - 409860 TPS | 未测试 | |
1.1.5 | 本地环境 | 170361 - 425565 TPS | 未测试 | |
4.生成CanalEntry (存储到memory store) | 1.0.26 | 官方 | 130w TPS (网络 75MB/s) | 50w TPS (网络 90MB/s) |
1.1.4 | 本地环境 | 1123 - 1539 TPS | 未测试 | |
1.1.5 | 本地环境 | 1429 - 1616 TPS | 未测试 | |
5.client接收 | 1.0.26 | 官方 | 20w TPS 1.canal server机器网络 11MB/s2.canal client机器网络 75MB/s | |
binlog膨胀率为 1:6.8 | 10w TPS 1.canal server网络 22MB/s2.canal client网络 42MB/s | |||
binlog膨胀率为 1:1.9 | ||||
1.1.4 | 本地环境 | 未测试 | 未测试 | |
1.1.5 | 本地环境 | 未测试 | 未测试 |
各个阶段测试代码:
1、FetcherPerformanceTest.java
2、MysqlBinlogEventPerformanceTest.java
3、MysqlBinlogParsePerformanceTest.java
4、MysqlBinlogDumpPerformanceTest.java
5、SimpleCanalClientPermanceTest.java
总结:
第4步生成CanalEntry (存储到memory store)面临性能问题,接下来要分析这个模块为什么有性能问题,是否有改进的空间或者通过升级版本方式改进的空间。性能测试issues提问