Cassandra 架构

2025年3月17日 | 阅读 3 分钟

Cassandra 的设计目的是在没有单点故障的情况下处理跨多个节点的大数据工作负载。它在其节点之间有一个对等分布式系统,数据分布在集群中的所有节点之间。

  • 在 Cassandra 中,每个节点都是独立的,同时与其他节点互连。集群中的所有节点都扮演相同的角色。
  • 集群中的每个节点都可以接受读写请求,而不管数据实际上位于集群中的哪个位置。
  • 如果一个节点发生故障,可以从网络中的其他节点提供读/写请求。

Cassandra 中的数据复制

在 Cassandra 中,集群中的节点充当给定数据的副本。如果某些节点以过时的值响应,Cassandra 将向客户端返回最新值。在返回最新值后,Cassandra 在后台执行读取修复以更新陈旧值。

请参阅下图以了解 Cassandra 如何使用数据复制在集群中的节点之间确保没有单点故障的示意图。

Cassandra Architecture 1


Cassandra 的组成部分

Cassandra 的主要组成部分是

  • 节点: Cassandra 节点是存储数据的地方。
  • 数据中心: 数据中心是相关节点的集合。
  • 集群: 集群是包含一个或多个数据中心的组件。
  • 提交日志: 在 Cassandra 中,提交日志是一种崩溃恢复机制。每个写操作都写入提交日志。
  • Mem-table: Mem-table 是一种驻留在内存中的数据结构。在提交日志之后,数据将被写入 mem-table。有时,对于单个列族,将有多个 mem-table。
  • SSTable: 这是一个磁盘文件,当其内容达到阈值时,数据将从 mem-table 刷新到该磁盘文件。
  • Bloom 过滤器: 这些只不过是用于测试元素是否为集合成员的快速、非确定性算法。它是一种特殊的缓存。Bloom 过滤器在每次查询后都会被访问。

Cassandra 查询语言

Cassandra 查询语言 (CQL) 用于通过其节点访问 Cassandra。CQL 将数据库 (Keyspace) 视为表的容器。程序员使用 cqlsh:一个提示符来使用 CQL 或单独的应用程序语言驱动程序。

客户端可以访问任何节点以进行读写操作。该节点(协调器)充当客户端和保存数据的节点之间的代理。


写操作

节点的每个写活动都由写入节点的提交日志捕获。稍后,数据将被捕获并存储在 mem-table 中。每当 mem-table 满时,数据将被写入 SStable 数据文件。所有写入都会自动在整个集群中进行分区和复制。Cassandra 会定期整合 SSTables,丢弃不必要的数据。

Cassandra Architecture 2


读操作

在读操作中,Cassandra 从 mem-table 获取值,并检查布隆过滤器以找到包含所需数据的适当 SSTable。

协调器向副本发送三种类型的读取请求。

  • 直接请求
  • 摘要请求
  • 读取修复请求

协调器向其中一个副本发送直接请求。之后,协调器将摘要请求发送给一致性级别指定的副本数量,并检查返回的数据是否为更新后的数据。

之后,协调器将摘要请求发送给所有剩余的副本。如果任何节点给出了过时的值,则后台读取修复请求将更新该数据。此过程称为读取修复机制。

Cassandra Architecture 3