Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
适用对象:
卡珊德拉
重要
你是否正在寻找一种数据库解决方案,以应对需要高扩展性、99.999% 可用性服务级别协议(SLA)、即时自动扩展和跨多个区域的自动故障转移的场景? 请考虑使用 Azure Cosmos DB for NoSQL。
与 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 一致性级别? 请考虑在一个由六个节点组成的数据中心内,处理具有 LOCAL_QUORUM 和 RF 为 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 的默认一致性(当它仅用于读取请求时)。