Apache Cassandra 和 Azure Cosmos DB for Apache Cassandra 一致性级别
适用对象: Cassandra
与 Azure Cosmos DB 不同,Apache Cassandra 本身并不提供精确定义的一致性保证。 与之相反,Apache Cassandra 提供一个写入一致性级别和一个读取一致性级别,以便进行高可用性、一致性和延迟方面的权衡。 使用 Azure Cosmos DB for Cassandra 时:
- Apache Cassandra 的写入一致性级别映射到在 Azure Cosmos DB 帐户上配置的默认一致性级别。 写入操作 (CL) 的一致性不能因请求的不同而(即按请求)更改。
- Azure Cosmos DB 将动态映射 Cassandra 客户端驱动程序指定的读取一致性级别。 一致性级别将映射到在读取请求上动态配置的其中某个 Azure Cosmos DB 一致性级别。
多区域写入与单区域写入
默认情况下,Apache Cassandra 数据库是一个多主数据库系统,不提供使用单区域进行写入并使用多区域复制进行读取的现成选项。 但是,Azure Cosmos DB 提供了允许单区域写入配置的全包式功能。 能够跨多个区域选择单区域写入配置的优点之一是可以避免跨区域冲突情况,并且可以选择跨多个区域保持强一致性。
使用单区域写入,可以保持强一致性,同时可以通过服务托管故障转移跨区域保持一定级别的高可用性。 在此配置中,你仍然可以利用数据局部性,通过将每个请求降级到最终一致性来减少读取延迟。 除了这些功能以外,Azure Cosmos DB 平台还在选择区域时提供了区域冗余选项。 因此,与原生 Apache Cassandra 不同,Azure Cosmos DB 允许你以更细的粒度浏览 CAP 定理权衡范围。
映射一致性级别
Azure Cosmos DB 平台提供了一组五个定义明确、面向业务用例的复制一致性设置。 这些一致性设置的权衡由 CAP 和 PACLC 定理定义。 由于此方法与 Apache Cassandra 有很大不同,因此建议花时间查看并了解 Azure Cosmos DB 一致性。 下表说明了使用 API for Cassandra 时 Apache Cassandra 与 Azure Cosmos DB 一致性级别之间的可能映射。 此表显示了针对单区域读取、多区域读取以及单区域写入和多区域写入的配置。
映射
注意
这些不是确切的映射。 更确切地说,我们提供了与 Apache Cassandra 最接近的类似物,并在最右边的列中消除了任何定性差异的歧义。 如上所述,我们建议查看 Azure Cosmos DB 的一致性设置。
Apache Cassandra 中的 ALL
、EACH_QUOROM
、QUOROM
、LOCAL_QUORUM
或 THREE
写入一致性
Apache 读取一致性 | 读取位置 | 最接近 Apache Cassandra 读/写设置的 Azure Cosmos DB 一致性级别 |
---|---|---|
ALL |
本地区域 | Strong |
EACH_QUOROM |
本地区域 | Strong |
QUOROM |
本地区域 | Strong |
LOCAL_QUORUM |
本地区域 | Strong |
LOCAL_ONE |
本地区域 | Eventual |
ONE |
本地区域 | Eventual |
TWO |
本地区域 | Strong |
THREE |
本地区域 | Strong |
与 Apache 和 DSE Cassandra 不同,Azure Cosmos DB 默认持久地提交仲裁写入。 至少四分之三 (3/4) 的节点将写入提交到磁盘,而不仅仅是内存中的提交日志。
Apache Cassandra 中的 ONE
、LOCAL_ONE
或 ANY
写入一致性
Apache 读取一致性 | 读取位置 | 最接近 Apache Cassandra 读/写设置的 Azure Cosmos DB 一致性级别 |
---|---|---|
ALL |
本地区域 | Strong |
EACH_QUOROM |
本地区域 | Eventual |
QUOROM |
本地区域 | Eventual |
LOCAL_QUORUM |
本地区域 | Eventual |
LOCAL_ONE |
本地区域 | Eventual |
ONE |
本地区域 | Eventual |
TWO |
本地区域 | Eventual |
THREE |
本地区域 | Eventual |
默认情况下,Azure Cosmos DB API for Cassandra 始终持久地提交仲裁写入,因此可以利用所有读取一致性。
Apache Cassandra 中的 TWO
写入一致性
Apache 读取一致性 | 读取位置 | 最接近 Apache Cassandra 读/写设置的 Azure Cosmos DB 一致性级别 |
---|---|---|
ALL |
本地区域 | Strong |
EACH_QUOROM |
本地区域 | Strong |
QUOROM |
本地区域 | Strong |
LOCAL_QUORUM |
本地区域 | Strong |
LOCAL_ONE |
本地区域 | Eventual |
ONE |
本地区域 | Eventual |
TWO |
本地区域 | Eventual |
THREE |
本地区域 | Strong |
Azure Cosmos DB 仅对两个节点没有写入一致性的概念,因此在大多数情况下,我们将此一致性视为类似于仲裁。 对于读取一致性 TWO
,此一致性等效于使用 QUOROM
进行写入并从 ONE
读取。
Apache Cassandra 中的 Serial
或 Local_Serial
写入一致性
Apache 读取一致性 | 读取位置 | 最接近 Apache Cassandra 读/写设置的 Azure Cosmos DB 一致性级别 |
---|---|---|
ALL |
本地区域 | Strong |
EACH_QUOROM |
本地区域 | Strong |
QUOROM |
本地区域 | Strong |
LOCAL_QUORUM |
本地区域 | Strong |
LOCAL_ONE |
本地区域 | Eventual |
ONE |
本地区域 | Eventual |
TWO |
本地区域 | Strong |
THREE |
本地区域 | Strong |
串行仅适用于轻量级事务。 Azure Cosmos DB 默认遵循持久提交的算法,因此 Serial
一致性类似于仲裁。
用于单区域写入的其他区域
Azure Cosmos DB 有助于跨配置了单区域写入的多个区域进行五种一致性设置,包括强一致性设置。 只要区域之间的距离在 2,000 英里以内,就会产生这种好处。
Azure Cosmos DB 没有适用于 Apache Cassandra 的映射,因为所有节点/区域都是写入的,并且不可能在所有区域中实现强一致性保证。
用于多区域写入的其他区域
Azure Cosmos DB 仅有助于进行四种一致性设置;eventual
、consistent prefix
、session
和 bounded staleness
跨配置了多区域写入的多个区域。
无论设置如何,Apache Cassandra 都只会为跨其他区域的读取操作提供最终一致性。
支持动态替代
Azure Cosmos DB 帐户设置 | 替代客户端请求中的值 | 替代效果 |
---|---|---|
Strong |
All |
无效(保持为 strong ) |
Strong |
Quorum |
无效(保持为 strong ) |
Strong |
LocalQuorum |
无效(保持为 strong ) |
Strong |
Two |
无效(保持为 strong ) |
Strong |
Three |
无效(保持为 strong ) |
Strong |
Serial |
无效(保持为 strong ) |
Strong |
LocalSerial |
无效(保持为 strong ) |
Strong |
One |
对 Eventual 的一致性更改 |
Strong |
LocalOne |
对 Eventual 的一致性更改 |
Strong |
Any |
不允许(错误) |
Strong |
EachQuorum |
不允许(错误) |
Bounded staleness 、session 或 consistent prefix |
All |
不允许(错误) |
Bounded staleness 、session 或 consistent prefix |
Quorum |
不允许(错误) |
Bounded staleness 、session 或 consistent prefix |
LocalQuorum |
不允许(错误) |
Bounded staleness 、session 或 consistent prefix |
Two |
不允许(错误) |
Bounded staleness 、session 或 consistent prefix |
Three |
不允许(错误) |
Bounded staleness 、session 或 consistent prefix |
Serial |
不允许(错误) |
Bounded staleness 、session 或 consistent prefix |
LocalSerial |
不允许(错误) |
Bounded staleness 、session 或 consistent prefix |
One |
对 Eventual 的一致性更改 |
Bounded staleness 、session 或 consistent prefix |
LocalOne |
对 Eventual 的一致性更改 |
Bounded staleness 、session 或 consistent prefix |
Any |
不允许(错误) |
Bounded staleness 、session 或 consistent prefix |
EachQuorum |
不允许(错误) |
指标
如果 Azure Cosmos DB 帐户配置了除强一致性以外的一致性级别,请查看概率有限过期 (PBS) 指标。 该指标捕获客户端可能会为工作负载获取强大且一致的读取操作的概率。 此指标在 Azure 门户中公开。 若要详细了解 PBS 指标,请参阅监视概率有限过期 (PBS) 指标。
概率有限过期显示了最终一致性的最终程度。 通过此指标可深入了解在 Azure Cosmos DB 帐户中获得比目前配置的一致性级别更强的一致性的频率。 换句话说,可看到获得写入和读取区域组合的一致读取的概率(以毫秒计量)。
Apache Cassandra 中写入请求的多区域强一致性
Apache Cassandra、EACH_QUORUM
或 QUORUM
的设置提供了强一致性。 当将写入请求发送到某个区域时,EACH_QUORUM
会将数据持久保存在每个数据中心的仲裁节点数中。 此持久性要求每个数据中心都可用,这样写入操作才能成功。 QUORUM
的限制稍微少一些,在确认写入操作成功之前,需要跨所有数据中心的 QUORUM
节点数才能持久保存数据。
下图说明了 Apache Cassandra 中区域 1 和区域 2 之间的多区域强一致性设置。 在将数据写入区域 1 后,需要在区域 1 和区域 2 中的仲裁节点数中持久保存写入,然后应用程序才会收到确认。
Azure Cosmos DB for Apache Cassandra 中写入请求的多区域强一致性
在 Azure Cosmos DB 中,一致性是在帐户级别设置的。 通过 Azure Cosmos DB for Cassandra 中的 Strong
一致性,数据将同步复制到帐户的读取区域。 Azure Cosmos DB 帐户所在的区域越远,一致写入操作的延迟就越高。
区域数如何影响读取或写入请求:
- 两个区域:对于强一致性,仲裁为
(N/2 + 1) = 2
。 因此,如果读取区域出现故障,帐户将不再接受具有强一致性的写入,因为要将写入复制到的区域的仲裁数不可用。 - 三个或更多区域:对于
N = 3
,quorum = 2
。 如果其中一个读取区域出现故障,则写入区域仍可将写入复制到总共两个满足仲裁要求的区域。 同样,对于四个区域,quorum = 4/2 + 1 = 3
。 即使一个读取区域出现故障,也可以满足仲裁要求。
注意
如果所有写入操作都需要多区域强一致性,则 Azure Cosmos DB for Cassandra 帐户的一致性必须设置为“强”。 在 Azure Cosmos DB 中,不能基于每个请求将写入操作的一致性级别替代为较低的一致性级别。
Apache Cassandra 中写入请求的弱一致性
ANY
、ONE
、TWO
、THREE
、LOCAL_QUORUM
、Serial
或 Local_Serial
一致性级别? 考虑在六个节点的数据中心中使用 RF
、LOCAL_QUORUM
为 4
的写入请求。 Quorum = 4/2 + 1 = 3
。
Azure Cosmos DB for Apache Cassandra 中写入请求的弱一致性
当发送具有任何低于 Strong
的一致性级别的写入请求时,只要本地区域在至少四分之三的副本中持续写入,就会返回成功响应。
Apache Cassandra 中读取请求的多区域强一致性
借助 EACH_QUORUM
的一致性,可以在 Apache Cassandra 中实现一致的读取。 在 EACH_QUORUM
的多区域设置中,如果不满足每个区域中的仲裁节点数,则读取将失败。
Azure Cosmos DB for Apache Cassandra 中读取请求的多区域强一致性
读取请求由指定区域中的两个副本提供。 由于写入已经处理了持久化到仲裁区域数以及所有区域(如果每个区域都可用),只需从指定区域中的两个副本读取即可提供强一致性。 此强一致性要求在针对 Cosmos DB 帐户所在的区域发出读取操作时在驱动程序中指定 EACH_QUORUM
,并将“强一致性”作为帐户的默认一致性级别。
Apache Cassandra 中的本地强一致性
具有 TWO
、THREE
或 LOCAL_QUORUM
一致性级别的读取请求将提供来自本地区域的强一致性读取。 对于 LOCAL_QUORUM
一致性级别,需要来自指定数据中心中的两个节点的响应才能成功读取。
Azure Cosmos DB for Apache Cassandra 中的本地强一致性
在 Azure Cosmos DB for Cassandra 中,具有 TWO
、THREE
或 LOCAL_QUORUM
一致性级别将为读取请求提供本地强一致性。 由于写入路径保证复制到至少四分之三的副本,因此从指定区域中的两个副本进行读取将保证对该区域中的数据进行仲裁读取。
Apache Cassandra 中的最终一致性
LOCAL_ONE
、One
和 ANY with LOCAL_ONE
一致性级别将生成最终一致性。 此一致性用于侧重于延迟的情况。
Azure Cosmos DB for Apache Cassandra 中的最终一致性?
LOCAL_ONE
、ONE
或 Any
一致性级别将提供最终一致性。 使用最终一致性,仅从指定区域中的一个副本进行读取。
替代 Azure Cosmos DB for Cassandra 中读取操作的一致性级别
以前,读取请求的一致性级别只能被替代为低于帐户默认设置的一致性。 例如,使用默认的“强”一致性,默认情况下可以使用“强”发出读取请求,并在每个请求的基础上(如果需要)将其替代为比“强”弱的一致性级别。 但是,无法使用高于帐户默认值的替代一致性级别发出读取请求。 具有最终一致性的帐户无法接收一致性级别高于最终一致性(在 Apache Cassandra 驱动程序中转换为 TWO
、THREE
、LOCAL_QUORUM
或 QUORUM
)的读取请求。
Azure Cosmos DB for Cassandra 现在有助于将读取请求的一致性替代为高于帐户默认一致性的值。 例如,将 Cosmos DB 帐户的默认一致性设置为“最终”(Apache Cassandra 等效于 One
或 ANY
)后,读取请求可以基于每个请求被替代为 LOCAL_QUORUM
。 此替代可确保在按照 LOCAL_QUORUM
的要求返回结果集之前,会查询指定区域内的仲裁副本数。
此选项还可以避免设置高于 Eventual
的默认一致性(当它仅用于读取请求时)。
后续步骤
详细了解 Azure Cosmos DB 的多区域分布和一致性级别: