我们有一个运行有 3 个节点且复制因子为 2 的 cassandra 集群 -> 也许我们应该从一开始就选择 3,但事实并非如此。
因此我们的法定人数 = 2/2 + 1 = 2
假设我们丢失了一个节点 - 所以现在只有两个 cassandra 节点在线。
如果我们将一致性级别设置为“ONE”然后读取 ->,我们仍然有可能从集群中读取,所以这不是问题。
我不明白的是以下内容。
我们仍然有两个节点在运行,那么为什么不能将串行(轻量级事务)插入到我们的键空间中呢?我们有两个节点,所以在尝试插入时不应该获得 2 的法定人数吗?
是否因为其中一行已经放在丢失的节点上?
最佳答案
当您尝试插入数据时,数据会根据 token 值(根据配置的分区程序)存储并以循环方式复制。
例如如果您在 3 节点集群 Node1(拥有 token A)、Node2(拥有 token B)和 Node3(拥有 token C)中的复制因子为 2 的键空间中插入数据 X。假设如果数据 X 被计算为 token B,那么 Cassandra 开始从 Node2 和 Node3 插入数据(直到它完成副本)。假设如果数据 X 被计算为 token C,那么 Cassandra 开始从 Node3 和 Node1 插入数据。
所以设置一致性级别为2意味着数据必须写入2个节点。 在您的情况下,即使您在 Node1( token A)和 Node2( token B)上有 2 个节点,在 Node3( token C)下有一个节点,如果数据被计算并选择为 token B,那么 Cassandra 会尝试插入 Node2 和Node3 并且您会收到一致性错误,因为它无法插入 Node3。
因此要插入,您必须将复制增加到 3 或将一致性降低到 1。
要了解有关一致性的更多信息,请参阅此文档 https://docs.datastax.com/en/cassandra/2.1/cassandra/dml/dml_config_consistency_c.html
关于database - Cassandra(复制因子 : 2, 节点:3)和轻量级事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42694324/