Contents

Cassandra 一致性水平

1. 概述

Apache Cassandra 是一个开源、NoSQL、高可用性和可扩展的分布式数据库。为了实现高可用性,Cassandra 依赖于跨集群的数据复制。

在本教程中,我们将了解 Cassandra 如何为我们提供控制以管理数据的一致性,同时复制数据以实现高可用性。

2. 数据复制

**数据复制是指将每一行的副本存储在多个节点中。**数据复制的原因是为了保证可靠性和容错性。因此,如果任何节点因任何原因发生故障,复制策略会确保相同的数据在其他节点中可用。

复制因子 ( RF ) 指定集群中有多少节点将存储副本。

有两种可用的复制策略:

**SimpleStrategy用于单个数据中心和一个机架拓扑。**首先,Cassandra 使用分区器逻辑来确定放置行的节点。然后它在环中顺时针方向将额外的副本放在下一个节点上。

**NetworkTopologyStrategy通常用于多个数据中心和多个机架。**此外,它还允许您为每个数据中心指定不同的复制因子。在数据中心内,它将副本分配到不同的机架以最大限度地提高可用性。

3. 一致性级别

**一致性表示一行数据的所有副本的最新和同步程度。**随着跨分布式系统的数据复制,实现数据一致性是一项非常复杂的任务。

**Cassandra 更喜欢可用性而不是一致性。**它没有针对一致性进行优化。相反,它使您可以灵活地根据您的用例调整一致性。在大多数用例中,Cassandra 依赖于最终的一致性。

让我们看看数据写入和读取过程中的一致性级别影响。

4. 写入一致性级别 (CL)

**对于写操作,一致性级别指定在协调器成功向客户端报告之前必须确认多少副本节点。**更重要的是,确认的节点数量(对于给定的一致性级别)和存储副本的节点数量(对于给定的 RF)大多不同。

例如,在一致性级别 ONE 和 RF = 3 的情况下,即使只有一个副本节点确认成功写入操作,Cassandra 也会在后台将数据异步复制到其他 2 个节点。

让我们看一些可用于成功写入操作的一致性级别选项。

一致性级别ONE意味着它只需要一个副本节点的确认。由于只需要确认一个副本,因此在这种情况下写入操作是最快的。

一致性级别QUORUM意味着它需要来自所有数据中心的 51% 或大多数副本节点的确认。

LOCAL_QUORUM的一致性级别意味着它需要 51% 或与协调器位于同一数据中心内的大多数副本节点的确认。因此,它避免了数据中心间通信的延迟。

ALL的一致性级别意味着它需要来自所有副本节点的确认。由于所有副本节点都需要确认,因此在这种情况下写入操作是最慢的。此外,如果其中一个副本节点在写入操作期间发生故障,它会失败,并且可用性会受到影响。因此,最佳实践是不要在生产部署中使用此选项。

我们可以为每个写查询或全局查询级别配置一致性 级别。

下图显示了写入时CL的几个示例:

/uploads/cassandra_consistency_levels/1.png

5. 读取一致性级别 (CL)

对于读操作,一致性级别指定在协调器成功将数据发送回客户端之前,必须有多少个副本节点响应最新的一致数据。

让我们看一下 Cassandra 成功返回数据的读取操作可用的一些一致性级别选项。

一致性级别ONE表示只有一个副本节点返回数据。在这种情况下,数据检索是最快的。

一致性级别QUORUM意味着所有数据中心的 51% 或大多数副本节点响应。然后协调器将数据返回给客户端。在多个数据中心的情况下,数据中心间通信的延迟会导致读取缓慢。

LOCAL_QUORUM的一致性级别意味着同一数据中心内的 51% 或大多数副本节点。当协调器响应时,协调器将数据返回给客户端。因此,它避免了数据中心间通信的延迟。

ALL的一致性级别意味着所有副本节点都响应,然后协调器将数据返回给客户端。由于所有副本节点都需要确认,因此在这种情况下读取操作是最慢的。此外,如果其中一个副本节点在读取操作期间发生故障,它就会失败,并且可用性会受到影响。最佳实践是不要在生产部署中使用此选项。

我们可以为每个写查询或全局查询级别配置一致性 级别。

下图显示了读取时CL的几个示例:

/uploads/cassandra_consistency_levels/3.png

6. 强一致性

强一致性意味着无论最新写入和后续读取之间有多少时间,您都在将最新写入的数据读入集群。

我们在前面的部分中看到了如何为写入和读取指定所需的一致性级别 ( CL )。

如果 W + R > RF ,则可以实现强一致性,其中R - 读取CL副本数,W - 写入CL副本数,RF - 复制因子。

在这种情况下,您将获得强一致性,因为所有客户端读取始终获取最新写入的数据。

让我们看几个强一致性级别的例子:

6.1. 写入 CL = QUORUM 并读取 CL = QUORUM

如果RF = 3,W = QUORUMLOCAL_QUORUMR = QUORUMLOCAL_QUORUM,则W (2) + R (2) > RF (3)

在这种情况下,写操作确保两个副本具有最新的数据。然后读取操作也确保只有在至少两个副本响应一致的最新数据时才能成功接收数据。

6.2. 写入 CL = ALL 并读取 CL = ONE

如果RF = 3,W = ALLR = ONE,则W (3) + R (1) > RF (3)

在这种情况下,一旦协调器向所有副本写入数据,则写入操作成功。然后从其中一个副本中读取数据就足够了,以确保我们读取最新的写入数据。

但正如我们前面所了解的,写 CL 的ALL不是容错的,可用性受到影响。