代码之家  ›  专栏  ›  技术社区  ›  Andremoniy

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

  •  1
  • Andremoniy  · 技术社区  · 6 年前

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

    我假设如果我使用的一致性级别等于 LOCAL_QUORUM LOCAL_ONE 我会做到这一点。假设我有一个cassandra节点 node11 属于 DC1 :

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

    但事实上,数据出现在所有节点中。我可以从 node22 属于 DC2 即使使用一致性级别 LOCAL_* . 我已经仔细检查过了 nodetool 向我展示了两个数据中心和 节点11 当然属于 DC1 虽然 节点22 属于 DC2型 .

    我的键空间 test 配置如下:

    CREATE KEYSPACE "test"
      WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 2, 'dc2' : 2};
    

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

    我的问题:

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

    2. 更重要的是:当我在

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

    2 回复  |  直到 6 年前
        1
  •  3
  •   Nicolas Henneaux    6 年前
    1. LOCAL\u QUORUM,此一致性级别要求从本地DC接收acknoledgement的QUORUM,但所有数据都会发送到密钥空间中定义的所有节点。

    即使在低一致性级别下,写入仍会发送到所有 写入密钥的副本,甚至其他数据中心的副本。这个 一致性级别仅确定 回复他们收到了信。

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

    1. 我认为没有合适的方法
        2
  •  0
  •   Ashish    6 年前

    此建议仅用于测试场景,以破坏2个DC之间的数据一致性。(尚未尝试,但根据我的理解,应该可以)

    • 以本地*一致性在一个DC(如DC1)中写入数据
    • 在写入之前,保持DC2中的节点处于关闭状态,以便DC1在DC2节点处于关闭状态时存储提示。
    • 让max\u hint\u window\u in\u ms(默认情况下为3小时,您可以减少)时间流逝,以便DC1 coordinator将删除所有提示
    • 启动DC2节点并使用本地*查询进行查询,来自DC1的数据将不会出现在DC2中。

    您可以重复这些步骤,在DC2中插入具有不同值的数据,保持DC1处于低位,以便相同的数据在DC1和DC2中具有不同的值。