replication - Cassandra 数据复制问题

标签 replication cassandra

我有一个 2 节点的 cassandra 集群,复制因子为 2,AutoBootStrap=true。启动期间一切正常,两个节点都能看到对方。让我们称这些节点为 A 和 B。

  • 通过节点 A 向 cassandra 添加一组键和列(我们称之为 K1 集)。
  • 连接到节点 A 并读回集 K1。在节点 B 上相同。成功 - 好
  • 杀死节点 B 上的 Cassandra 进程。
  • 通过 A 添加集合 K2。
  • 连接到节点 A 并读取集 K2。好
  • 在节点 B 上重新启动 Cassandra 进程。
  • 尝试从 B 读取所有 key ...设置 K1 存在,设置 K2 MISSING。 (即使在 30 分钟后)
  • 将 K3 添加到 A/B。
  • 从 A 读取所有键 - 返回集合 K1、K2、K3
  • 从 B 读取所有键 - 返回集合 K1、K3。

  • B从不同步设置K2...(已经超过12小时了)
    为什么节点 B 看不到 K2 集...有人知道吗?

    添加信息 :

    好吧……这就是问题所在。
    read_consistency_level 默认设置为 1。

    因此,当我们向节点 B 询问集合 K2 时,它没有它(因为复制因子 = 2,它应该有),它立即返回“未找到”错误。

    但是,如果我们使用读取一致性为 QUORUM 或 ALL,那么 B 将被迫询问 A,然后 A 返回正确的值并且 B 同步该键(将其保存在本地)。

    这会导致另一个问题 - 这意味着当节点 B 出现时,它不会同步来自节点 A 的所有数据,即使经过很长时间也是如此。现在,如果节点 A 出现故障,我们如何访问未同步的数据? (我刚刚测试过我们不能)

    我想必须有一种方法可以强制同步数据。我在终端输出中看到 INFO,当 B 出现时,发生了从 A 到 B 的 15 行的暗示切换,但 B 在本地没有这些行(因为我们仍然无法从 B 以一致性级别 ONE 读取它)。这里发生了什么?

    最佳答案

    cassandra 有 3 种方式同步节点宕机时发生的更新:

  • 暗示交接。要求 A 上的故障检测器在您写入 K2 之前识别 B 已关闭。见 http://wiki.apache.org/cassandra/HintedHandoff
  • 阅读修复。要求 B 在请求 K2 进行修复时启动。见 http://wiki.apache.org/cassandra/ReadRepair
  • 反熵修复需要手动调用(“nodetool repair”)。见 http://wiki.apache.org/cassandra/AntiEntropy
  • 关于replication - Cassandra 数据复制问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3827441/

    相关文章:

    mongodb - 尝试复制 mongodb 时出现通信错误

    java - Gerrit 无法复制 git 存储库

    MySql Master-Master 复制导致缺少自增值

    mysql - MySQL复制测试开发环境

    database - 将 Cassandra 集群部署到一组 Linode VPS 实例中是否有任何 "gotchas"?

    spring - MyBatis Cassandra 结果集映射

    tomcat - DSE 3.0 Solr : Tomcat giving 404 errors

    PostgreSQL 流式复制

    database - Cassandra 计数器类型的总和

    java - 如何通过 192.168.x.x IP 地址连接到 cassandra 集群?