仅在cassandra集群中的一个数据中心中插入行

时间:2018-02-05 12:49:10

标签: cassandra cql3 cassandra-3.0

出于某些测试目的,我想在我的测试cassandra集群中打破数据的一致性,包括两个数据中心。

我假设如果我使用等于LOCAL_QUORUMLOCAL_ONE的一致性等级,我将实现此目的。我们假设我有一个属于node11的cassandra节点DC1

cqlsh node11
CONSISTENCY LOCAL_QUORUM;
INSERT INTO test.test (...) VALUES (...) ;

但事实上,数据出现在所有节点中。即使是一致性级别node22,我也可以从属于DC2的{​​{1}}中读取它。我已仔细检查过:LOCAL_*向我显示了两个数据中心,nodetool当然属于node11,而DC1属于node22

我的密钥空间DC2配置如下:

test

我分别在每个DC中有两个节点。

我的问题:

  1. 在我看来,我错误地理解了这些一致性水平的想法。事实上,它们不会阻止将数据写入不同的DC,而只是要求在当前数据中心中显示至少的数据。这是正确的理解吗?

  2. 更重要的是:当我在一个群集中的两个数据中心存储不同的数据时,是否可以执行此类技巧并实现这种“破坏”的一致性?

  3. (目前我认为实现这一目标的唯一方法是打破环并且不允许来自一个DC的节点知道来自另一个DC的节点的任何信息,但我不喜欢这个解决方案)。

2 个答案:

答案 0 :(得分:3)

  1. LOCAL_QUORUM,此一致性级别需要从本地DC收到的法定数量的确认,但所有数据都将发送到密钥空间中定义的所有节点。
  2.   

    即使在低一致性级别,写入仍然会发送给所有人   书面密钥的复制品,甚至是其他数据中心的复制品。该   一致性级别仅确定需要多少副本   回应说他们收到了写信。

    https://docs.datastax.com/en/archived/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html

    1. 我认为没有合适的方法可以做到这一点

答案 1 :(得分:0)

此建议仅用于测试场景以破坏2个DC之间的数据一致性。 (没有尝试但基于我的理解应该工作)

  • 使用Local * consistency
  • 在一个DC(例如DC1)中写入数据
  • 在写入之前,请将DC2中的节点保持关闭状态,以便在DC2节点关闭时DC1将存储提示。
  • 让max_hint_window_in_ms(默认情况下为3小时 - 您可以减少它)时间过去,以便DC1协调员删除所有提示
  • 启动DC2节点并使用LOCAL *查询查询,DC1中的数据不会出现在DC2中。

您可以重复这些步骤并在DC2中使用不同的值插入数据,从而保持DC1不变,因此相同的数据在DC1和DC2中具有不同的值。