Cassandra 并不总是在单个数据中心、5 个副本设置中返回相同查询的预期数据
Cassandra not always returning the expected data for the same query in a single datacenter, 5 replica set up
我遇到了一个我不太确定为什么会发生的问题。
我有一个 Cassandra 集群,只有 1 个数据中心,5 个副本,3 个作为复制因子,测试时我的应用程序和 cqlsh 中的一致性为 ONE。
我 运行 cqlsh 查询类似于:
SELECT * FROM session where id='xxxxxxxxxxxxxxx' and device_id='xxxxxxxxxxxxxxxx';
我随机填充了我的数据行,而其他时候响应为空。
首先我检查了集群的状态,一切看起来都很好。所有节点都处于“UN”状态,每个节点约 60% 的所有权,每个节点 256 个代币。
然后我 运行 这样的 getendpoints 命令:
nodetool getendpoints <keyspace> <table> "xxxxxxxxxxxxxxx"
而且我看到有3个节点持有这个ID,看起来不错。
然后我 运行 修复了每个节点,问题消失了,但我仍然看不出这里有什么问题。
信息在数据库中保存了很长一段时间,而不是分钟、天。
我想问题仍然存在,但它可能是什么?我如何轻松调试或监控它?
感谢您的帮助
问题是数据不一致。您可以很容易地验证您能够 运行 修复,然后发现数据是一致的,这意味着您的 ONE CL 正在命中一个实际上不包含数据的节点。如果您需要那种级别的一致性,您的查询将需要更高的 CL,两个或 local_quorum.
您的数据不一致的原因可能是某处丢失了突变。这可能是网络,或导致丢弃突变的过载节点。无论哪种方式,这显然是正在发生的事情。
我遇到了一个我不太确定为什么会发生的问题。
我有一个 Cassandra 集群,只有 1 个数据中心,5 个副本,3 个作为复制因子,测试时我的应用程序和 cqlsh 中的一致性为 ONE。
我 运行 cqlsh 查询类似于:
SELECT * FROM session where id='xxxxxxxxxxxxxxx' and device_id='xxxxxxxxxxxxxxxx';
我随机填充了我的数据行,而其他时候响应为空。
首先我检查了集群的状态,一切看起来都很好。所有节点都处于“UN”状态,每个节点约 60% 的所有权,每个节点 256 个代币。
然后我 运行 这样的 getendpoints 命令:
nodetool getendpoints <keyspace> <table> "xxxxxxxxxxxxxxx"
而且我看到有3个节点持有这个ID,看起来不错。
然后我 运行 修复了每个节点,问题消失了,但我仍然看不出这里有什么问题。
信息在数据库中保存了很长一段时间,而不是分钟、天。
我想问题仍然存在,但它可能是什么?我如何轻松调试或监控它?
感谢您的帮助
问题是数据不一致。您可以很容易地验证您能够 运行 修复,然后发现数据是一致的,这意味着您的 ONE CL 正在命中一个实际上不包含数据的节点。如果您需要那种级别的一致性,您的查询将需要更高的 CL,两个或 local_quorum.
您的数据不一致的原因可能是某处丢失了突变。这可能是网络,或导致丢弃突变的过载节点。无论哪种方式,这显然是正在发生的事情。