背景
- 线上需要将 MySQL 7 亿数据的表迁移到 Cassandra 中,由于数据量很大,所以我们使用 Cassandra 批量插入数据功能插入数据
- 线上只要开启批量跑数据任务,Cassandra 读/写 p99 延迟飙升,只要停止跑批任务延迟立马下降,如下图所示
- 根据这个现象我们提出猜想,Cassandra 批量插入数据会造成其它请求堵塞,并且一次批量插入的数据分区数越多,批量插入性能越差,于是我们在开发环境进行压测
压测
实验环境
- cassandra 单节点
- cassandra concurrent_writes 64/128
批量插入不同分区数据(100 / 批)
concurrent_writes = 64
- 500 TPS ,写延迟 p99 达到了 300ms
单条插入
concurrent_writes = 64
- 1200 TPS ,写延迟 p99 只有 250us
增加写并发配置批量插入不同分区数据(100 / 批)
concurrent_writes = 128
- 500 TPS ,写延迟 p99 只有 150ms
增加写并发配置批量插入相同分区数据(100 / 批)
concurrent_writes = 128
- 700 TPS ,写延迟 p99 只有 125ms
压测结论
- 性能对比: 单条插入 > 批量插入相同分区数据 > 批量插入不同分区数据
- 批量插入相同分区数据性能比批量插入不同分区数据性能好一些,但是随着 TPS 增加,写入 p99 仍然增加明显
- 批量插入数据 TPS 超过一定阈值,写入 p99 延迟会指数增长,同时影响查询速度
- 单条插入数据性能极高,单节点 concurrent_writes = 64、TPS = 1200 ,写入 p99 只有 250 us
- 适当增加 concurrent_writes 配置的值能有效提升写性能