Cassandra数据复制问题

时间:2010-09-30 03:18:13

标签: replication cassandra

我有一个2节点的cassandra集群,复制因子为2,AutoBootStrap = true。在启动期间一切都很好,两个节点都互相看见。我们称这些节点为A和B.

  1. 通过节点A添加一组键和列(让我们称之为K1集)到cassandra。
  2. 连接到节点A并回读集K1。节点B上相同。成功 - 好
  3. 杀死Node B上的Cassandra进程。
  4. 通过A添加集K2。
  5. 连接到节点A并读取集K2。好
  6. 在节点B上重新启动Cassandra进程。
  7. 尝试从B中读取所有键...设置K1存在,设置K2 MISSING。 (即使在30分钟后)
  8. 将K3添加到A / B。
  9. 从A中读取所有键 - 返回集K1,K2,K3
  10. 从B中读取所有键 - 返回设置K1,K3。
  11. B从不同步设置K2 ...(已超过12小时) 为什么节点B看不到集合K2 ......任何人都有任何想法?


    已添加信息

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

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

    但是,如果我们使用读取一致性为QUORUM或ALL,则强制要求A,然后返回正确的值,B同步该键(在本地保存)。

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

    我想必须有办法强制同步数据。我在终端输出中看到INFO,当B出现时,从A到B的15行的暗示切换发生,但是B没有本地的那些行(因为我们仍然无法从B中读取它的一致性级别为1)。怎么回事?

1 个答案:

答案 0 :(得分:6)

节点关闭时,cassandra同步更新有三种方式:

  1. 暗示交接。要求A上的故障检测器在写入K2之前识别B已关闭。请参阅http://wiki.apache.org/cassandra/HintedHandoff
  2. 阅读修复。当要求K2进行修复时,要求B启动。请参阅http://wiki.apache.org/cassandra/ReadRepair
  3. 反熵修复。需要手动调用(“nodetool repair”)。见http://wiki.apache.org/cassandra/AntiEntropy