我有一个启动并运行的双节点 Cassandra 集群,我正在通过 python 驱动程序 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
最佳答案
在我看来,您遇到的节点八卦问题比其他任何问题都多。您是否熟悉 Cassandra 的 bin 目录中可用的“nodetool”诊断工具?
我在 Amazon EC2 服务器上的 2 节点集群上运行 Cassandra,我可以从 bin 目录运行以下命令:
bash 节点工具状态
bash nodetool 八卦信息
运行这些命令时,您应该会看到所有节点。这至少应该确认您的节点正在正确通信并分发您的数据。对于我的集群,一旦我确认所有节点都在通信,我就可以从任何节点在 cqlsh 中运行选择查询并获得 100% 一致的结果。
此外,您是否在“conf”文件夹中的 cassandra.yaml 文件中配置了节点种子值?一旦您的第一个节点启动并运行,第二个节点应该使用第一个节点的 IP 或名称作为它的种子。
关于python - 多节点 Cassandra 集群和不一致的客户端读取请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750204/