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

标签 python cassandra distributed cql cassandra-2.0

我有一个启动并运行的双节点 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/

相关文章:

python cv2.circle 子像素绘图

python - 需要在 python 中使用正确的格式在控制台输出中打印 bool 值

agile - 分布式开发团队——需要的工具

java - 创建大量的多个输出

python - pip install python-libtorrent==1.1.0 在 Linux 上失败

python - 如何在Python中将二进制文件作为原始字符串打开?

cassandra - 为什么在 Cassandra 表中使用复合聚集键?

amazon-ec2 - Cassandra:EC2 多区域的正确配置是什么?

cassandra - 流式大数据 - 在哪里存储中间结果?

rest - 分布式系统中的数据同步