Flink CDC 单线程读取 mysql binlog 同步到 Elasticsearch 的压力测试

硬件环境

MySQL 服务器2核1G,Flink 服务器2核4G,Elasticsearch 服务器2核8G。

软件版本

MySQL 5.7.35,Flink 2.12-1.14.2,Elasticsearch 7.1.0,flink-sql-connector-elasticsearch7 2.12-1.14.2,flink-sql-connector-mysql-cdc 2.3.0。

软件配置

Flink 的配置使用默认的配置。

Flink 任务 SQL 语句

CREATE TABLE table1_source (
`id` int,
`name` string,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '120.xxx.xxx.194',
'port' = '3306',
'username' = 'root',
'password' = 'xxxxxxxxx',
'database-name' = 'canal_mysqlslap',
'table-name' = 'table1'
);

CREATE TABLE table1_sink(
`id` int,
`name` string,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'elasticsearch-7',
'hosts' = 'http://47.xxx.xxx.96:9200',
'index' = 'table1_index',
'sink.bulk-flush.max-actions' = '1'
);

insert into table1_sink select * from table1_source;

mysqlslap 压力测试命令

执行时将 id 为 1 的记录的 name 字段置空。执行过程是每次更新 name 的值,以递增的方式从随机 32 个字符中截取,当前这次更新的 name 长度会是变更前 name 长度加 1。如果 name 字段的长度为 31,那下一次更新 name 会是空值。

分别顺序执行 3200、32000 次更新,更新 id 为 1 的记录。期望是 MySQL 和 Elasticsearch 中的 id 为 1 的记录的 name 字段最终都为空值。

mysqlslap -u root -p -c 1 -i 1 --create-schema=canal_mysqlslap -e innodb --query="update table1 set name=substring(md5(rand()), 1,(LENGTH(name) + 1) % 32) where id=1; commit;" --number-of-queries=32000

测试结果

3200次更新 id 为1 的记录

耗时

mysqlslap 执行 10s,Flink 同步数据到 Elasticsearch 执行 32s。

最终值

MySQL 中 id 为 1 的记录的 name 字段为空值,未乱序。

Elasticsearch 中 id 为 1 的记录的 name 字段为空值,未乱序。

32000次更新 id 为 1 的记录

耗时

mysqlslap 执行 100s,Flink 同步数据到 Elasticsearch 执行 310s。

最终值

MySQL 中 id 为 1 的记录的 name 字段为空值,未乱序。

Elasticsearch 中 id 为 1 的记录的 name 字段为空值,未乱序。

你可能感兴趣的:(中间件,分布式,压力测试,flink)