From e1b98533892221cbd20fd2f9a31c5e5333c29d89 Mon Sep 17 00:00:00 2001 From: agapple Date: Mon, 14 Oct 2019 14:53:01 +0800 Subject: [PATCH] Created Canal MQ Performance (markdown) --- Canal-MQ-Performance.md | 95 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 Canal-MQ-Performance.md diff --git a/Canal-MQ-Performance.md b/Canal-MQ-Performance.md new file mode 100644 index 0000000..f7575b6 --- /dev/null +++ b/Canal-MQ-Performance.md @@ -0,0 +1,95 @@ +# 测试环境 + +| 类型 | 配置 | +| --- | --- | +| MySQL A + Canal Server | Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz  (24core 96G) | +| MQ(kafka/RocketMQ) | Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz  (24core 96G) | + +## 测试方式 + +1. 混合的DML场景测试 (模拟业务场景,小事务) + * 混合2张表的insert、update、delete,包含最大10个bantch的insert、单条update和随机单条delete +2. batch insert场景 (模拟批量场景,大事务) + +MQ服务配置层面基本采用默认参数,比如: +1. kafka https://kafka.apache.org/quickstart +2. RocketMQ https://rocketmq.apache.org/docs/quick-start/ + +Canal的Perf性能数据监控 +1. prothemues,https://github.com/alibaba/canal/wiki/Prometheus-QuickStart +2. linux主机监控,比如dstat/top等,关注网络包和cpu利用率 + +## 测试总结 + +### 性能数据 +1. 混合DML场景,同步效率在15k ~ 30k rps (每秒的事务数大概在5k~10k的tps,一个事务会包含至少3条binlog) +2. batch操作场景,同步效率在50k ~ 60k rps +3. rocketmq相比于kafka,大概有30%的性能提升 +4. 非flatMessage模式相比于flatMessage模式,大概有30%~60%的性能提升 (调整了默认参数为flatMessage=false) + +### 优化思路 +canal-server发送MQ消息,为了保障binlog顺序性考虑,会有串行的代码路径,需要尽可能减少串行路径上的代价,比如序列化、分区散列、flatMessage对象转化等 + +代码优化点: +1. 针对不开启flatMessage,默认设置canal.instance.memory.rawEntry=true,确保在发送kafka消息阶段不需要做bytes序列化。针对单队列的情况,可以有50%的性能提升 +2. 针对开启flatMessage,引入多线程进行protobuf对象的转化到flat对象的过程,减少串行路径,提升会比较明显,可以有近10倍 +3. 针对多topic的发送,引入多线程发送机制,减少串行路径,随着topic数量分布可以有倍数上的提升 +4. 减少kafka发送端的flush频率,一个getBatchSize在最后进行一次flush阻塞 (之前在flatMessage上每条消息都做了flush) + +小tips: +1. 单topic单分区 > 多topic单分区,kafka模式下估计是大batch拆分为了小batch,同时有了proto对象的反序列化开销 +2. flatMessage模式,性能普遍比不开启flatMessage模式慢,主要就是proto对象的反序列化开销和小batch的发送成本,后续可以通过更多的topic+分区追回 + +### 优化参数 + +影响性能的几个参数: +1. canal.instance.memory.rawEntry = true (表示是否需要提前做序列化,非flatMessage场景需要设置为true) +2. canal.mq.flatMessage = false (false代表二进制协议,true代表使用json格式,二进制协议有更好的性能) +3. canal.mq.dynamicTopic (动态topic配置定义,可以针对不同表设置不同的topic,在flatMessage模式下可以提升并行效率) +4. canal.mq.partitionsNum/canal.mq.partitionHash (分区配置,对写入性能有反作用,不过可以提升消费端的吞吐) + +# 测试数据 + +测试的对比项: +1. flatMessage 开启 vs 不开启 (是否涉及数据个是转换,会有一定的转换成本和网络放大问题) +2. 单topic vs 多topic (不同表路由到不同的topic) +3. 单分区 vs 多分区 (表的不同记录路由到不同分区) + +名词解读: +1. rps,canal store里消费entry的数量,会包含事务的begin/end事件 + DML事件 +2. tps,事务为单位的消费速度 +## 优化前 (1.1.4版本) + +### 混合DML场景测试 +| 场景 | 1个topic + 单分区 | 1个topic+3分区| 2个topic+1分区 | 2个topic+3分区 | +| -------- | -------- | -------- | -------- | -------- | +| 不开启flatMessage | 20k rps
(7.50k tps) | 15k rps
(5.7k tps) | 11.5k rps
(4.56k tps) | 10.8k rps
(4.01k tps) | +| 开启flatMessage | 0.6k rps
(0.2k tps) | 0.7k rps
(0.2k tps) | 0.8k rps
(0.2k tps) | 0.9k rps
(0.2k tps) | + +## 优化后 (1.1.5版本) + +### Kafka + 混合DML场景测试 +| 场景 | 1个topic + 单分区 | 1个topic+3分区| 2个topic+1分区 | 2个topic+3分区 | +| -------- | -------- | -------- | -------- | -------- | +| 不开启flatMessage | 29.6k rps
(9.71k tps) | 17.54k rps
(6.53k tps) | 21.6k rps
(7.9k tps) | 16.8k rps
(5.71k tps) | +| 开启flatMessage | 11.79k rps
(4.36k tps) | 15.97 rps
(5.94k tps) | 11.91k rps
(4.45k tps) | 16.96k rps
(6.26k tps) | + +### Kafka + 单表的batch insert场景测试 +| 场景 | 1个topic + 单分区 | 1个topic+3分区| +| -------- | -------- | -------- | +| 不开启flatMessage | 59.6k rps | 45.1k rps | +| 开启flatMessage | 51.3k rps | 49.6k rps | + +---- + +### RocketMQ + 混合DML场景测试 +| 场景 | 1个topic + 单分区 | 1个topic+3分区| 2个topic+1分区 | 2个topic+3分区 | +| -------- | -------- | -------- | -------- | -------- | +| 不开启flatMessage | 29.6k rps
(10.71k tps) | 23.3k rps
(8.59k tps) | 26.7k rps
(9.46k tps) | 21.7k rps
(7.66k tps) | +| 开启flatMessage | 16.75k rps
(6.17k tps) | 14.96k rps
(5.55k tps) |17.83k rps
(6.63k tps) | 16.93k rps
(6.26k tps) | + +### RocketMQ + 单表的batch insert场景测试 +| 场景 | 1个topic + 单分区 | 1个topic+3分区| +| -------- | -------- | -------- | +| 不开启flatMessage | 81.2k rps | 51.3k rps | +| 开启flatMessage | 62.6k rps | 57.9k rps | \ No newline at end of file