2014-10-22 118 views
0

取自http://www.ibm.com/developerworks/library/os-apache-cassandra/中的示例。假設我們關心兩個實體:書籍和標籤。一本書有多個標籤,所以它們之間的關係是1:M。cassandra:不一致的列族

根據文章,我們應該創建兩個列族:BooksTags2BooksIndex。前者存儲關於一本書的所有信息(包括其所有標籤),而後者是一個從標籤映射到書籍的索引,因此對於給定的標籤,我們可以快速找到具有該標籤的所有書籍。所有這些看起來很好。但我有一個問題:

考慮如何將新書添加到數據庫:(1)將新行添加到列家族Books,(2)更新Tags2BooksIndex將新書添加到所有與這本書。

假設我們完成步驟(1)2秒後,新的書籍行已被複制到它應該去的所有節點,並且步驟(2)仍在繼續。現在,如果我從books讀取這個新書籍以獲取標籤,然後使用此標籤檢查Tags2BooksIndex,則可能發生以下情況:我無法從Tags2BooksIndex中找到新書,因爲它尚未完全更新,或者更新尚未被複制到所有副本節點。

如何處理這種情況?更換2秒2毫秒,我們仍然有不一致的時間窗口。我想知道處理這種情況的「正確/實用」方法。

回答

0

Cassandra落入CAP的AP一側。它犧牲了一致性。在cassandra 2.x中有批處理語句可以提供幫助:http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/batch_r.html

雖然這裏真正的問題是這種不一致的後果是什麼?這是一個2分鐘的窗口,在這個窗口期間,您的搜索不會爲標籤返回新書嗎?這是災難性的嗎?在容錯分佈式系統中,通常不得不接受不一致的口袋,否則會犧牲可用性,因爲分區可能會發生。如果您的數據模型確實需要兩個獨立的原子突變,那麼批處理語句可以提供幫助,但是它會消耗一些可用性。如果你有一點不一致,那麼你仍然可用。這歸結於您的具體業務要求,即什麼是和不可接受。

相關問題