单节点Cassandra容器持续插入24小时后无响应求助
Cassandra单节点容器部署写入超时无响应问题排查与解决
问题背景
Cassandra以单节点容器形式与其他微服务一同部署,数据通过gocql驱动从业务微服务持续写入,写入速率120~150次/秒,单条数据约1MB(含JSON与Blob),同时存在读取操作。
环境配置
系统硬件
- CPU:13th Gen Intel(R) Core(TM) i9-13900K / 12代Intel CPU(测试复现环境)
- 内存:32GB / 64GB(测试复现环境)
- 存储:1TB NVMe SSD
Docker Compose配置
ia_cassandradb: image: cassandra:4.1.6 container_name: ia_cassandradb hostname: ia_cassandradb restart: unless-stopped ipc: "none" read_only: true security_opt: - no-new-privileges command: | /bin/bash -c " cp -r /etc/cassandra/* /etc/cassandra_tmp/. cp /etc/cassandra/cassandra_bk.yaml /etc/cassandra_tmp/cassandra.yaml if [[ $DEV_MODE == true ]] then sed -i '/client_encryption_options:/{n;s/.*/ enabled: false/}' /etc/cassandra_tmp/cassandra.yaml else cd /run/secrets/Cassandra rm -rf /etc/cassandra_tmp/dse-truststore.jks /etc/cassandra_tmp/secrets.p12 /etc/cassandra_tmp/certkey-keystore.jks keytool -keystore /etc/cassandra_tmp/dse-truststore.jks -storetype PKCS12 -importcert -file 'cacert.pem' -alias cacert -storepass cassandra -noprompt openssl pkcs12 -export -in DataStore_Server_server_certificate.pem -inkey DataStore_Server_server_key.pem -name localhost -out /etc/cassandra_tmp/secrets.p12 -password pass:cassandra keytool -importkeystore -deststorepass cassandra -destkeystore /etc/cassandra_tmp/certkey-keystore.jks -srckeystore /etc/cassandra_tmp/secrets.p12 -srcstoretype PKCS12 -srcstorepass cassandra fi while true; do nodetool clearsnapshot --all; nodetool compact; nodetool cleanup; sleep 600; done & /usr/local/bin/docker-entrypoint.sh " networks: - net_iso environment: AppName: "DataStore" CASSANDRA_CONF: /etc/cassandra_tmp DEV_MODE: ${DEV_MODE} volumes: # Mount for influxdb data directory and configuration - ./Certificates/Server_Certs/:/run/secrets/Cassandra:rw - vol_cassandra_tmp:/tmp - vol_cassandra_log:/opt/cassandra/logs - vol_cassandra_etc:/etc/cassandra_tmp - ${EII_INSTALL_PATH}/data/cassandra:/var/lib/cassandra/data - ../config_files/cassandra/cassandra.yaml:/etc/cassandra/cassandra_bk.yaml:ro
问题现象
初始写入速度正常,数小时后写入变慢,24小时左右出现写入失败、Cassandra无响应(无法通过cqlsh连接),手动重启容器可恢复服务,且在不同硬件配置环境下均复现。
排查与解决方案
1. 修复定时运维任务的资源占用问题
当前启动脚本每10分钟执行一次nodetool clearsnapshot --all; nodetool compact; nodetool cleanup,三个操作均为IO/CPU密集型任务,频繁执行会持续抢占Cassandra处理读写的资源:
- 移除
nodetool compact定时执行:压缩操作需根据数据碎片情况手动触发,或设置为每周一次的低峰期执行。 - 删除
nodetool cleanup:单节点集群中该操作无意义(用于移除非本节点的token数据)。 - 延长
clearsnapshot执行周期:改为每日执行一次。
修改后的定时任务示例:
while true; do nodetool clearsnapshot --all; sleep 86400; done &
2. 优化Cassandra核心参数配置
针对当前写入负载调整cassandra.yaml和jvm.options:
- 堆内存设置:在
jvm.options中,将堆内存设为系统内存的1/41/2(32GB内存环境建议8GB12GB):-Xms8G -Xmx8G - 读写缓存调整:在
cassandra.yaml中:- 增大
key_cache_size_in_mb至512MB,提升热点数据读取性能。 - 若存在大量重复行读取,设置
row_cache_size_in_mb为256MB~512MB;写入为主则保持默认关闭。 - 提升
commitlog_total_space_in_mb至8GB,避免commitlog频繁刷盘阻塞IO。
- 增大
3. 添加容器资源限制
当前配置未限制容器资源,Cassandra可能耗尽主机CPU/内存导致无响应,在docker-compose.yaml的ia_cassandradb服务中添加:
deploy: resources: limits: cpus: '8.0' memory: 16G reservations: cpus: '4.0' memory: 8G
可根据主机实际配置调整数值,平衡Cassandra资源需求与主机其他服务的资源占用。
4. 优化存储挂载与IO性能
- 用
iostat -x 1监控磁盘IO,若%util持续接近100%,说明磁盘IO已达瓶颈,需排查存储设备性能或优化写入策略。 - 给数据目录挂载添加
noatime选项,减少磁盘元数据写入:- ${EII_INSTALL_PATH}/data/cassandra:/var/lib/cassandra/data:rw,noatime
5. 调整gocql客户端配置
客户端配置不合理会导致连接池耗尽或请求堆积:
- 调整连接池大小,设置
PoolConfig.Hosts.MaxConns为20~30,匹配写入速率。 - 启用超时设置:
Timeout设为10秒,ConnectTimeout设为5秒,避免连接长期占用。 - 配置有限次数的重试机制,防止失败请求堆积。
6. 完善监控与日志分析
- 开启JMX监控,定期采集
nodetool status、nodetool tpstats、nodetool compactionstats等指标,追踪读写队列、压缩任务状态。 - 分析
/opt/cassandra/logs/system.log,查找OOM、IO超时、压缩失败等关键错误,定位问题根源。
内容的提问来源于stack exchange,提问作者Sathyendran Vellaisamy
相关产品推荐
相关产品推荐

