我有一个双节点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
答案 0 :(得分:1)
听起来我觉得你有更多的节点八卦问题。你熟悉" nodetool"在Cassandra的bin目录中可用的诊断工具?
我在Amazon EC2服务器上的双节点群集上运行Cassandra,我可以从bin目录运行以下命令:
bash nodetool status
bash nodetool gossipinfo
运行这些命令时,您应该会看到所有节点。这至少应该确认您的节点正在正确通信并分发您的数据。对于我的群集,一旦我确认所有节点都在进行通信,我就可以从任何节点在cqlsh中运行select查询,并获得100%一致的结果。
另外,您是否在" conf"中的cassandra.yaml文件中配置了节点种子值?夹?第一个节点启动并运行后,第二个节点应使用第一个节点的IP或名称作为它的种子。