当我们有 Quorum 进行读写时,我在使用 Hector 和 Cassandra 时遇到了一致性问题。
我使用 MultigetSubSliceQuery 从超级列限制大小 100 中查询行,然后读取它,然后将其删除。并开始另一个。
我发现应该由我之前的查询删除的行仍然显示在下一个查询中。
并且同样从一个普通的Column Family,我将一列的值从status='FALSE'更新为status='TRUE',下次查询时,status还是'FALSE'。
更多详情:
- 并非每次都发生(1/10,000)
- 两个查询之间的时间大约是 500 毫秒(但我们发现一对查询之间已经过去了 2 秒,仍然表明存在一致性问题)
- 我们使用 ntp 作为我们的集群时间同步解决方案。
- 我们有 6 个节点,复制因子为 3
我知道 Cassandra 应该是“最终一致的”,并且在 Cassandra 内部写入之前可能不会发生读取。但是两秒钟?!如果是这样,那么拥有 Quorum 或其他一致性级别配置是否毫无意义?
那么首先,Cassandra 的行为是否正确,如果不是,我们需要分析哪些数据来进一步投资?