我有一个由两个 cassandra 节点组成的开发 cassandra 集群[我们称它们为 NodeA 和 NodeB]。我还有一个在 NodeA 上不断发送数据的脚本。我使用以下参数创建了数据库:
CREATE KEYSPACE test_database WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true;
现在,由于某种原因 NodeB 一段时间后停止了。但问题是,一旦 NodeB 停止,向 NodeA 发送数据的脚本就会开始出现数据插入错误。
谁能指出同样的可能原因。
更新:两个节点都是种子节点。
最佳答案
Cassandra 如何处理数据重新分区
cassandra 中的每个键都可以转换为 token 。当您安装集群时,节点会计算它们将接受的 token 范围。
让我们举一个简单的例子:
您有两个节点,以及一个从 0 到 9 的 token 。一个简单的重新分区是:节点 A 存储 0-4 之间的每个 token ,节点 B 存储 5-9 之间的每个 token 。
Cassandra 如何进行写入
您选择一个接收数据的协调器(在您的案例中为节点 A)。然后该节点将计算一个 token 。如第一个示例所示,每个节点都分配有一系列 token 。因此,想象一下 key 被转换为 token 4,然后数据发送到节点 A(此处为协调器)。如果token为8,则将数据发送到节点B。
什么是 cassandra 数据复制因子
复制因子是数据将在集群上存储的次数。对于没有机架的单个数据库(您的情况),数据首先发送到拥有与 key 关联的 token 的节点,然后将副本发送到拓扑中的下一个节点。
当一个节点出现故障时,副本将帮助该节点恢复数据。
在您的情况下,没有副本,如果节点关闭,Cassandra 无法存储数据并引发错误。如果复制因子为 2,Cassandra 应该能够在节点 A 上存储副本并且不会失败。
关于当其中一个节点关闭时 Cassandra 无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36789181/