Cassandra 集群配置与运维实战

Cassandra 集群配置与运维实战 1. 三节点Cassandra集群搭建全流程第一次接触Cassandra集群部署时我被它去中心化的架构设计惊艳到了。与传统主从数据库不同Cassandra所有节点完全对等这种设计让扩容变得异常简单。下面我就用最直白的语言带你从零搭建一个生产可用的三节点集群。环境准备就像盖房子打地基三个CentOS 7/8虚拟机需要先做好基础配置。每台机器我都习惯先执行hostnamectl set-hostname cassandra-nodeXX替换为1-3这样后续操作不容易混淆机器。网络配置要特别注意静态IP设置示例用192.168.1.101~103互相添加hosts解析关闭防火墙和SELinux测试环境安装JDK 11有个小坑OpenJDK默认GC参数在Cassandra 4.x会报警告。我推荐用以下命令优化安装yum install -y java-11-openjdk echo JVM_OPTS$JVM_OPTS -XX:UseG1GC /etc/profile.d/cassandra.sh2. 配置文件精讲与差异化设置Cassandra的核心配置文件cassandra.yaml就像汽车的控制面板每个参数都直接影响性能表现。经过多次压测验证这几个关键参数需要特别注意集群标识参数所有节点必须一致cluster_name: ProductionCluster num_tokens: 256 # 每个节点的虚拟节点数 seed_provider: - class_name: org.apache.cassandra.locator.SimpleSeedProvider parameters: - seeds: 192.168.1.101,192.168.1.102 # 种子节点IP节点专属参数每台机器不同listen_address: 当前节点IP # 集群内部通信地址 rpc_address: 当前节点IP # 客户端连接地址 endpoint_snitch: GossipingPropertyFileSnitch # 推荐生产环境使用存储路径配置建议将数据、提交日志、缓存分开磁盘存放能显著提升IO性能data_file_directories: - /data/cassandra/data commitlog_directory: /ssd/cassandra/commitlog saved_caches_directory: /ssd/cassandra/saved_caches3. 集群启动与健康检查实战启动顺序有讲究先启动种子节点再启动其他节点。我习惯用tmux多窗口同时操作# 在种子节点执行 /usr/local/cassandra/bin/cassandra -R # 在其他节点执行前先用nodetool检查种子节点状态 /usr/local/cassandra/bin/nodetool -h 192.168.1.101 status健康检查不能只看表面我总结了一套组合拳基础状态检查nodetool describecluster # 查看集群拓扑 nodetool gossipinfo # 检查节点间通信性能指标监控nodetool tpstats # 线程池状态 nodetool tablestats # 表级指标数据分布验证nodetool ring # 查看token分布 nodetool cfstats # 列族统计遇到节点无法加入集群时先检查/var/log/cassandra/system.log日志。常见问题有 - 种子节点未启动 - 防火墙阻止7000端口通信 - 系统时间不同步需要NTP服务 ## 4. 生产级运维脚本开发 手工操作容易出错我开发了一套自动化脚本包含以下功能模块 **集群控制脚本**支持滚动重启 bash #!/bin/bash NODES(192.168.1.101 192.168.1.102 192.168.1.103) graceful_restart() { ssh $1 nodetool drain systemctl stop cassandra scp new_config/cassandra.yaml $1:/etc/cassandra/ ssh $1 systemctl start cassandra nodetool upgradesstables } for node in ${NODES[]}; do echo Processing $node... graceful_restart $node sleep 120 # 等待节点恢复 done监控告警脚本集成Prometheus指标import subprocess from prometheus_client import Gauge cluster_health Gauge(cassandra_cluster_health, Cluster status) node_status Gauge(cassandra_node_up, Node status, [node]) def check_cluster(): try: output subprocess.check_output([nodetool, status]) # 解析输出设置指标值 if UN in output: cluster_health.set(1) else: cluster_health.set(0) except: cluster_health.set(0)备份恢复方案快照备份nodetool snapshot -t backup_202405增量备份配合commitlog归档S3存储脚本示例aws s3 sync /var/lib/cassandra/data s3://mybucket/backup/ \ --exclude * --include */snapshots/backup_202405/*5. 性能调优黄金法则经过多个生产集群的锤炼我总结出这些立竿见影的优化技巧JVM调参秘籍堆内存不超过32GB避免GC停顿G1GC参数模板JVM_OPTS$JVM_OPTS -Xms32G -Xmx32G JVM_OPTS$JVM_OPTS -XX:UseG1GC JVM_OPTS$JVM_OPTS -XX:MaxGCPauseMillis300Linux系统优化# 禁用swap swapoff -a echo vm.swappiness 1 /etc/sysctl.conf # 提升文件句柄限制 echo cassandra - memlock unlimited /etc/security/limits.conf echo cassandra - nofile 100000 /etc/security/limits.confCassandra专属配置concurrent_reads: 32 concurrent_writes: 32 memtable_allocation_type: offheap_objects压测时推荐使用cassandra-stress工具这个是我常用的测试模板cassandra-stress write n1000000 -rate threads50 \ -node 192.168.1.101 -log filestress.log6. 客户端连接最佳实践虽然Cassandra支持多种驱动但Java客户端仍是主流。这个Spring Boot配置模板可以直接套用Configuration public class CassandraConfig { Value(${cassandra.contactPoints}) private String contactPoints; Bean public CqlSession session() { return CqlSession.builder() .addContactPoint(InetSocketAddress.createUnresolved(192.168.1.101, 9042)) .withLocalDatacenter(datacenter1) .withAuthCredentials(username, password) .withKeyspace(my_keyspace) .build(); } }连接池优化参数spring: data: cassandra: pool: idle-timeout: 120s max-queue-size: 256 max-requests-per-connection: 32768对于突发流量场景建议启用分页查询和重试策略SimpleStatement statement SimpleStatement.builder(SELECT * FROM user) .setPageSize(1000) .setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM) .setIdempotent(true) .build();7. 常见故障处理手册节点宕机恢复流程检查system.log确认宕机原因如果磁盘完好直接启动即可Cassandra会自动修复磁盘损坏时替换新节点# 新节点加入前先设置auto_bootstrap: false nodetool rebuild --source-node 192.168.1.101读写超时解决方案调整超时阈值read_request_timeout_in_ms: 5000 write_request_timeout_in_ms: 3000检查compaction积压nodetool compactionstats nodetool compact磁盘空间告警处理紧急清理nodetool cleanup nodetool clearsnapshot长期方案调整压缩策略ALTER TABLE my_table WITH compaction { class: TimeWindowCompactionStrategy, compaction_window_unit: DAYS, compaction_window_size: 1 }8. 安全加固方案生产环境必须配置的三大安全措施认证授权配置authenticator: PasswordAuthenticator authorizer: CassandraAuthorizer roles_validity_in_ms: 3600000SSL加密通信# 生成证书 keytool -genkeypair -alias cassandra -keyalg RSA \ -keystore /etc/cassandra/keystore.jks \ -storepass password -keypass password # 修改配置 server_encryption_options: internode_encryption: all keystore: /etc/cassandra/keystore.jks keystore_password: password审计日志配置logger nameorg.apache.cassandra.audit levelINFO additivityfalse appender-ref refAuditLog/ /logger最后提醒一个血泪教训永远不要在生产环境使用默认的JMX端口和密码建议用SSL强密码保护JMX端口-Dcom.sun.management.jmxremote.ssltrue \ -Dcom.sun.management.jmxremote.ssl.need.client.authtrue \ -Djavax.net.ssl.keyStore/path/to/keystore \ -Djavax.net.ssl.keyStorePasswordpassword