本节摘要:备份主路径是 nodetool snapshot(表/keyspace 级 SSTable 硬链)+ 增量 CommitLog/archived CL;恢复用 sstableloader。安全侧启用 PasswordAuthenticator/CassandraAuthorizer、inter-node TLS、客户端 SSL。合并 SOURCE 4.3 备份与 4.4 RBAC。
阅读完本节,你应当能够:
「我们有 3 副本还要备份吗?」——误删 keyspace、逻辑 bug 写脏数据、勒索软件加密磁盘,副本会同步变坏。Mongo 用 mongodump/oplog;HBase 用 ExportSnapshot;Cassandra 靠 snapshot 不拷贝字节(硬链)做节点级时间点。安全合规(SOC2)还要求 RBAC 与传输加密——默认安装是 AllowAllAuthenticator,生产必须改。
Snapshot:
nodetool snapshot -t backup_20240814 ks1 # 产物在 data/*/snapshots/backup_20240814/
多节点需每节点 snapshot 同一时刻(自动化脚本 + 时钟同步)。Offsite:rsync/S3;配合 commitlog_archiving_directory 缩 RPO。
恢复:停节点 → 清空 data(慎)→ 拷回 SSTable → sstableloader 或直接放目录 → repair。
| 方式 | RPO | RTO | 对比 Mongo |
|---|---|---|---|
| 仅副本 | 0 逻辑删无救 | N/A | 同 |
| 日 snapshot | 24h | 小时级 | mongodump 类似 |
| snap + CL archive | 分钟级 | 小时级 | oplog 连续 |
RBAC(SOURCE 4.4):
CREATE ROLE app_reader WITH PASSWORD = '...' AND LOGIN = true; GRANT SELECT ON KEYSPACE retail TO app_reader; CREATE ROLE app_writer WITH PASSWORD = '...' AND LOGIN = true; GRANT MODIFY ON KEYSPACE retail TO app_writer;
加密:
# cassandra.yaml client_encryption_options: enabled: true keystore: conf/.keystore server_encryption_options: internode_encryption: all keystore: conf/.keystore
internode_encryption: all 覆盖 Gossip 与 streaming;性能损耗约 5–15%,多 DC 仍建议开。
LDAP:企业可 com.instaclustr.cassandra.auth.LDAPAuthenticator 等插件。
审计:cassandra.yaml audit_logging_options 记录 DDL/DCL。
密钥轮换:双 keystore 滚动重启,配合 rack 级串行。
⚠️ 常见坑:只 snapshot 一个节点就当全库备份——每个 token range 的主副本可能分散。
💡 关键直觉:备份防的是「逻辑错误与运维误操作」,不是节点宕机——后者靠 RF+repair。
第5章在性能面讨论 JVM GC、批写与竞品选型。
# 备份:每个节点打同一 tag 的快照,再拷贝 offsite nodetool snapshot -t bk_$(date +%F) shop # 产物在 data/*/snapshots/bk_2024-08-14/ rsync -av /var/lib/cassandra/data/*/snapshots/bk_2024-08-14/ backup-host:/backups/
# 恢复:停掉故障节点 → 清空数据 → 拷回 SSTable → 启动 → repair systemctl stop cassandra rm -rf /var/lib/cassandra/data/shop # 危险操作,务必先确认 rsync -av backup-host:/backups/ /var/lib/cassandra/data/shop/ systemctl start cassandra nodetool repair -full
-- 备份后二次验证:抽样比对主键是否存在 SELECT count(*) FROM shop.orders WHERE order_id = 'ord-1';
恢复的关键不是「拷回来」,而是「拷回来之后」:所有副本必须都恢复或 repair,否则旧版本数据会互相覆盖。RPO 边界由快照周期 + CommitLog 归档决定:纯快照是 24h 级,快照 + commitlog_archiving_directory 可缩到分钟级。
-- 最小权限原则:分角色,不共享账号 CREATE ROLE app_rw WITH PASSWORD = 'change-me' AND LOGIN = true; GRANT SELECT, MODIFY ON KEYSPACE shop TO app_rw; CREATE ROLE ops_admin WITH PASSWORD = 'change-me' AND LOGIN = true; GRANT ALL ON ALL KEYSPACES TO ops_admin; -- 定期轮换密码:删除旧角色或重置密码 ALTER ROLE app_rw WITH PASSWORD = 'new-secret';
# 启用认证与授权(cassandra.yaml) authenticator: PasswordAuthenticator authorizer: CassandraAuthorizer role_manager: CassandraRoleManager
企业实践:应用账号与运维账号分离、密码经密钥管理系统注入、权限按 keyspace 粒度收敛。默认 AllowAllAuthenticator 只能用于开发环境——生产开认证后的第一个动作,是验证你记得超级用户密码。
PasswordAuthenticator 已启用,默认超级用户已改密码server_encryption_options.internode_encryption: allclient_encryption_options.enabled: trueaudit_logging_options 记录 DDL/DCL 操作# 审计日志配置片段 audit_logging_options: enabled: true included_categories: DDL, DCL
安全不是一次配置,而是持续纪律:证书到期前 30 天预警、密码每季度轮换、权限变更走工单留痕。Cassandra 的安全模型没有「全自动」模式,每层都需要运维显式接管。
# 用 keytool 生成节点间 TLS 密钥库(每节点一份,密码不同) keytool -genkeypair -alias cassandra -keyalg RSA \ -storetype JKS -keystore conf/.keystore -validity 730 # 轮换流程:生成新库 → 分节点滚动重启 → 旧库下线 # 每个节点依次执行,全程保持 QUORUM 可用
# 证书路径与密码建议走环境变量注入,不入库 server_encryption_options: internode_encryption: all keystore: ${CASSANDRA_KEYSTORE} keystore_password: ${CASSANDRA_KEYSTORE_PASSWORD}
# 验证加密是否生效:抓包看到的是密文 tcpdump -i eth0 -nn port 7000 | head -5
证书轮换的关键是「滚动」:一次只动一个节点,验证该节点与其他节点的 TLS 握手正常后再动下一个。若全局同时换证,任一步配置错误都会让整个环失联。这与 4.x 的 Zero-Downtime Rolling Upgrade 思想一脉相承:分布式系统的任何变更,都要设计成可逐点验证的滚动作业。