我有一个 3 机器 Cassandra 集群,它使用机架不感知放置策略,复制因子为 2。
列族定义如下:
create column family UserGeneralStats with comparator = UTF8Type and default_validation_class = CounterColumnType;
不幸的是,经过几天的生产使用,我得到了一些不一致的计数器值:
查询副本 1:
[default@StatsKeyspace] list UserGeneralStats['5261666978': '5261666978'];
Using default limit of 100
-------------------
RowKey: 5261666978
=> (counter=bandwidth, value=96545030198)
=> (counter=downloads, value=1013)
=> (counter=previews, value=10304)
查询副本 2:
[default@StatsKeyspace] list UserGeneralStats['5261666978': '5261666978'];
Using default limit of 100
-------------------
RowKey: 5261666978
=> (counter=bandwidth, value=9140386229)
=> (counter=downloads, value=339)
=> (counter=previews, value=1321)
由于标准读取修复机制似乎无法修复值,因此我尝试使用 nodetool repair 强制进行反熵修复。它对计数器值没有任何影响。
数据检查显示计数器的较低值是正确的,所以我怀疑 Cassandra(或我用作 API 从 Java 调用 Cassandra 的 Hector)重试了一些增量。
任何想法如何修复数据并可能防止这种情况再次发生?