RDBMS==>(MySql,Oracle,SqlServer等關系型數據庫)遵循的原則是:ACID原則
A:Atomicity 原子性
C:Consistency 一致性
I:Isolation 獨立性
D:Durability 持久性
NoSql==> (redis,Mogodb等非關系型數據庫)遵循的原則是:CAP原則
C:Consistency 強一致性
A: Availability 可用性
P:Partition Tolerance分區容錯性
分布式領域有一個很著名的CAP定理:
C:Consistency 數據一致性
A:Availability 服務可用性
P:Partition Tolerance 分區容錯性(服務對網絡分區故障的容錯性)
任何分布式系統只能保證兩個
CAP理論也就是說在分布式存儲系統中,最多只能實現以上兩點。
而由於當前網絡延遲故障會導致丟包等問題,所以我們分區容錯性是必須實現的。也就是NoSqL數據庫P肯定要有,我們只能在一致性和可用性中進行選擇,沒有Nosql數據庫能同時保證三點。(==>AP 或者 CP)
我覺得A:Availability 也很重要 要我選擇 我會選擇AP優先於CP 但是也要看具體的需求場景
回到問題
ureka和Zookeeper就是CAP定理中的實現,Eureka(保證AP),Zookeeper(保證CP)。
ureka的各個節點都是對等的,失去其中任何一個 不影響服務的AP
Zookeeper是主從關系master-slave的,當主節點掛掉,需要選出來新的主節點。需要耗費時間,這期間A:Availability是不能保證的(這里有一個重要點 Zookeeper 的選舉機制)
總結:
Zookeeper的設計理念就是分布式協調服務,保證數據(配置數據,狀態數據)在多個服務系統之間保證一致性,這也不難看出Zookeeper是屬於CP特性(Zookeeper的核心算法是Zab,保證分布式系統下,數據如何在多個服務之間保證數據同步)。Eureka是吸取Zookeeper問題的經驗,先保證可用性。