当其中一个节点关闭时,Cassandra无法正常工作

时间:2016-04-22 08:49:52

标签: cassandra

我有两个cassandra节点的开发cassandra集群[我们称之为NodeA和NodeB]。我还有一个不断在NodeA上发送数据的脚本。我使用以下参数创建了数据库:

CREATE KEYSPACE test_database WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;

现在,由于某种原因,NodeB在一段时间后停止运行。但问题是,一旦NodeB停止,向NodeA发送数据的脚本就会开始出现数据插入错误。

任何人都可以指出相同的可能原因。

更新:两个节点都是种子节点。

4 个答案:

答案 0 :(得分:1)

Cassandra的复制因素: 让我们说我们有' n'作为复制因子,这意味着给定的输入数据将被存储/检索到' n'节点。 Ť 如果你提到复制因素为' 1'这意味着只有一个节点拥有数据。

<强> 分区: 假设我们在插入数据时有2个节点。基于所提到的分区算法,这两个节点都将具有一些数据。 例如: 您正在插入10条记录,根据散列和分区算法,它选择需要为每条记录写入哪个节点。当然,节点的识别由协调员完成:)

耐用写作: 默认情况下,cassandra总是在刷新到磁盘之前写入commit-log。如果设置为false,它将绕过commit-log并直接写入磁盘(SSTable)。

您提到的问题,例如,假设您要插入10行。 为简单起见,我们可以将分区/散列计算为n / 2。

因此,Cassandra的协调器节点将您的数据分成两部分(简单计算将为10/2)并尝试将上半部分放入第一个节点并成功并尝试将后半部分放入第二个节点(写入commit-log),因为它不可用,所以它会抛出错误。

答案 1 :(得分:1)

Cassandra如何处理数据重新分区

cassandra中的每个键都可以转换为令牌。安装群集时,节点会计算它们将接受的令牌范围 我们举一个简单的例子:

你有两个节点,一个从0到9的标记。一个简单的重新分区是:节点A存储0-4之间的每个标记,节点B存储5-9之间的每个标记。

Cassandra的写作方式

您选择接收数据的协调员(在您的情况下为节点A)。然后,此节点将计算令牌。如第一个示例所示,每个节点都有一个分配给它的令牌范围。因此,想象密钥转换为令牌4,然后数据转到节点A(这里是协调器)。如果令牌为8,则数据将被发送到节点B.

什么是cassandra数据复制因子

复制因子是您的数据存储在群集上的时间。对于没有机架的单个数据库(您的情况),数据首先发送给拥有与密钥关联的令牌的节点,然后将副本发送到拓扑中的下一个节点。 如果一个节点发生故障,副本将帮助节点恢复其数据 在您的情况下,没有副本,如果节点关闭,Cassandra无法存储数据并引发错误。如果您有复制因子2,Cassandra应该能够在节点A上存储副本而不会失败。

答案 2 :(得分:0)

那么我们如何解决此问题?可以说我想在集群中的1个节点关闭时批量插入多个插入查询吗?它返回我 由于主机不可用,与连接cs1关联的与Cassandra群集的连接不可用。主机地址:cassandra1

答案 3 :(得分:0)

如果您的表不是计数器表,则可以使用ANY的一致性级别,这可以提高写入的可用性。 请参阅此内容以了解更多信息=> https://www.datastax.com/blog/2011/05/understanding-hinted-handoff-cassandra-08