CAP理論主要是說, 在分散式架構下, 只要涉及讀寫操作時, 上面三個性質, 最多保證兩個滿足, 另一個最多盡量滿足, 又或是被犧牲.
滿足了一致性+高可用, 但就犧牲了分區容錯.
But!!! 分散式架構下, 集群的節點間不可能保證網路絕對沒問題, 所以P基本上是必須考慮的.
滿足了資料的一致性跟分區容錯. 如果節點發生錯誤, 就會導致該系統某些請求會失敗.
滿足了高可用性和分區容錯, 但資料的強一致性會犧牲掉, 但能夠確保資料的最終一致性.
大部分的NoSQL都選擇此策略來實現叢集架構.
CAP理論中的Consistency一致性, 能靠NWR模型知道這系統是強一致性還是弱一致性
N : 表示N個replica(副本); 資料被複製到多少個節點
R : 表示一次讀取操作中, 成功讀取操作的最小節點數(就是要讀幾個replica, 然後從中返回最新版本的資料)
W : 成功寫入操作的最小節點數(就是要完成幾個replica的同步才叫寫入完成)
用來設定每次執行更新操作時要達成的consistency level
也是用來保證資料冗餘與最終一致性的投票演算法.
有幾種一致性級別, 這些級別是能依靠NWR模型來定義.
概念類似於鴿籠原理
如果資料庫做主從抄寫, 當更新請求發出到主庫時, 客戶端需要等待主庫複製到從庫完成, 之後所有查詢該紀錄的請求都會拿到最新的資料, 那這情境就是強一致性的保證.
RDBMS能確保這件事情都是依賴對資料加上Lock實現的, 但吞吐量就會下降.
W+R > N 時 == 強一致性
3個副本節點時, 寫入要求至少2個有ack, 讀取也是任意讀取2節點,挑選版本最新的資料.
這樣寫入時過半節點都能確保有更新成功, 讀取節點也過半, 一定會撈到最新版本的資料.
這樣就能確保系統在讀取時都能拿到最新的資料.
不同replica上的資料有新有舊.
W + R <= N == Weak consistency
上面為例, 寫入要求2個ack, 讀取只讀取1個節點; W+R=3 <= 3, 有可能還是讀到舊資料.
寫入要求1個ack, 讀取只讀取2個節點; 還是可能讀到舊資料.
NWR模型中;
W要是越大, TPS就越低.
R要是越大, QPS就越低.
為了保持讀寫均衡, 通常的配置係數是 : W=R=Q, Q=(N/2)+1 (i.e. Quorum > 副本數量/2)