我正在运行一个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.逐个节点重新启动。
3条答案
按热度按时间h79rfbju1#
几个月前我也遇到过类似的问题,在下面的博客中解释得很好(这不是我写的):WAT - Cassandra: Row level consistency #$@&%*!
在这种情况下,空值实际上是由更新引起的。
brgchamk2#
检查更新查询是否只更新了必要的列,或者它是通过一些SDK/库/框架(例如Java beans)来更新的,其中包括表中所有列的列表。这可以解释为什么其他不希望更新的列的更新为NULL。
niwlg2el3#
嗯.我认为如果这是一个Cassandra错误,它应该已经被报告了。所以我闻到了你的应用程序中的代码错误,但你没有发布任何代码,所以这将仍然只是一个(野生)猜测,直到你提供一些代码(我想看看更新代码)。
你不删除数据,也不使用TTL。似乎没有其他方法可以创建NULL值,但还有一个更棘手的方法:* 绑定失败 *,即显式绑定到NULL。这可能看起来很奇怪,但它确实发生了。
以来
.空值出现在所有的数据.
我希望在发布任何更新之前,能够非常快地捕获此消息,并对值启用一些调试或Assert代码。