Linux Cassandra集群升级:滚动升级与零停机实践
一、Cassandra 升级原理与兼容性
1.1 滚动升级(Rolling Upgrade)原理
Cassandra 无主架构支持混合版本运行:
- 协议兼容:Gossip、Streaming、CQL协议向后兼容
- 数据格式:SSTable格式逐版本演进(需upgradesstables)
过程:
- 全集群升级后,运行upgradesstables转换格式
零停机关键:RF≥3 + QUORUM一致性,确保升级中多数副本可用。
1.2 版本兼容矩阵(截至2026年1月)
- 小版本(5.0.1 → 5.0.6):直接滚动,二进制替换
- 大版本(4.1 → 5.0):官方支持在线滚动,但需注意SSTable格式(mc/mv新格式)
Java兼容:5.0要求Java 11/17(推荐17)
1.3 风险评估
- 中风险:minor(如5.0.0 → 5.0.6)
- 高风险:major(如4 → 5),新特性可能引入回归
生产建议:先读CHANGES.txt与release notes。
二、小版本滚动升级实战(5.0.x 内)
2.1 准备工作
- 备份:全Snapshot + Incremental
- 下载新版本:/opt/apache-cassandra-5.0.6-bin.tar.gz
2.2 单节点升级步骤
对每个节点顺序执行(建议一次1-3节点):
- nodetool drain # flush Memtable,停止写
- 备份旧二进制:mv /opt/cassandra /opt/cassandra-old
- 解压新版本,软链 /opt/cassandra → 新目录
- systemctl start cassandra
- 监控:nodetool status(新节点JOINING → NORMAL)
- nodetool netstats 检查streaming
全集群后:
nodetool upgradesstables # 转换SSTable格式(可选,小版本通常无需)
2.3 自动化脚本
#!/bin/bash
# upgrade_node.sh <host>
HOST=$1
NEW_TAR=/opt/apache-cassandra-5.0.6-bin.tar.gz
ssh $HOST << EOF
nodetool drain
systemctl stop cassandra
mv /opt/cassandra /opt/cassandra-$(date +%Y%m%d)
tar -xzf $NEW_TAR -C /opt
ln -sfn /opt/apache-cassandra-5.0.6 /opt/cassandra
systemctl start cassandra
EOF
# 监控
nodetool status
Ansible playbook更佳。
三、大版本升级实战(4.1 → 5.0)
3.1 特殊准备
- 配置变更:num_tokens降低(5.0推荐32)、memtable_allocation_type=offheap_objects
3.2 升级步骤(滚动)
相同小版本,但额外:
nodetool upgradesstables -a # 全表升级格式(耗IO,夜间)
3.3 零停机保障
- 客户端驱动支持token aware + 降级一致性
四、回滚方案
4.1 小版本回滚
- drain + stop + 切换软链 + start
- 若upgradesstables已跑:不可回(格式变更)
4.2 大版本回滚
- 方案:从备份Snapshot + sstableloader重建旧版本集群
生产黄金法则:升级前必备份,可回滚窗口内禁upgradesstables。
五、常见升级问题排查
- 节点无法加入 → 版本不兼容 → 检查CHANGES.txt协议变更
- Streaming失败 → 新格式不兼容 → 先升级部分节点
- upgradesstables卡住 → IO风暴 → 限速 + 分表
日志关键:grep "Upgrade" system.log
案例:
- 某公司4.1→5.0,upgradesstables后读延迟高 → Trie bloom filter调优,恢复
- 小版本patch,节点OOM → 新bug → 回滚旧版