浅谈分布式CAP定理
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
互聯(lián)網發(fā)展到現(xiàn)在,由于數(shù)據量大、操作并發(fā)高等問題,大部分網站項目都采用分布式的架構。而分布式系統(tǒng)最大的特點數(shù)據分散,在不同網絡節(jié)點在某些時刻(數(shù)據未同步完,數(shù)據丟失),數(shù)據會不一致。
在2000年,Eric Brewer教授在PODC的研討會上提出了一個猜想:一致性、可用性和分區(qū)容錯性三者無法在分布式系統(tǒng)中被同時滿足,并且最多只能滿足其中兩個!
在2002年,Lynch證明其猜想,上升為定理。被這就是大家所認知的CAP定理。
CAP是所有分布式數(shù)據庫的設計標準。例如Zookeeper、Redis、HBase等的設計都是基于CAP理論的。
CAP定義
所謂的CAP就是分布式系統(tǒng)的三個特性:
- Consistency,一致性。所有分布式節(jié)點的數(shù)據是否一致。
- Availability,可用性。在部分節(jié)點有問題的情況(數(shù)據不一致、節(jié)點故障)下,是否能繼續(xù)響應服務(可用)。
- Partition tolerance,分區(qū)容錯性。允許在節(jié)點(分區(qū))數(shù)據不一致的情況。
深入理解
有A、B、C三個分布式數(shù)據庫。
當A、B、C的數(shù)據是完全相同,那么就符合定理中的Consistency(一致性)。
假如A的數(shù)據與B的數(shù)據不相同,但是整體的服務(包含A、B、C的整體)沒有宕機,依然可以對外系統(tǒng)服務,那么就符合定理中的Availability(可用性)。
分布式數(shù)據庫是沒有辦法百分百時刻保持各個節(jié)點數(shù)據一致的。假設一個用戶再A庫上更新了一條記錄,在更新完這一刻,A與B、C庫的數(shù)據是不一致的。這種情況在分布式數(shù)據庫上是必然存在的。這就是Partition tolerance(分區(qū)容錯性)
當數(shù)據不一致的時候,必定是滿足分區(qū)容錯性,如果不滿足,那么這個就不是一個可靠的分布式系統(tǒng)。
然而在數(shù)據不一致的情況下,系統(tǒng)要么選擇優(yōu)先保持數(shù)據一致性,這樣的話。系統(tǒng)首先要做的是數(shù)據的同步操作,此時需要暫停系統(tǒng)的響應。這就是滿足CP。
若系統(tǒng)優(yōu)先選擇可用性,那么在數(shù)據不一致的情況下,會在第一時間放棄一致性,讓整體系統(tǒng)依然能運轉工作。這就是AP。
所以,分布式系統(tǒng)在通常情況下,要不就滿足CP,要不就滿足AP。
那么有沒有滿足CA的呢?有,當分布式節(jié)點為1的時候,不存在P,自然就會滿足CA了。
例子
上面說到,分區(qū)容錯性是分布式系統(tǒng)中必定要滿足的,需要權衡的是系統(tǒng)的一致性與可用性。那么常見的分布式系統(tǒng)是基于怎樣的權衡設計的。
- Zookeeper 保證CP。當主節(jié)點故障的時候,Zookeeper會重新選主。此時Zookeeper是不可用的,需要等待選主結束才能重新提供注冊服務。顯然,Zookeeper在節(jié)點故障的時候,并沒有滿足可用性的特性。在網絡情況復雜的生產環(huán)境下,這樣的的情況出現(xiàn)的概率也是有的。一旦出現(xiàn),如果依賴Zookeeper的部分會卡頓,在大型系統(tǒng)上,很容易引起系統(tǒng)的雪崩。這也是大型項目不選Zookeeper當注冊中心的原因。
- Eureka 保證AP。在Eureka中,各個節(jié)點是平等的,它們相互注冊。掛掉幾個節(jié)點依然可以提供注冊服務的(可以配置成掛掉的比例),如果連接的Eureka發(fā)現(xiàn)不可用,會自動切換到其他可用的幾點上。另外,當一個服務嘗試連接Eureka發(fā)現(xiàn)不可用的時候,切換到另外一個Eureka服務上,有可能由于故障節(jié)點未來得及同步最新配置,所以這個服務讀取的數(shù)據可能不是最新的。所以當不要求強一致性的情況下,Eureka作為注冊中心更為可靠。
- Git 其實Git也是也是分布式數(shù)據庫。它保證的是CP。很容易猜想到,云端的Git倉庫于本地倉庫必定是要保證數(shù)據的一致性的,如果不一致會先讓數(shù)據一致再工作。當你修改完本地代碼,想push代碼到Git倉庫上時,假如云端的HEAD與本地的HEAD不一致的時候,會先同步云端的HEAD到本地HEAD,再把本地的HEAD同步到云端。最終保證數(shù)據的一致性。
更多技術文章、精彩干貨,請關注
個人博客:zackku.com
公眾號:Zack說碼
轉載于:https://my.oschina.net/zackku/blog/2877970
總結
以上是生活随笔為你收集整理的浅谈分布式CAP定理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 0016-Avro序列化反序列化和Spa
- 下一篇: Angular7教程-06-页面与数据交