本博客比較囉嗦, 想要看簡明的可直接看俺參考的鏈接
簡介
Quorum 機制,是一種分佈式系統中常用的,用來保證數據冗餘和最終一致性的投票算法,其主要數學思想來源於鴿巢原理
BTW:
鴿巢定理: 若有n個籠子和n+1只鴿子,所有的鴿子都被關在鴿籠裏,那麼至少有一個籠子有至少2只鴿子
算法
分佈式系統中的每一份數據拷貝對象都被賦予一票
系統共有票 (即有份數據冗餘)
-
每一個讀操作獲得的票數必須大於最小讀票數 , 如果票數不夠 就不能讀
-
每一個寫操作獲得的票數必須大於最小寫票數 , 如果票數不夠 就不能寫
和 滿足有以下限制:
算法的解釋
咱假設 , , 好了, 剛好滿足兩個限制條件. 有具體的數字會比較容易理解, 現在來看這兩個限制爲什麼這樣設定
- 限制1: 假如有一個寫請求過來了, 並且它獲得了 個冗餘拷貝的允許, 那這個寫請求可以被執行, 此時如果又來了個讀請求, 由於總共是 個冗餘拷貝, 那這個讀請求最多隻能獲得 張投票, 不夠 張, 讀請求不能被執行. 同理, 如果讀請求已經被允許了, 那寫請求就無法獲得足夠的許可了, 這樣就保證了一份數據的冗餘拷貝不會被同時讀寫
- 限制2: 假如有一個寫請求過來了, 並且它獲得了 個冗餘拷貝的允許, 那這個寫請求可以被執行, 此時如果又來了一個寫請求, 那麼它無論如何也拿不到 張以上的寫投票, 因爲票大部分投給了第一個寫請求了, 這樣就保證了一份數據的冗餘拷貝不會同時被兩個寫請求修改, 即數據的串行化修改
那些允許寫操作執行的冗餘拷貝, 也都必須完成同樣的寫更新, 最後寫操作才結束返回, 這麼說的話 限制2 同時也保證了半數以上的結點上的數據是新的, 剩下的由系統內部緩慢同步完成
那鴿巢定理呢, 用哪了?
假設一下 , 現在更新了 份冗餘拷貝, 總共 份冗餘拷貝, 那此時至少需要讀多少次才能讀到最新的數據呢? , 根據鴿巢定理, 至少得讀 份, 這 份中至少至少就有一份是新的數據, 此時再看看 限制1, 是不是覺得很合理!
算法的好處
- Quorum 的讀寫最小票數可以用來作爲系統在讀, 寫性能方面的一個可調節參數
- 寫票數 越大, 就可以越小, 此時寫的開銷大, 讀的開銷小
- 讀票數 越大, 就可以越小, 此時讀的開銷大, 寫的開銷小
有說得不清楚的或者說錯的歡迎在評論區指出來, 大家一起加油 !
Reference