Cassandra 数据损坏:某些列上出现 NULL 值
Posted
技术标签:
【中文标题】Cassandra 数据损坏:某些列上出现 NULL 值【英文标题】:Cassandra data corruption: NULL values appearing on certain columns 【发布时间】:2017-01-06 17:13:50 【问题描述】:我正在运行一个 Cassandra 3.9
集群,今天我注意到一些生成的报告中有一些 NULL 值。
我打开 cqlsh,经过一些查询后,我注意到空值出现在整个数据中,显然是在随机列中。
Replication factor is 3.
我已经在集群上启动了nodetool repair
,但它还没有完成。
我的问题是:我搜索了这种行为,但在任何地方都找不到。显然,在列中随机出现 NULL 值并不是一个常见问题。
有人知道发生了什么吗?这种数据损坏似乎相当严重。提前感谢您的任何想法。
添加细节:
发生在经常使用toTimestamp(now())
更新且从不返回NULL
的列上,因此与输入的空数据无关。
发生在仅插入一次且从未更改的不可变列上。 (但表中的其他列经常更新。)
更新会像删除一样导致这种情况吗?对我来说似乎有点严肃,醒来时看到一堆 NULL
值。
我还特别知道一些丢失的数据,我已经确定的三个条目是丢失的重要条目。这些肯定没有被删除 - 在一个到处都是 NULL 的特定表上没有删除。
我是唯一的管理员,没有人在一夜之间运行任何nodetool
命令,100% 肯定。
更新
nodetool repair
现在已经运行了 6 个多小时,它完全恢复了一个 varchar
列“项目描述”上的数据。
这是一个 Cassandra 问题,不,根本没有删除。就像我说的那样,从不返回 null 的函数中有 null (toTimestamp(now())
)。
更新 2
所以nodetool repair
在一夜之间完成,但NULLs
早上还在。
所以我逐个节点停止并重新启动它们,瞧,NULLs
消失了,没有数据丢失。
如果你问我,这是一个大联盟的错误。我现在没有资源去追求它,但如果其他人面临这个问题,这是简单的“修复”:
-
运行
nodetool repair -dcpar
修复数据中心内的所有节点。
逐个节点重启。
【问题讨论】:
NULL 可以是result of a delete。 嗨。谢谢你的主意。更新会导致这种情况吗?此表有 2 或 3 列,每小时更新一次。但是为 NULL 的列不会更新。例如,插入后永远不会更改的文件路径列充满了 NULL。还有一个时间戳列,它只能通过 Cassandra 函数 toTimestamp(now()) 更新,它永远不会为 NULL.... TTLs can also cause NULLs 谢谢。运行 describe table 我得到 default_time_to_live = 0 - 我从未在这些表上使用过 TTL 功能。 虽然我不知道您的 NULL 源自何处,但我指出 NULL 并不一定表示数据损坏,因为它们可以通过其他方式合法地创建。 【参考方案1】:几个月前我遇到了类似的问题。在下面的博客中解释得很好。 (这不是我写的)。
在这种情况下,null 值实际上是由更新引起的。
http://datanerds.io/post/cassandra-no-row-consistency/
【讨论】:
我将此标记为已接受的答案,因为该博客文章显然解释了这里发生的事情。还有一个问题:为什么 nodetool repair 解决了这个问题?数据潜伏在某处?另外,nodetool 修复完成后,出现了一些新的空值。到目前为止,我唯一合理的解释就是那篇博文中描述的内容。【参考方案2】:嗯...我认为如果这是一个 Cassandra 错误,它已经被报告了。所以我在你的应用程序中闻到了代码错误,但你没有发布任何代码,所以这只是一个(疯狂的)猜测,直到你提供一些代码(我想看看更新代码)。
您不会删除数据,也不会使用 TTL。似乎没有其他方法可以创建 NULL 值,但还有一种更棘手的方法:绑定失败,即显式绑定到 NULL。这可能看起来很奇怪,但它确实发生了......
自从
...空值出现在整个数据中...
我希望在发布任何更新之前能够非常快速地在值上启用一些调试或断言代码。
【讨论】:
nodetool repair 到目前为止已将给定表的空值减少了 50%。它已经运行了 6 个多小时。 这是一个 Cassandra 问题。这通常发生在删除期间。在这种情况下,它发生在更新无关列的过程中。不好。 “这通常发生在删除过程中”。你不使用删除,是吗? “在这种情况下,它发生在更新期间”。您必须发现这些 NULL 值的来源,但我目前打赌“我的 UPDATE 代码中有一个错误”。在您的 UPDATES 中添加一些代码保护,发布一些代码,然后让我们检查一下... 否则向 ASF 提交 Cassandra JIRA 错误报告。 这段代码只有 2 次更新,它在不可能的值上插入 NULL,就像我提到的,timestamp 和 now() 永远不会返回 NULL。【参考方案3】:检查更新查询是否只更新必要的列,或者通过包含表中所有列的列表的 Java bean 进行更新。这将解释不需要更新的其他列的 NULL 更新。
【讨论】:
首先检查。只有两个查询会影响表,但正如我所说,其中一个空列是通过 col = toTimestamp(now()) 更新的,它永远不会返回空值。它与 Cassandra 隔离,而不是业务层。以上是关于Cassandra 数据损坏:某些列上出现 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章