爲什麼在分佈式環境下CAP三者不可兼得?對此問題可作棋盤推演,這樣問題的關鍵轉換爲:假設存在網絡分區的情形,若已獲得P,即容忍網絡分區的存在,那麼C和A是否能夠兼得。
能夠分爲兩種情形來進行進一步推演。
情形一:若是在這個分佈式系統中數據無副本,那麼系統必然知足強一致性條件,由於只有獨本數據,不會出現數據不一致的可能。此時C和P兩要素具有,可是若是系統發生了網絡分區情況或者機器宕機,必然致使某些數據不可訪問,此時可用性條件是不能被知足的,即在此情形下得到了CP系統,但CAP不可同時知足。
情形二:若是系統中數據有副本(見圖2-2),假設變量x存在兩份副本並分別存儲在不一樣機器上,最初數據保持一致,其值都爲v1。在Time=t1的時刻,在機器1上發生對x的數值更新操做,此操做要將x的值賦爲v2。時間推移到Time=t2時刻,機器1上的x已經被賦予新值v2,若是此時未發生網絡分區情況,系統能夠將x的新值v2同步到機器2,達到數據一致性要求。可是若是此時發生了網絡分區致使兩臺機器沒法通訊,那麼沒法將x的新值同步到機器2,這個時刻咱們不得不在C或A之間作個權衡和選擇。若是但願系統高可用(選擇A),那麼對於讀取機器2上的x的查詢請求必須在限定時間內返回值,此時返回的並不是是最新的值v2,因此出現了數據不一致的問題(拋棄C)。若是選擇強一致性(選擇C),那麼在兩臺機器恢復通訊並將數據同步到一致狀態前,對於機器2的x讀請求必須予以拒絕,此時沒法保證系統的可用性(拋棄A)。因此不論選擇哪個,必然以犧牲另一個因素做爲代價,也就是說要麼AP,要麼CP,可是沒有完美的CAP。網絡