使用cqlsh执行insert语句时,“无法完成请求:一个或多个节点不可用”

时间:2014-03-08 17:35:04

标签: cassandra cqlsh

我正在尝试在全新安装的Cassandra 2上执行插入操作,虽然我能够设置一个新的键空间和表格,但是在尝试执行插入时,我得到了上面提到的错误。< / p>

我没有任何花哨的多服务器设置,它只是运行一台带有测试数据库的计算机,因此我对节点配置感到困惑

用于创建所述项目的命令是:

CREATE KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'DC1' : 3 };
USE demodb;
CREATE TABLE users (user_name varchar, state varchar, birth_year bigint, PRIMARY KEY (user_name));
INSERT INTO users (user_name, state, birth_year) VALUES ('canadiancreed', 'PA', 1976);

2 个答案:

答案 0 :(得分:24)

CREATE KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'DC1' : 3 };

很可能是你的罪魁祸首。它表示demodb密钥空间中的数据属于DC1,应该复制3次。如果未将单个测试节点指定为DC1的成员,则任何插入此键空间的请求都将失败。此外,如果它是DC1的成员且一致性级别大于1,则所有请求都将失败,因为写入不可能获得多个acknolegdment。

检查您的数据中心的名称(nodetool status)并调整它们的键空间复制详细信息以进行匹配。这很可能会解决你的问题。

----编辑更多细节和更好的格式----

这是新用户与Cassandra最常见的错误之一。基本上在Cassandra中,我们称之为Datacenters的逻辑硬件单元。数据中心应该代表一组地理上或其他方式不同的机器组。您可以制作其中许多内容并防止一个地理位置的故障导致您的应用程序脱机。

Keyspaces是一个用于组织信息组的逻辑结构,它对于关系世界中的数据库是有用的。每个Keyspace都可以指定它应该复制哪些机器和多少台机器。如果我们使用NetworkTopologyStrategy,则在 per datacenter basiss 上指定复制。我们使用“CREATE KEYSPACE .... WITH REPLICATION”在创建时指定这些细节(尽管可以在以后修改)。

在上面的陈述中,您已指定Keyspace demodb中的所有信息都应放在数据中心“DC1”中,并且该数据中心应该有3个数据副本。这基本上意味着您在DC1中至少有3个节点,并且您希望每个节点上都有一个数据副本。这本身不会导致插入失败,除非Cassandra集群不知道整个数据中心。如果您没有对C *集群进行初始配置并且刚刚运行股票yaml,就会出现这种情况。

运行nodetool状态将显示当前节点对集群状态的信任。这是从本地机器上运行的C *的输出。

Datacenter: Cassandra
=====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address    Load       Owns (effective)  Host ID                               Token                                    Rack
UN  127.0.0.1  93.37 KB   100.0%            50be3bec-7e30-4385-bd4a-918055a29292  4731866028208108826                      rack1

此输出显示我在名为“Cassandra”的群集中运行单个节点。这意味着对其他数据中心中需要副本的键空间的任何插入都将失败,因为群集不知道如何处理这些请求。 (如果节点只是关闭但我们在保存提示之前已经看过它们,但如果从未见过其他DC,我们会拒绝该请求,因为群集很可能是配置错误。)

要修复这种情况,我会使用

修改我的Keyspace
cqlsh:demodb> ALTER KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'Cassandra' : 1 };

现在,demoDB需要数据中心Cassandra中一台机器的数据副本。这很棒,因为我的nodetool输出状态,我在一个名为Cassandra的数据中心中有一个节点。如果我现在尝试插入它就会通过。

cqlsh:demodb> INSERT INTO users (user_name, state, birth_year) VALUES ('canadiancreed', 'PA', 1976);
cqlsh:demodb> select * from users where user_name = 'canadiancreed' ;

 user_name     | birth_year | state
---------------+------------+-------
 canadiancreed |       1976 |    PA

(1 rows)

我会更改我的设置架构脚本以获得正确的数据中心名称

CREATE KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'Cassandra' : 1 };

答案 1 :(得分:1)

如果您在Google搜索后结束此处,我发现如果您使用的是一致性级别ALL,则可能会出现此错误(具有特定复制因素的QUORUM可能也是如此)您使用的密钥空间设置为在不存在或死数据中心上复制。

更新密钥空间复制以删除对不存在的数据中心的引用可以解决问题。

(在这种情况下,消息完全合乎逻辑:您需要来自不再存在的节点的结果。)