【发布时间】: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....
-
谢谢。运行 describe table 我得到 default_time_to_live = 0 - 我从未在这些表上使用过 TTL 功能。
-
虽然我不知道您的 NULL 源自何处,但我指出 NULL 并不一定表示数据损坏,因为它们可以通过其他方式合法地创建。
标签: cassandra