Cassandra数据损坏:某些列

时间:2017-01-06 17:13:50

标签: cassandra

我正在运行Cassandra 3.9群集,今天我在一些生成的报告中发现了一些NULL值。

我打开了cqlsh,经过一些查询后,我注意到空值出现在整个数据中,显然是随机列。

Replication factor is 3.

我已在群集上启动了nodetool repair,但尚未完成。

  

我的问题是:我搜索了这个行为,无法在任何地方找到它。显然,列中NULL值的随机出现不是常见问题。

有谁知道发生了什么事?这种数据损坏似乎非常严重。提前感谢任何想法。

ADDED详细信息:

  • 发生在经常使用toTimestamp(now())更新但永远不会返回NULL的列的情况下发生,因此不会涉及到空数据。

  • 发生在仅插入一次且永不更改的不可变列上。 (但桌子上的其他栏目经常更新。)

更新是否会导致删除这样做?对我来说似乎有点严肃,醒来时会发现一堆NULL值。

我还特别知道一些丢失的数据,我已经确定的三个条目用于丢失的重要条目。这些还没有被删除 - 一个特定的表上没有删除,到处都是NULL。

我是唯一的管理员,没有人在一夜之间运行任何nodetool命令,100%肯定。

更新

nodetool repair现在已经运行了6个多小时,它完全恢复了一个varchar列“项目描述”中的数据。

这是一个Cassandra问题,不,根本没有删除。就像我说的那些永不返回null的函数在它们中都是null(toTimestamp(now()))。

更新2

所以nodetool repair一夜之间完成,但NULLs仍在那里。{/ p>

所以我逐个节点地停止并重新启动它们,而NULLs已经消失,没有数据丢失。

如果你问我,这是一个大联盟的错误。我现在没有足够的资源去追求它,但是如果有人在这里面对这个简单的“修复”:

  1. 运行nodetool repair -dcpar以修复数据中心内的所有节点。
  2. 逐节点重新启动。

3 个答案:

答案 0 :(得分:3)

几个月前我遇到过类似的问题。在下面的博客中解释得相当不错。 (这不是我写的)。

在这种情况下,空值实际上是由更新引起的。

http://datanerds.io/post/cassandra-no-row-consistency/

答案 1 :(得分:0)

嗯......我想如果这是一个Cassandra bug,那么它已经被报道了。所以我在你的应用程序中闻到了代码错误,但是你没有发布任何代码,所以在你提供一些代码(我想看一下更新代码)之前,这只会是一个(狂野的)猜测。 )。

您不会删除数据,也不会使用TTL。可能看起来没有其他方法可以创建NULL值,但是还有一个更棘手的方法:绑定失败,即显式绑定到NULL。这可能看起来很奇怪,但它发生了......

  

...空值出现在整个数据中......

我希望在发布任何更新之前快速捕获这一点,从而在值上启用一些调试或断言代码。

答案 2 :(得分:0)

检查更新查询是否仅更新必要的列,或者通过包含表中所有列的列表的Java bean来检查更新查询。这将解释其他列的NULL更新,这些列不希望更新。