2015-12-11 28 views
9

我是卡桑德拉的新人,我讀過卡桑德拉鼓勵數據的非規範化和重複。這讓我有點困惑。 讓我們想象以下場景:如何確保Cassandra在不同表格上的數據一致性?

我有四個表一個密鑰空間:A,B,C和D.

CREATE TABLE A ( tableID int, column1 int, column2 varchar, column3 varchar, column4 varchar, column5 varchar, PRIMARY KEY (column1, tableID) );

讓我們想象一下,其他表(B,C,d )具有與表A相同的結構和相同的數據,只有使用不同的主鍵才能響應其他查詢。

如果我升級表A中的一行,我如何確保其他表中具有相同數據的數據的一致性?

回答

6

Cassandra爲此提供了BATCH。從documentation

批量語句將多個數據修改語言(DML)語句(INSERT,UPDATE,DELETE)成一個單一的邏輯運算,並設置爲通過在語句寫入的所有列的客戶端提供的時間戳該批次。批處理多個語句可以節省客戶端/服務器和服務器協調器/副本之間的網絡交換。但是,由於Cassandra的分佈式特性,儘可能地在附近的節點間傳播請求以優化性能。使用批次優化性能通常是不成功的,正如使用和濫用批次部分所述。有關加載數據的最快方式的信息,請參閱「Cassandra:批量加載,不使用批處理關鍵字」。

批次默認爲原子。在Cassandra批處理操作的上下文中,原子意味着如果批處理中的任何一個成功完成,它將全部結束。爲了實現原子性,Cassandra首先將序列化的批次寫入批量日誌系統表中,該批量日誌系統表將批量序列化爲blob數據。當批處理中的行成功寫入並保留(或暗示)時,批處理日誌數據將被刪除。原子性有一個性能損失。如果你不想承擔這個點球,防止卡桑德拉從編寫到使用未註冊的選項batchlog系統:BEGIN未登錄批

未登錄批幾乎都是不可取的,我相信在未來的版本中被刪除。正常批次提供您想要的功能。

1

您也可以從卡珊德拉3.0稱爲materialized views探索的一項新功能:

數據建模的基本規則在卡桑德拉涉及手動非規範化的數據爲基礎,將針對該表運行的查詢單獨的表。目前,在不指定分區鍵的情況下查詢列的唯一方法是使用二級索引,但它們不能替代將數據非規格化到新表中,因爲它們不適用於高基數數據。高基數二級索引查詢通常需要來自環中所有節點的響應,這增加了每個請求的延遲。而是使用客戶端非規範化和多個獨立表,這意味着許多不同的用戶會重寫相同的代碼。

在3.0中,Cassandra將引入一個名爲Materialized Views的新特性。實體化視圖處理自動服務器端的非規範化,消除了客戶端處理這種非規範化的需要,並確保了基本數據和視圖數據之間的最終一致性。這種非規範化允許使用正常的Cassandra讀取路徑在每個視圖中快速查找數據。

這個想法與Jeff Jirsa建議的完全一樣,但它不需要你處理應用程序中的所有多表一致性邏輯,Cassandra會自動爲你做。

+2

儘管如此,但要小心,因爲物化視圖是異步更新的,這意味着您的應用程序需要能夠處理最終的一致性。批處理方法可以讓您確保爲這類問題提供更好的一致性,但會降低應用程序的複雜性。 – awinder

相關問題