多节点Cassandra集群和不一致的客户端读取请求

时间:2014-03-30 21:37:55

标签: python cassandra distributed cql cassandra-2.0

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

我正在比较插入Cassandra的对象和self.__dict__ == other.__dict__的Cassandra查询产生的对象,因为我根据从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,第二列是Python datetime对象。我相信正在发生的事情是,当我向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

1 个答案:

答案 0 :(得分:1)

听起来我觉得你有更多的节点八卦问题。你熟悉" nodetool"在Cassandra的bin目录中可用的诊断工具?

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

bash nodetool status

bash nodetool gossipinfo

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

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