CAP理解及 consul、eureka、nacos對比


CAP原則又稱CAP定理,指的是在一個分布式系統中,一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance)

eureka

eureka集群下每個節點之間(P2P)都會定時發送心跳,定時同步數據,並沒有master/slave之分,因此每個注冊到eureka下的實例都會定時同步ip等,服務之間的調用也是根據eureka拿到的緩存服務數據進行調用。但是,如果一台eureka服務g掉了,其他eureka在一定時間內未感知到這台eureka服務g了,各個服務之間還是可以正常調用。 Eureka的集群中,只要有一台Eureka還在,就能保證注冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。當數據出現不一致時,雖然A, B上的注冊信息不完全相同,但每個Eureka節點依然能夠正常對外提供服務,這會出現查詢服務信息時如果請求A查不到,但請求B就能查到。如此保證了可用性但犧牲了一致性。 除此之外,Eureka還有一種自我保護機制,如果在15分鍾內超過85%的節點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現了網絡故障,此時會出現以下幾種情況:

Eureka不再從注冊表中移除因為長時間沒有收到心跳而過期的服務; Eureka仍然能夠接受新服務注冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用); 當網絡穩定時,當前實例新注冊的信息會被同步到其它節點中; 因此,Eureka可以很好的應對因網絡故障導致部分節點失去聯系的情況,而不會像zookeeper那樣使得整個注冊服務癱瘓。

Eureka保證高可用(A)和最終一致性:

服務注冊相對要快,因為不需要等注冊信息replicate到其他節點,也不保證注冊信息是否replicate成功

當數據出現不一致時,雖然A, B上的注冊信息不完全相同,但每個Eureka節點依然能夠正常對外提供服務,這會出現查詢服務信息時如果請求A查不到,但請求B就能查到。如此保證了可用性但犧牲了一致性。

Consul:

Consul 是 HashiCorp 公司推出的開源工具,用於實現分布式系統的服務發現與配置。Consul 使用 Go 語言編寫,因此具有天然可移植性(支持Linux、windows和Mac OS X)。

Consul 內置了服務注冊與發現框架、分布一致性協議實現、健康檢查、Key/Value 存儲、多數據中心方案,不再需要依賴其他工具(比如 ZooKeeper 等),使用起來也較為簡單。

Consul 遵循CAP原理中的CP原則,保證了強一致性和分區容錯性,且使用的是Raft算法,比zookeeper使用的Paxos算法更加簡單。雖然保證了強一致性,但是可用性就相應下降了,例如服務注冊的時間會稍長一些,因為 Consul 的 raft 協議要求必須過半數的節點都寫入成功才認為注冊成功 ;在leader掛掉了之后,重新選舉出leader之前會導致Consul 服務不可用。

Consul強一致性(C)帶來的是:

服務注冊相比Eureka會稍慢一些。因為Consul的raft協議要求必須過半數的節點都寫入成功才認為注冊成功
Leader掛掉時,重新選舉期間整個consul不可用。保證了強一致性但犧牲了可用性。

Consul強一致性(C)帶來的是:

服務注冊相比Eureka會稍慢一些。因為Consul的raft協議要求必須過半數的節點都寫入成功才認為注冊成功 Leader掛掉時,重新選舉期間整個consul不可用。保證了強一致性但犧牲了可用性。 Eureka保證高可用(A)和最終一致性:

服務注冊相對要快,因為不需要等注冊信息replicate到其他節點,也不保證注冊信息是否replicate成功 當數據出現不一致時,雖然A, B上的注冊信息不完全相同,但每個Eureka節點依然能夠正常對外提供服務,這會出現查詢服務信息時如果請求A查不到,但請求B就能查到。如此保證了可用性但犧牲了一致性。 其他方面,eureka就是個servlet程序,跑在servlet容器中; Consul則是go編寫而成。

Nacos

個人比較看好nacos,整合了配置中心和服務發現,和cloud,dubbo天然結合,代碼也沒啥侵入性 Nacos: Nacos是阿里開源的,Nacos 支持基於 DNS 和基於 RPC 的服務發現。在Spring Cloud中使用Nacos,只需要先下載 Nacos 並啟動 Nacos server,Nacos只需要簡單的配置就可以完成服務的注冊發現。

Nacos除了服務的注冊發現之外,還支持動態配置服務。動態配置服務可以讓您以中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置。動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴展變得更容易。

一句話概括就是Nacos = Spring Cloud注冊中心 + Spring Cloud配置中心。

 

總結:

C  一致性:注冊一個服務,集群下多節點必須全部注冊成功后才能進行訪問和使用;master節點掛掉了需要等待重新選舉成功后才能使用,選舉期間服務不可用; (所有節點在同一時間具有相同的服務)

A  可用性:注冊一個服務,只要有一個節點注冊成功就可以對外提供訪問;master節點掛了也可以正常使用; (保證每個請求不管成功或者失敗都有響應)

P  容錯性:把服務注冊到每個節點,增強容錯機制  (系統中任意信息的丟失或失敗不會影響系統的繼續運作)           


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM