2017-01-06 64 views
2

我正在運行Cassandra 3.9羣集,今天我在一些生成的報告中注意到一些NULL值。Cassandra數據損壞:出現在某些列上的NULL值

我打開了cqlsh,經過一些查詢,我發現空值出現在整個數據上,顯然是隨機列。

Replication factor is 3.

我已經開始在集羣中nodetool repair,但尚未完成。

我的問題是:我搜索了這種行爲,找不到任何地方。顯然,在列中隨機出現NULL值不是一個常見問題。

有誰知道發生了什麼事?這種數據損壞看起來很嚴重。提前感謝任何想法。

ADDED詳情:

  • 發生在那些經常與toTimestamp(now())從未返回NULL更新的列,所以它的不是空數據去

  • 發生在那些只插入不可改變列。一次,永不改變。 (但是桌面上的其他列經常更新。)

更新是否導致這種情況與刪除操作相似?看起來對我來說有點嚴肅,醒悟到一堆NULL的值。

我也特別瞭解一些已經丟失的數據,我已經確定的三個條目是針對缺少的重要條目。這些並沒有被刪除 - 在一個特定的表格上沒有刪除,這個表格在任何地方都是NULL。

我是唯一的管理員,沒有人在一夜之間運行任何nodetool命令,100%確定。

UPDATE

nodetool repair已現運行6+小時,它完全恢復上一個varchar欄「項目說明」中的數據。

這是一個卡桑德拉問題,不,根本沒有刪除。就像我說過的函數永不返回null(toTimestamp(now()))。

更新2

所以nodetool repair一夜之間完成,但NULLs仍然有在上午。

所以我去了節點停止並重新啓動它們,因此,NULLs已經消失,並且沒有數據丟失。

如果你問我,這是一個主要的聯盟bug。我沒有足夠的資源後,現在它走了,但如果任何人都面臨着這樣這裏的簡單的「修復」:

  1. 運行nodetool repair -dcpar解決所有節點的數據中心。
  2. 按節點重新啓動。
+2

一個NULL可以是[刪除的結果](http://thelastpickle.com/blog/2016/07/27/about-deletes-and-tombstones.html)。 – LHWizard

+0

嗨。感謝這個想法。更新是否會導致此問題?此表格有2或3列每小時更新一次。但是NULL的列不會更新。例如,插入後永遠不會更改的文件路徑列充滿NULL。還有一個時間戳列,只能通過Cassandra函數toTimestamp(now())更新,永遠不會爲NULL .... –

+3

[TTLs也可以導致NULL](https://docs.datastax.com/en/cql/3.3/ cql/cql_using/useExpire.html) – LHWizard

回答

3

幾個月前我遇到過類似的問題。在下面的博客中有很好的解釋。 (這不是我寫的)。

空值實際上是由更新引起的。

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

+0

我將此標記爲已接受的答案,因爲該博文明顯解釋了此處發生的情況。仍然有一個問題仍然存在:爲什麼nodetool修復解決了這個問題?數據在那裏潛伏着嗎?另外,節點工具修復完成後,出現了一些新的空值。我迄今爲止唯一合理的解釋是該博客文章中描述的內容。 –

0

嗯......我想如果這是一個卡桑德拉的錯誤,它已經被報道了。所以我在你的應用程序中聞到代碼錯誤,但是你沒有發佈任何代碼,所以在你提供一些代碼(我想看看更新代碼)之前,這隻會是一個(瘋狂的)猜測。

您不會刪除數據,也不會使用TTL。看起來沒有其他方法可以創建NULL值,但還有一個更棘手的方法:失敗,綁定,即明確綁定到NULL。它可能看起來很奇怪,但它發生......

由於

...都出現在整個數據空值...

我希望抓住這個非常在發佈任何更新之前快速啓用一些調試或斷言代碼。

+0

nodetool修復減少了一個給定的桌子沙發的50%的零點。它已經運行了6個多小時。 –

+0

這是一個卡桑德拉問題。這通常發生在刪除過程中。在這種情況下,它發生在更新不相關的列時。不好。 –

+0

*「通常在刪除時發生」*。你不使用刪除,是嗎? *「在這種情況下,它發生在更新」*。你必須從這些NULL值的來源發現,但我目前在賭「我的UPDATE代碼中有一個錯誤」。在你的UPDATES上放一些代碼守衛,發佈一些代碼,讓我們來檢查一下...否則就向ASF提交一份Cassandra JIRA錯誤報告。 – xmas79

0

檢查更新查詢是隻更新必要的列,還是通過包含表中所有列的Java bean執行更新查詢。這將解釋不希望更新的其他列的NULL更新。

+0

首先檢查。只有兩個查詢會影響表,但正如我所說的,其中一個空列是通過col = toTimestamp(now())更新的,永遠不會返回null。它與Cassandra分離,而不是業務層。 –