【问题标题】:Cassandra backup and restore consistencyCassandra 备份和恢复一致性
【发布时间】:2018-08-28 23:20:51
【问题描述】:

场景如下: 我有 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)?

【问题讨论】:

    标签: cassandra backup restore snapshot nodetool


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!但是,如果有的话,有什么办法可以解决这个问题? (除了在备份时不运行 cassandra 或者只是简单地删除/添加那个“不一致”的行?)。
    • 有一些方法可以在客户端处理锁定,但效率很低。如果可能的话,我的建议是尝试将两个字段放在同一张表的同一行上。这将为您提供行级别的批次隔离。
    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2020-02-18
    • 2012-01-14
    • 2011-07-02
    • 2021-08-14
    相关资源
    最近更新 更多