Cassandra 备份和恢复一致性
Cassandra backup and restore consistency
场景如下:
我有 1 个 Cassandra 节点,其中有一个键空间,其中有 2 个 table。我们将这些 table 称为 A 和 B。现在我有一个脚本可以在批处理语句中非常快速地将数据插入到这两个 table 中。 Table A 有列 "k" 和 "value"。 Table B 有列 "k" 和 "value"。批量查询如下:
BEGIN BATCH
INSERT INTO A(k, value) VALUES ("a", 1);
INSERT INTO B(k, value) VALUES ("b", 1);
APPLY BATCH
值 1 在每个连续的批查询中不断递增。所以如果 table A 有 (a, 1000),那么 table B 一定有 (b, 1000)。因为(记录的)批量查询是原子的。
现在我的问题是,nodetool 快照在这种情况下如何工作?我看过快照的源代码,它似乎是按键空间、按 table 逐一进行的。因此,例如,在时间 0,它拍摄 table A 的快照,其中有 say ("a", 100),然后在时间 1 插入一个新的批查询(值为 101),然后在时间 2,它拍摄了 b 的快照,这意味着 b 的快照的值为 101,但 a 的快照没有。
如果上面的解释是正确的,那恢复的时候不会出问题吗? tableA恢复后如何得到("a",101)?还是 table B 恢复后就没有 ("b", 101) 了?
首先,原子性和隔离性之间存在细微差别。批次保证两个插入 将 应用(原子性),但它们 不 保证它们将在同一时间应用。 (隔离)
客户端仍然可以在 select 中读取其中一个,而不能读取另一个。此规则的唯一例外是批次针对单行。
您说得很对,您会 运行 解决您描述的问题。很有可能会出现两个表的数字不一样的情况。
场景如下: 我有 1 个 Cassandra 节点,其中有一个键空间,其中有 2 个 table。我们将这些 table 称为 A 和 B。现在我有一个脚本可以在批处理语句中非常快速地将数据插入到这两个 table 中。 Table A 有列 "k" 和 "value"。 Table B 有列 "k" 和 "value"。批量查询如下:
BEGIN BATCH
INSERT INTO A(k, value) VALUES ("a", 1);
INSERT INTO B(k, value) VALUES ("b", 1);
APPLY BATCH
值 1 在每个连续的批查询中不断递增。所以如果 table A 有 (a, 1000),那么 table B 一定有 (b, 1000)。因为(记录的)批量查询是原子的。
现在我的问题是,nodetool 快照在这种情况下如何工作?我看过快照的源代码,它似乎是按键空间、按 table 逐一进行的。因此,例如,在时间 0,它拍摄 table A 的快照,其中有 say ("a", 100),然后在时间 1 插入一个新的批查询(值为 101),然后在时间 2,它拍摄了 b 的快照,这意味着 b 的快照的值为 101,但 a 的快照没有。
如果上面的解释是正确的,那恢复的时候不会出问题吗? tableA恢复后如何得到("a",101)?还是 table B 恢复后就没有 ("b", 101) 了?
首先,原子性和隔离性之间存在细微差别。批次保证两个插入 将 应用(原子性),但它们 不 保证它们将在同一时间应用。 (隔离)
客户端仍然可以在 select 中读取其中一个,而不能读取另一个。此规则的唯一例外是批次针对单行。
您说得很对,您会 运行 解决您描述的问题。很有可能会出现两个表的数字不一样的情况。