2011-10-20 36 views
4

我想建立一個高可用性非常高的音量購物車應用程序卡桑德拉。該應用程序將有一個卷如此之高,我正在考慮使用cassandra而不是mysql的數據庫。用於存儲支付信息

現在,在購物車系統中,大多數數據庫操作必須100%一致,而其他人不必一定是。

100%一致行動示例: 保存付款確認。 保存已購買的物品清單。

不需要100%一致行動的事例: 保存客戶的地址(如果在付款時,沒有地址保存在數據庫中,假設它已丟失並再次詢問客戶) 。 其他類似的事情。

現在,如果我在同一區域(亞馬遜EC2)中運行服務器羣集,是否存在任何作爲最大一致事務執行所有事務的主要障礙。這是否會提供與mySQl關係數據庫相同的可靠性。請記住,我們正在處理這裏的金融交易。

是在卡桑德拉我的數據一般「安全」。我的意思是完全意外停電,隨機光盤失敗,等等,等等

回答

3

有很多不同的方式來定義一致性。如果「最大一貫交易」,你的意思是讀,在這個意義上,在ConsistencyLevel所有文字,然後將提供一致性的意義,你的閱讀將永遠不會返回了過期的價值和耐久性,你寫將被存儲在所有節點返回之前。

然而,這不同於交易。卡桑德拉不支持交易。它不像MySQL那樣提供不同行之間的一致性。例如,假設您將商品添加到購物籃中,並更新購物車中的總成本。單獨地,每個操作將被持續地和持久地存儲。但是,可能有一段時間可以看到一個變化,而不是另一個。在關係數據庫中,你可以將它們分組到一個事務中,這樣你只能看到兩個,或兩者都不是。

就安全性而言,Cassandra在執行任何其他操作之前將所有寫入操作存儲在提交日誌中,與關係數據庫使用事務日誌的方式相同。所以它對於系統崩潰同樣安全。至於節點故障,如果你寫在CL.ALL,那麼你將永遠不會,只要在每個副本集一個節點生存丟失數據。關於磁盤故障,這是你的底層硬件設置的問題,例如,襲擊。

+0

感謝您提供大量明確的信息。爲了彌補缺乏交易可以做到以下幾點:我創建一個名爲「鎖」的cassandra表。當我想要在數據庫上執行事務時,我將代表要寫入的行的uuid添加到鎖表中。在我用QUORUM寫完感興趣的行之後,我從鎖表中刪除uuids。如果同時嘗試了一個獨立查詢,它將首先檢查相關的uuids是否存在於鎖表中,如果它們是不允許的話。這會允許交易嗎?只有非常慢的? –

+0

不幸的是,這仍然容易出現競爭狀況,方法如下:1.客戶端A檢查鎖定表並且什麼也找不到。 2.客戶A讀取購物籃。 3.客戶端B寫入鎖表。 4.客戶B更新購物籃和總成本。 5.客戶端B清除鎖定。 6.客戶A讀取總成本,現在與先前閱讀的購物籃不一致。如果不使用更強大的分佈式協議(如Zookeeper提供的分佈式協議)(由@sdolgy提到),則不能解決此問題 –

+0

我認爲您跳過了其中一個步驟。最初的步驟將是:1.客戶端A檢查鎖定表並且什麼也找不到。 2.客戶端A在其打算讀取或寫入的每個項目上插入一個鎖。 3.客戶A讀取購物籃。 3.客戶端B檢查鎖定表並找到它感興趣的項目的鎖,因此它停止。 4.客戶A完成其操作。 –

5

針對您關於可用性和EC2的問題......正如Theodore所寫,Cassandra的一致性級別將決定數據的「安全」程度。你要面對的問題是如何保證數據越來越卡桑德拉,實現您的交易目標,並正在適當地保存。

在Apache Cassandra用戶的郵件列表中有一些關於交易和解決這個問題的好主意。

卡桑德拉它自己是不適合的交易:

要解決這個問題,你需要「東西」,可以利用卡桑德拉爲管理上述交易的數據存儲數據層。

總結...您不能保證單獨與Cassandra進行金融交易