瞬时复制
瞬时复制 (CASSANDRA-14404) 是一项实验性功能,专为能够验证其应用程序和部署中数据库各个方面的 Apache Cassandra 专家用户而设计。这意味着能够检查读取、写入、停用、删除、重建、修复和替换等操作是否与您的查询、数据、配置、操作实践和可用性要求一起正常工作。Apache Cassandra 4.0 包含瞬时复制的初始实现。Cassandra 的未来版本将使此功能更适合更广泛的受众。预计未来版本将支持使用瞬时复制的单调读取,以及 LWT、日志批处理和计数器。由于是实验性功能,因此 **不** 建议在生产环境中使用瞬时复制。 |
目标
瞬时复制的目标是使用增量修复将存储需求与数据冗余(或共识组大小)分离,以减少存储开销。某些节点充当完整副本(存储给定令牌范围的所有数据),而某些节点充当瞬时副本,仅存储相同令牌范围的未修复数据。
瞬时复制可以实现的优化称为“廉价仲裁”,这意味着数据冗余增加,但不会相应地增加存储使用量。
当无法获得足够的完整副本以接收和存储所有数据时,瞬时复制非常有用。瞬时复制允许您配置一个副本子集,使其仅复制尚未进行增量修复的数据。作为一种优化,如果我们已成功将数据写入完整副本,则可以避免将数据写入瞬时副本。
增量修复后,存储在瞬时副本上的瞬时数据可以丢弃。
启用瞬时复制
默认情况下不会启用瞬时复制。必须在集群中的每个节点上单独启用瞬时复制,方法是在 cassandra.yaml
中设置以下配置属性。
transient_replication_enabled: true
可以使用 SimpleStrategy
和 NetworkTopologyStrategy
配置瞬时复制。通过将复制因子设置为 <total_replicas>/<transient_replicas>
来配置瞬时复制。
例如,创建一个复制因子 (RF) 为 3 的键空间。
CREATE KEYSPACE CassandraKeyspaceSimple WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4/1};
另一个例子,some_keysopace keyspace
将在 DC1 中有 3 个副本,其中 1 个是瞬时的,在 DC2 中有 5 个副本,其中 2 个是瞬时的
CREATE KEYSPACE some_keysopace WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : '3/1'', 'DC2' : '5/2'};
瞬时复制的键空间仅支持将 read_repair
设置为 NONE
的表。
重要限制
-
如果某些端点不在正常状态(没有范围移动),则无法更改 RF。
-
如果存在任何瞬时副本,则无法添加完整副本。您必须先删除所有瞬时副本,然后更改完整副本的数量,最后添加回瞬时副本。
-
您只能在每次增量修复运行之间安全地一次增加一个瞬时副本的数量。
此外,瞬时复制不能用于
-
单调读取
-
轻量级事务 (LWT)
-
日志批处理
-
计数器
-
使用物化视图的键空间
-
辅助索引 (2i)
廉价仲裁
廉价仲裁是对写入路径的一组优化,除非无法获得足够的完整副本以满足请求的一致性级别,否则不会写入瞬时副本。不会为瞬时副本写入提示。读取路径上的优化优先从瞬时副本读取。当以仲裁写入到配置为使用瞬时复制的表时,仲裁将始终优先选择可用的完整副本而不是瞬时副本,以便瞬时副本不必处理写入。当完整副本速度缓慢或不可用时,通过将写入发送到瞬时副本,快速写入保护(类似于快速读取保护)会减少尾部延迟。瞬时副本可以更快地提供读取服务,因为如果它们没有数据,它们不必执行超出布隆过滤器检查的任何操作。使用 vnodes 和大型集群规模,即使一个或多个完整副本发生故障,它们也不会拥有大量数据,在这种情况下,瞬时副本开始为其部分瞬时复制的范围提供稳定的写入流量。
推测写入选项
CREATE TABLE
添加了一个选项 speculative_write_threshold
,用于与瞬时副本一起使用。该选项的类型为 simple
,默认值为 99PERCENTILE
。当副本速度缓慢或无响应时,speculative_write_threshold
指定将廉价仲裁写入升级为包含瞬时副本的阈值。
挂起范围和瞬时副本
挂起范围是指令牌范围在瞬时副本之间移动。当瞬时范围移动时,会有一段时间需要两个瞬时副本都接收针对逻辑瞬时副本的任何写入,以便在移动生效后读取仲裁能够返回响应。节点在扩展期间 *不会* 临时成为瞬时副本。它们像完整副本一样流式传输数据,然后才能提供读取服务。会产生一个挂起状态,类似于完整副本的挂起状态。瞬时副本在挂起时也始终接收写入。挂起的瞬时范围会收到更多数据,并且会避免从它们读取。
读取修复和瞬时副本
读取修复从不尝试修复瞬时副本。读取始终包含至少一个完整副本。它们还应尽可能优先选择瞬时副本。范围扫描确保整个扫描范围执行满足以下要求的副本选择:每个扫描范围都包含一个完整副本。在增量和验证修复处理期间,在瞬时副本上,反压缩不会为瞬时范围输出任何数据,因为数据将在修复后被丢弃,并且不会将数据流式传输到瞬时副本。
在完整副本和瞬时副本之间转换
瞬时复制引入的额外状态转换要求流式传输和 nodetool cleanup
的行为有所不同。当数据被流式传输时,确保它是从完整副本而不是瞬时副本流式传输的。
从未复制转换为瞬时复制意味着节点必须保持挂起状态,直到下一个增量修复完成,此时已知该范围的数据在完整副本中可用。
从瞬时复制转换为完整复制需要从完整副本流式传输数据,这与从未复制转换为复制时数据流式传输的方式相同。转换的管理方式是,在流式传输完成之前,不会将瞬时副本作为完整副本读取。它可以立即用于写入仲裁。
从完整复制转换为瞬时复制需要清理,以从瞬时复制的范围内删除已修复的数据,以回收空间。它可以立即用于写入仲裁。
从瞬时复制转换为未复制需要运行清理以删除以前瞬时复制的数据。
当使用瞬时复制时,支持环更改,包括添加/删除节点、更改 RF、添加/删除 DC。
瞬时复制支持 EACH_QUORUM
(CASSANDRA-14727) 添加了对 EACH_QUORUM
的瞬时复制支持。根据 (CASSANDRA-14768),我们确保至少写入每个 DC 中的 QUORUM
个节点,无论我们需要等待多少响应以及我们请求的一致性级别如何。这是为了最大程度地减少使用瞬时复制的用户感到意外;对于正常写入,我们通过写入每个节点来软确保我们到达所有 DC 中的 QUORUM
;即使我们不等待 ACK,我们在这两种情况下都已发送了足够的消息。