如何使Cassandra跨节点不一致?

时间:2017-05-29 12:25:07

标签: cassandra

我需要使用连接到Cassandra的应用程序运行一些负面测试。我想测试的是当数据在多个Cassandra节点之间不一致时应用程序的行为方式。以下是我尝试过的一些事情。注意,我使用复制因子为2,集群中的Cassandra节点数为3.此外,读写一致性保持为1。

  • 在几个节点上放下Cassandra服务
  • 插入其中一个cassandra节点的网线,插入数据
    进入其他Cassandra节点并放回网线。
  • 在测试过程中大量加载Cassandra节点。

在所有情况下,复制都足够快。一旦启动了关闭的节点或插入了网络电缆,就会发生重放并且数据在其他节点上可用。

任何有关尝试重现数据不一致的建议都会有所帮助。请注意,我使用了嵌入式Cassandra并且已经模拟了一些测试,但我想复制实际的不一致性,以便可以彻底测试应用程序行为。

由于

2 个答案:

答案 0 :(得分:2)

你必须了解Cassandra如何读取或写入数据。

在Cassandra集群中说,例如您有4个节点,复制因子为3.然后,将根据分区程序为每个节点分配一个令牌范围。根据我们的例如在4节点集群中,节点1表示令牌A,节点2表示令牌B,节点3表示令牌C,节点4表示令牌D.

可以从任何节点触发插入,因此该节点将成为协调节点。插入数据后,Cassandra会根据parititioner计算令牌,并检查数据适合的令牌范围。如果计算数据并将标记识别为C,则它将以循环方式从节点3插入到副本数(3)。因此插入节点3,节点4,节点1。

当您读取数据时,协调器节点会计算令牌。例如,如果您阅读上面插入的数据,例如来自节点2(协调节点)。然后,节点2将根据您的一致性级别从节点3,4,1请求数据,它将等待并返回结果。假设您的一致性级别为1,那么它将等待一个节点响应并返回。 如果协调器节点没有找到足够数量的副本来提供结果,那么它将抛出TokenRangeOfflineException。如果它识别出节点中该记录的任何不一致,那么Cassandra将对该记录进行读取修复,这将使数据保持一致。

此外,Cassandra还提供了未读数据或频繁删除数据或未正确复制的修复机制。因此,所有这些都使Cassandra保持一致。

要实现不一致,我们无法告诉数据变得不一致的具体方法,但是以下方法可能会帮助您使我遇到的不一致:

  • 当您不断插入数据时,经常逐个关闭Cassandra节点
  • 也不要定期修理

但这需要更多时间才能产生不一致。我们不能保证任何使Cassandra不一致的方法。

答案 1 :(得分:0)

Cassandra有三种机制可以跨副本提供数据一致性:

  1. Hinted handoff
  2.   

    如果节点无法接收特定的写入,则写入   协调器节点将要写入的数据保留为一组提示。   当节点重新联机时,协调器将执行修复   切换提示,以便节点可以赶上所需的   写入。

    1. Read Repair
    2.   

      在读取修复中,数据库向每个副本发送摘要请求   没有直接参与阅读。数据库比较所有副本   并将最新版本写入任何未复制的副本节点   有它。

           

      数据库也可以在a上随机执行读取修复   表。为表配置的read_repair_chance属性配置   此操作的频率。

      1. Anti-entropy repair
      2.   

        nodetool repair tool比较所有副本中的数据,然后进行更新   数据到最新版本

        正如我所看到的,要在副本之间实现不一致的数据,您需要避免调用这些机制,例如:

        1. 设置包含2个节点的群集
        2. Disable hinted handoff in cassandra.yaml
        3. 将表格read_repair_chance设为0
        4. replication_factor设为2
        5. 关闭一个节点
        6. 使用consistency level = ONE
        7. 对表执行写入请求
        8. 从步骤5开启节点
        9. 请勿执行nodetool repair
        10. 步骤6中的数据应该在副本之间不一致:来自步骤5的节点不应包含来自步骤6的数据副本