Cassandra数据损坏:某些列上出现NULL值

kb5ga3dv  于 11个月前  发布在  Cassandra
关注(0)|答案(3)|浏览(167)

我正在运行一个Cassandra 3.9集群,今天我注意到在一些生成的报告中有一些NULL值。
我打开了cqlsh,经过一些查询后,我注意到空值出现在所有数据中,显然是随机列。

Replication factor is 3.

字符串
我已经在集群上启动了一个nodetool repair,但它还没有完成。
我的问题是:我搜索了这种行为,但在任何地方都找不到它。显然,列中随机出现NULL值并不是一个常见的问题。有人知道发生了什么吗?这种数据损坏似乎相当严重。
详细信息:

  • 发生在经常使用toTimestamp(now())更新的列上,toTimestamp(now())从不返回NULL,所以它不是关于空数据的。
  • 发生在只插入一次且从不更改的不可变列上。(但表上的其他列经常更新。)

更新会像删除一样导致这种情况吗?对我来说似乎有点严重,醒来时看到一堆NULL值。
我也知道一些已经丢失的数据,我已经确定的三个条目是丢失的重要条目。这些条目肯定没有被删除-在一个到处都是NULL的特定表上没有删除。
我是唯一的管理员,没有人在一夜之间运行任何nodetool命令,100%肯定。

更新

nodetool repair已经运行了6+小时,现在它完全恢复了一个varchar列“项目描述”的数据.
这是Cassandra的问题,没有,根本没有删除。就像我说的,从不返回null的函数中有null(toTimestamp(now()))。

更新2

所以nodetool repair在一夜之间完成了,但是NULLs在早上还在那里。
所以我一个节点一个节点地停止并重新启动它们,瞧,NULLs不见了,没有数据丢失。
如果你问我,这是一个主要的错误。我现在没有资源去追求它,但如果其他人面临这个问题,这里是简单的“修复”:
1.运行nodetool repair -dcpar修复数据中心中的所有节点。
1.逐个节点重新启动。

h79rfbju

h79rfbju1#

几个月前我也遇到过类似的问题,在下面的博客中解释得很好(这不是我写的):WAT - Cassandra: Row level consistency #$@&%*!
在这种情况下,空值实际上是由更新引起的。

brgchamk

brgchamk2#

检查更新查询是否只更新了必要的列,或者它是通过一些SDK/库/框架(例如Java beans)来更新的,其中包括表中所有列的列表。这可以解释为什么其他不希望更新的列的更新为NULL。

niwlg2el

niwlg2el3#

嗯.我认为如果这是一个Cassandra错误,它应该已经被报告了。所以我闻到了你的应用程序中的代码错误,但你没有发布任何代码,所以这将仍然只是一个(野生)猜测,直到你提供一些代码(我想看看更新代码)。
你不删除数据,也不使用TTL。似乎没有其他方法可以创建NULL值,但还有一个更棘手的方法:* 绑定失败 *,即显式绑定到NULL。这可能看起来很奇怪,但它确实发生了。
以来
.空值出现在所有的数据.
我希望在发布任何更新之前,能够非常快地捕获此消息,并对值启用一些调试或Assert代码。

相关问题