2

我有一个两节点 Cassandra 集群启动并运行,我正在通过 python-driver API 执行构造的 CQL 查询。我正在对我构建的一系列模型进行单元测试,以抽象出大部分 Cassandra API,以方便其他开发人员使用。我的所有测试在单节点集群上测试时都通过了,但是在添加另一个节点后,测试完全不一致,要么失败,要么出错,要么以最小的韵律或理由通过。

我正在比较插入 Cassandra 的对象和由 Cassandra 查询产生的对象self.__dict__ == other.__dict__,因为我根据从 Cassandra 接收到的列值填充类的字段。

我相信我已经隔离了这个问题。在我的种子节点上:

cqlsh:mykeyspace> select id,created_at from users;

id | created_at
----+--------------
10 | 139621386780
11 | 139621386780
 8 | 139621386780
 7 | 139621386780
 6 | 139621386780
 9 | 139621386780
12 | 139621386780

(7 rows)

在我的第二个节点上:

cqlsh:mykeyspace> select id,created_at from users;

 id | created_at
----+--------------
  8 | 139621370181
  7 | 139621370181
  9 | 139621370181

(3 rows)

,其中第一列是整数 id,第二列是 Pythondatetime对象。我相信正在发生的事情是,当我在 中插入一行时users,该行被插入到第一个或第二个节点上,但是当我尝试从 Cassandra 检索这个对象时,我正在从一个与我刚才不同的节点读取插入,因为 Cassandra 允许这样做。但是,如果我有consistency_level=ALL(它用于我的 python CQL 调用),我不应该接收最新的行数据,而不是最近插入之前的行吗?


更新

请注意,我们特意删除了唯一标识符。

在种子节点上:

$ nodetool status
Datacenter: 243
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load       Tokens  Owns   Host ID                               Rack
UN  IP Address 0  136.47 KB  256     100.0%  ownsuuid  58

$ nodetool gossipinfo
/IP Address 0
  HOST_ID:ownsuuid
  SCHEMA:schema
  RPC_ADDRESS:0.0.0.0
  RELEASE_VERSION:2.0.4
  STATUS:NORMAL,-1102599059356328037
  SEVERITY:0.0
  RACK:58
  LOAD:150498.0
  DC:243
  NET_VERSION:7
/IP Address 1
  SCHEMA:schema
  HOST_ID:ownsuuid
  RPC_ADDRESS:0.0.0.0
  RELEASE_VERSION:2.0.4
  STATUS:NORMAL,-1102599059356328037
  SEVERITY:0.0
  RACK:181
  LOAD:148937.0
  DC:241
  NET_VERSION:7

在另一个非种子节点上:

~$ nodetool status
Datacenter: 241
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address          Load       Tokens  Owns   Host ID                               Rack
UN  IP Address 1  145.45 KB  256     100.0%  ownsuuid  181

$ nodetool gossipinfo
/IP Address 0
  STATUS:NORMAL,-1102599059356328037
  LOAD:139743.0
  RELEASE_VERSION:2.0.4
  RACK:58
  SCHEMA:schema
  SEVERITY:0.0
  NET_VERSION:7
  HOST_ID:ownsuuid
  RPC_ADDRESS:0.0.0.0
  DC:243
/IP Address 1
  STATUS:NORMAL,-1102599059356328037
  LOAD:164405.0
  RELEASE_VERSION:2.0.4
  RACK:181
  NET_VERSION:7
  SCHEMA:schema
  SEVERITY:0.0
  HOST_ID:ownsuuid
  RPC_ADDRESS:0.0.0.0
  DC:241
4

1 回答 1

1

在我看来,您的节点八卦问题比其他任何事情都多。您是否熟悉您的 bin 目录中用于 Cassandra 的“nodetool”诊断工具?

我在 Amazon EC2 服务器上的 2 节点集群上运行 Cassandra,我可以从 bin 目录运行以下命令:

bash 节点工具状态

bash nodetool gossipinfo

运行这些命令时,您应该会看到所有节点。这至少应该确认您的节点正在正确通信并分发您的数据。对于我的集群,一旦我确认所有节点都在通信,我可以在 cqlsh 中从任何节点运行选择查询并获得 100% 一致的结果。

另外,您是否在“conf”文件夹中的 cassandra.yaml 文件中配置了节点种子值?一旦你的第一个节点启动并运行,第二个节点应该使用第一个节点的 IP 或名称作为它的种子。

于 2014-03-31T15:35:28.677 回答