2014-12-05 73 views
1

這個問題是關於NoSQL(例如採取cassandra)。擺脫關於NoSQL數據庫的困惑

  • 確實,當您使用沒有數據複製的NoSQL數據庫時,您沒有一致性問題?也不是在訪問併發的情況下?

  • 如果在兩個分區中可能多次寫入同一行的分區,會發生什麼情況?當分區不見了時,使用哪個寫入值?假設你使用N = 5,W = 3,R = 3。這意味着你有保證一致性的權利?使用這個法定人數有多好?有3個節點返回數據不是一個很大的開銷嗎?

  • 您能否在cassandra的每個查詢基礎上指定是否希望查詢保證一致性?例如,你做一個插入查詢,並且你想強制所有副本在讀取操作返回值之前完成插入操作?

  • 如果您有:員工{PK:employeeID,departmentId,employeeName,生日}和部門{PK:departmentID,departmentName},並且想要獲得具有特定部門名稱的所有員工的生日。兩個問題:

    1. 你不能要求所有與給定的生日的員工(因爲你只能在主鍵查詢)
    2. 你無法加入員工和部門列的家庭,因爲加入是不可能的。

所以你可以做的是創建一個列族:

departmentBirthdays {PK:(DEPARTMENTNAME,生日),[員工-衛生組織生日,此結果]}

在這種情況下,每當員工被解僱/僱用時,都必須在departmentBirthday專欄中刪除/添加。這個過程是否必須手動完成?所以你必須手動創建查詢來更新所有冗餘/非規範化數據?

回答

2

我會從cassandra的角度回答這個問題,這就是你似乎正在看的東西(幾乎沒有任何兩個nosql商店是相同的!)。

  1. 對於單個節點,所有操作都是按順序進行的。併發問題可以是正交的,儘管...您的Web客戶端可能提出了請求,然後是另一個請求,但由於網絡負載,cassandra首先獲得第二個請求。這可能是也可能不是問題。圍繞這些問題有很多方法,比如不可變數據。您還可以利用「輕量級交易」。

  2. Cassandra使用最後寫入勝利來解決衝突。根據您的查詢的複製因子和一致性級別,這可以很好地工作。

  3. 讀取和寫入的Quurom會給你一致性。有一個邊緣情況。如果協調員不知道仲裁節點關閉,它會發送寫入請求,然後在重新建立仲裁時完成寫入。在這種情況下,客戶端會得到超時而不是失敗。後續的查詢可能會得到陳舊的數據,但是之後的任何查詢都會得到最新的數據。這是一個極端的情況,通常N = 5,R = 3,W3 =會給你完全一致性。從三個節點讀取實際上並不是那麼多的開銷。對於R = 3的查詢,客戶端會將該請求發送到它所連接的節點(協調器)。協調員將並行查詢副本(不按順序)。它將用LWW結果結果以獲得結果(並在需要時發佈讀取修復等)。由於查詢並行發生,開銷大大降低。

  4. 是的。

  5. 這是一個數據建模問題。你描述了一種方法(儘管生日分區而不是分區可能會更好,並導致分區分佈更均勻)。你需要員工和部門表嗎?他們需要其他查詢嗎?如果沒有,也許你只需要一個。如果你非規範化,你需要手動維護數據。在Cassandra 3.0中,全局索引將允許您在索引上進行查詢而沒有低效(當今在未指定分區鍵的情況下使用二級索引時就是這種情況)。是的另一種選擇是按生日劃分僱員並做兩個查詢,並在客戶端的內存中進行連接。 Cassandra查詢分區的速度非常快,所以做兩個分區並不會那麼昂貴。