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 配置的值能有效提升写性能

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

相关推荐
丘山子4 分钟前
一些鲜为人知的 IP 地址怪异写法
前端·后端·tcp/ip
CopyLower28 分钟前
在 Spring Boot 中实现 WebSockets
spring boot·后端·iphone
.生产的驴1 小时前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
景天科技苑1 小时前
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
开发语言·后端·rust·match·enum·枚举与模式匹配·rust枚举与模式匹配
追逐时光者2 小时前
MongoDB从入门到实战之Docker快速安装MongoDB
后端·mongodb
方圆想当图灵2 小时前
深入理解 AOP:使用 AspectJ 实现对 Maven 依赖中 Jar 包类的织入
后端·maven
豌豆花下猫3 小时前
Python 潮流周刊#99:如何在生产环境中运行 Python?(摘要)
后端·python·ai
嘻嘻嘻嘻嘻嘻ys3 小时前
《Spring Boot 3 + Java 17:响应式云原生架构深度实践与范式革新》
前端·后端
异常君3 小时前
线程池隐患解析:为何阿里巴巴拒绝 Executors
java·后端·代码规范
mazhimazhi3 小时前
GC垃圾收集时,居然还有用户线程在奔跑
后端·面试