2019年1月27日 星期日

分散式系統的 CAP

每次看完就會重新想起來,然後一段時間之後又會忘記定義,所以想說整理一下推導這個概念的過程。

CAP 分別代表的是以下三個概念:

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分區容錯性(Partition tolerance):我個人認為白話來說就是是否允許系統中有節點與其他節點完全斷線。

最重要的關鍵在於 Partition tolerance 的問題,也就是當節點間的連線被切斷了的時候,狀況會變成如何?

  1. 滿足 AP 時無法滿足 C-如果節點連線被切斷了,例如被切割成 A 群和 B 群節點,但整個分散式系統的所有節點依然都能夠繼續提供服務,這時就滿足了 Availability 和 Partition tolerance。但因為 A 群和 B 群互相連不上對方,因此在 A 群當中做的變更,將無法反應在 B 群中。亦即此時 Consistency 就無法被滿足了。在 GlusterFS 當中,這個現象被稱為 split brain,就是系統存在兩顆大腦,兩顆大腦會同時做不同的思考。
  2. 滿足 CP 時無法滿足 A-如果節點連線被切斷了,變成 A 群和 B 群節點,但因為要確保整個系統資料的一致性,因此依照某些規則決定把被認為斷線的那個部份停用,例如認為 A 群才是 master,把 B 群暫時停用,直到 B 群重新連上 A 群為止。此時能夠保證 Consistency 和 Partition tolerance,但是因為在被分區的這個當下,部份節點會處於不可用的狀態,因此就無法滿足 Availability 了。
  3. 滿足 CA 時無法滿足 P-如果永遠要確保在系統中所有節點的資料一致,而且所有節點都要保證可用,那麼可想而知,就不能允許發生像上面講到的,網路斷線產生兩群節點互相連不上對方的狀況(因為一旦發生斷線,只要雙方都持續提供服務,則一定會 split brain;要不 split brain 只能選擇停用其中一方)。也就是這時就無法滿足 Partition tolerance 了。

沒有留言: