cassandra - 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)?
解决方案
首先,原子性和隔离之间有一条细线。批处理保证两个插入都将被应用(原子性),但它们不保证它们将在完全相同的时间应用。(隔离)
客户端仍然能够在选择中读取一个而不是另一个。此规则的唯一例外是批次以单行为目标。
你说得对,你会遇到你描述的问题。很可能会出现两个表中的数字不相同的情况。
推荐阅读
- android - 无法处理 Kotlin 协程中的改造连接错误
- r - 检查值并根据结果添加值的功能
- c# - Microsoft Graph API - Exchange Online Messages 调用返回 ServiceUnavailable
- xamarin.forms - 将第一个 StackLayout 定位在页面底部 Xamarin.Forms
- c# - For循环异步问题C#
- excel - 从列表中选择默认打印机,而不是硬编码
- python - 使用 python 运行 mapreduce 作业(MRjob)时,命令行上出现意外的参数错误
- javascript - 使用谷歌脚本和 html 模板循环进入项目符号
- python - pip2:ImportError:无法导入名称 RequirementParseError
- ios - 当 options = nil 初始化时,CBCentralManager 的默认警报操作是什么?