0

我們遇到了在cassandra表中寫入數據的問題。Cassandra插入失敗

流程如下..我們使用一些主鍵從XXX中刪除所有記錄。 然後在循環中插入新的。

execute("DELETE FROM XXX WHERE key = {SOME_UUID}"); 

for(int i = 0; i < 5; ++i) { 
    execute("INSERT INTO XXX (key, field1, field2) VALUES ({SOME UUID},'field1','field2')"; 
} 

結果:有時不是所有的行都插入表中。查詢表後,我們看到並未插入所有行。

的環境,我們有:

我們使用DataStax企業版(4.5.2)。卡桑德拉2.0.10。 數據中心有4個節點,我們的密鑰空間設置爲replication_factor設置爲3. 查詢CONSISTENCY_LEVEL設置爲LOCAL_QUORUM

java驅動程序是數據stax企業2.1.1

在此先感謝。 任何幫助,將不勝感激。

+0

日誌是否顯示任何內容(嘗試在dbug中運行)? – 2014-09-29 12:55:54

+0

在日誌中沒有可疑的東西。沒有例外。沒有查詢被標記爲失敗... – Daa 2014-09-29 14:17:58

+0

嘗試將您的寫入一致性降至「ONE」並查看是否有所作爲。 – Aaron 2014-09-29 14:50:51

回答

1

我在你的例子中假設SOME_UUID對於刪除和插入是相同的。

這可能是刪除(邏輯刪除)和傳播到所有節點的新插入(根據您的複製因子)之間的競爭條件。如果刪除和插入標記有相同的時間戳,則刪除將獲勝。您可能會遇到在某些節點上刪除成功的情況,而在其他節點上,插入成功。

您可以嘗試將RF降至1,如@ BryceAtNetwork23建議的那樣。

另一個測試是在刪除和插入for循環之間的示例代碼中插入一個延遲(如500ms)。這會給插入前的刪除傳播時間。

根據您的數據模型,這裏最好的解決方案可能是避免刪除。

+0

那麼我們試着CL = 1。keyspace的RF是2,CL = 1。我們遇到了同樣的問題。所以我們切換到RF = 3 CL = QUORUM。我們試圖在刪除和插入之間加入一些延遲,看起來像是有幫助的...所以我們可以假設看到Cassandra這樣的行爲是正常的嗎? – Daa 2014-09-29 22:52:36

+1

@Daa雖然我不認爲這應該真的被認爲是「正常」的行爲,但我可以告訴你,經常從表中刪除數據被認爲是Cassandra的反模式。也許有一種方法可以讓你人爲地過期(而不是刪除它)並添加一個新的? – Aaron 2014-09-30 00:12:20

+1

關於具有相同時間戳的查詢:請注意,在驅動程序即將推出的版本2.1.2中,如果使用Cassandra> = 2.1.0,則時間戳將生成客戶端,因此不應再發生。 – 2014-09-30 07:46:04