首页 > 解决方案 > Cassandra 备份和恢复一致性

问题描述

场景如下:我有 1 个 Cassandra 节点,其中有一个键空间,其中有 2 个表。我们将这些表称为 A 和 B。现在我有一个脚本,可以在批处理语句中将数据非常快速地插入这两个表中。表 A 具有列“k”和“value”。表 B 具有列“k”和“值”。批量查询如下:

BEGIN BATCH
INSERT INTO A(k, value) VALUES ("a", 1);
INSERT INTO B(k, value) VALUES ("b", 1);
APPLY BATCH

值 1 会在每个连续的批处理查询中不断增加。所以如果表 A 有 (a, 1000),那么表 B 必须有 (b, 1000)。因为(记录的)批处理查询是原子的。

现在我的问题是,在这种情况下 nodetool 快照如何工作?我已经看过快照的源代码,它似乎是每个键空间、每个表、一张一张地做的。因此,例如,在时间 0,它获取表 A 的快照,其中包含 ("a", 100),然后在时间 1 插入一个新的批处理查询(值为 101),然后在时间 2,它需要b 的快照,这意味着 b 的快照将具有 101 的值,但 a 不会。

如果上面的解释是正确的,那在恢复时会不会造成问题?恢复后表A如何获得(“a”,101)?还是恢复后表B没有(“b”,101)?

标签: cassandrabackuprestoresnapshotnodetool

解决方案


首先,原子性和隔离之间有一条细线。批处理保证两个插入都将被应用(原子性),但它们保证它们将在完全相同的时间应用。(隔离)

客户端仍然能够在选择中读取一个而不是另一个。此规则的唯一例外是批次以单行为目标。

你说得对,你会遇到你描述的问题。很可能会出现两个表中的数字不相同的情况。


推荐阅读