我需要使用连接到Cassandra的应用程序运行一些负面测试。我想测试的是当数据在多个Cassandra节点之间不一致时应用程序的行为方式。以下是我尝试过的一些事情。注意,我使用复制因子为2,集群中的Cassandra节点数为3.此外,读写一致性保持为1。
在所有情况下,复制都足够快。一旦启动了关闭的节点或插入了网络电缆,就会发生重放并且数据在其他节点上可用。
任何有关尝试重现数据不一致的建议都会有所帮助。请注意,我使用了嵌入式Cassandra并且已经模拟了一些测试,但我想复制实际的不一致性,以便可以彻底测试应用程序行为。
由于
答案 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不一致的方法。
答案 1 :(得分:0)
Cassandra有三种机制可以跨副本提供数据一致性:
如果节点无法接收特定的写入,则写入 协调器节点将要写入的数据保留为一组提示。 当节点重新联机时,协调器将执行修复 切换提示,以便节点可以赶上所需的 写入。
在读取修复中,数据库向每个副本发送摘要请求 没有直接参与阅读。数据库比较所有副本 并将最新版本写入任何未复制的副本节点 有它。
数据库也可以在a上随机执行读取修复 表。为表配置的read_repair_chance属性配置 此操作的频率。
nodetool repair tool
比较所有副本中的数据,然后进行更新 数据到最新版本
正如我所看到的,要在副本之间实现不一致的数据,您需要避免调用这些机制,例如:
read_repair_chance
设为0 replication_factor
设为2 consistency level = ONE
nodetool repair