Cassandra 批量插入性能探索:从线上问题到优化策略

背景

  • 线上需要将 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 配置的值能有效提升写性能

调大配置 & 批量改为单条插入线上表现

相关推荐
codeGoogle7 小时前
自研 IM 还是选择第三方 SDK?企业开发者应该如何权衡?
前端·后端·程序员
DLYSB_10 小时前
API 网关流量洪峰与突发 CC 攻击:我用 Go 写了个“现场物理防御哨兵”,把故障响应压缩到秒级
开发语言·后端·golang·报警灯
markinmarkin10 小时前
Spring 中Bean 的作用域有哪些?
java·后端·spring
橙子家11 小时前
使用方法 ToDictionary() 来优化查询时间复杂度:O(N*M) -> O(1*M)【C# 基础】
后端
IT_陈寒12 小时前
我又被JavaScript的隐式类型转换坑了
前端·人工智能·后端
用户83562907805112 小时前
Python Word 转 PDF 和 PDF 转 Word 指南
后端·python
用户83562907805112 小时前
如何使用 Python 加密和保护 Word 文档
后端·python
他们叫我秃子13 小时前
前端开发转 Go 全栈(五):终于遇到熟人了,Go 的闭包和高阶函数原来这么像 JavaScript
前端·后端·go
SomeB1oody13 小时前
【RustyML入门】2.6. 线性判别分析
开发语言·后端·机器学习·rust·教程
妙码生花13 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十七):AI时代对组件封装的新理解、agInput 统一入口,动态表单预备
前端·后端·go