请描述 Cassandra 在写入路径中如何实现高可用性和容错,包括其副本策略、协调者角色、Hinted Handoff 机制以及数据持久化到 commit log 和 memtable 的过程。
考察说明
考查对 Cassandra 分布式写入高可用与容错核心机制的理解。
回答思路
- 【回答框架 1】Cassandra 采用分区与副本策略,副本数由 Replication Factor 决定,数据按分区键哈希分布到多个节点,每个分区在多个节点上存副本。写入请求由协调者节点处理,协调者根据一致性级别(如 QUORUM)决定等待多少副本确认。
- 【回答框架 2】写入首先追加到 commit log(预写日志)确保持久性,然后写入 memtable(内存表)。commit log 防止节点崩溃时数据丢失,memtable 定期刷写为 SSTable。
- 【回答框架 3】高可用通过 Hinted Handoff 实现:若某个副本节点不可用,协调者会本地保存写提示(hint),待该节点恢复后重放。默认超时 3 小时,若超时未恢复,数据可能需通过修复机制(如 read repair 或 nodetool repair)补偿。
- 【回答框架 4】容错还依赖故障检测和 gossip 协议,节点状态变化被传播。同时,一致性级别可调整,如 ONE、QUORUM、ALL,影响可用性与一致性权衡。写入请求在副本确认前不会返回成功,协调者负责处理超时和重试。
- 【关键点 1】副本策略决定数据分布,协调者负责路由和等待确认。
- 【关键点 2】commit log 保证持久性,memtable 缓冲写入。
- 【关键点 3】Hinted Handoff 提供临时高可用,恢复后重放写提示。
- 【关键点 4】一致性级别(如 QUORUM)权衡可用性与一致性。
- 【关键点 5】gossip 协议维护节点状态,支持容错。
- 【易错点 1】不要将 Hinted Handoff 视为持久化保证,超时或节点长时间故障可能丢失提示,需依赖修复机制。
- 【易错点 2】不要认为 ALL 级别总能提高可靠性,它牺牲可用性,当任何副本不可用时写入失败。
- 【易错点 3】commit log 虽持久,但仅追加,不提供随机读,可能误解其作用。