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

can*_*eed 4 cassandra cqlsh

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

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

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

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);
Run Code Online (Sandbox Code Playgroud)

Rus*_*ssS 24

CREATE KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'DC1' : 3 };
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Keyspace是用于组织信息组的逻辑结构,它对于关系世界中的数据库是有用的.每个Keyspace都可以指定它应该复制哪些机器和多少台机器.如果我们使用NetworkTopologyStrategy,则在每个数据中心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
Run Code Online (Sandbox Code Playgroud)

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

为了解决这种情况,我会修改我的Keyspace使用

cqlsh:demodb> ALTER KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'Cassandra' : 1 };
Run Code Online (Sandbox Code Playgroud)

现在,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)
Run Code Online (Sandbox Code Playgroud)

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

CREATE KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'Cassandra' : 1 };
Run Code Online (Sandbox Code Playgroud)

  • 你跳过了关键的第一行`Datacenter:Cassandra ===================== Status = Up/Down |/State = Normal/Leaving/Joining/Moving - Address负载拥有(有效)主机ID令牌机架UN 127.0.0.1 93.37 KB 100.0%50be3bec-7e30-4385-bd4a-918055a29292 4731866028208108826 rack1` (4认同)
  • 这对我有用cqlsh:demodb> alter keyspace demodb with replication = {'class':'NetworkTopologyStrategy','datacenter1':1}; (2认同)