【轉載】對 Zookeeper 的一些分析
1. zookeeper 不是爲高可用性設計的
- 因爲要跨機房容災,不少系統其實是須要跨機房部署的。出於性價比的考慮咱們一般會讓多個機房同時工做,而不會搭建 N 倍的冗餘。也就是說單個機房確定撐不住全流量(你能設想谷歌在全球只剩下一個機房在幹活嗎)。因爲 zookeeper 集羣只能有一個 master ,所以一旦機房之間鏈接出現故障,zookeeper master 就只能照顧一個機房,其餘機房運行的業務模塊因爲沒有 master 都只能停掉。因而全部流量集中到有 master 的那個機房,因而系統 crash 。
- 即便是在同一個機房裏面,因爲網段的不一樣,在調整機房交換機的時候偶爾也會發生網段隔離的狀況。實際上機房每月基本上都會發生短暫的網絡隔離之類的子網段調整。在那個時刻 zookeeper 將處於不可用狀態。若是整個業務系統基於 zookeeper(好比要求每一個業務請求都先去 zookeeper 獲取業務系統的master 地址),則系統的可用性將很是脆弱。
- 因爲 zookeeper 對於網絡隔離的極度敏感,致使 zookeeper 對於網絡的任何風吹草動都會作出激烈反應。這使得 zookeeper 的‘不可用’時間比較多,咱們不能讓 zookeeper 的‘不可用’,變成系統的不可用。
2. zookeeper 的選舉過程速度很慢
- 這是一個很難從理論分析上看到的弱點,可是你一旦遇到就會痛不欲生。
- 前面咱們已經說過,網絡實際上經常是會出現隔離等不完整狀態的,而 zookeeper 對那種狀況很是敏感。一旦出現網絡隔離,zookeeper 就要發起選舉流程。
- zookeeper 的選舉流程一般耗時 30 到 120 秒,期間 zookeeper 因爲沒有 master,都是不可用的。
- 對於網絡裏面偶爾出現的,好比半秒一秒的網絡隔離,zookeeper 會因爲選舉過程,而把不可用時間放大幾十倍。
3. zookeeper 的性能是有限的
- 典型的 zookeeper 的 tps 大概是一萬多,沒法覆蓋系統內部天天動輒幾十億次的調用。所以每次請求都去zookeeper 獲取業務系統 master 信息是不可能的。
- 所以 zookeeper 的 client 必須本身緩存業務系統的 master 地址。
- 所以 zookeeper 提供的‘強一致性’其實是不可用的。若是咱們須要強一致性,還須要其餘機制來進行保障:好比用自動化腳本把業務系統的 old master 給 kill 掉,可是那會有不少陷阱(這裏先不展開這個議題,讀者能夠本身想一想會有哪些陷阱)。
4.zookeeper 沒法進行有效的權限控制
- zookeeper 的權限控制很是薄弱。
- 在大型的複雜系統裏面,使用 zookeeper 必須本身再額外的開發一套權限控制系統,經過那套權限控制系統再訪問 zookeeper 。
- 額外的權限控制系統不但增長了系統複雜性和維護成本,並且下降了系統的整體性能。
5.即便有了 zookeeper 也很難避免業務系統的數據不一致
- 前面已經討論過了,因爲 zookeeper 的性能限制,咱們沒法讓每次系統內部調用都走 zookeeper,所以總有某些時刻,業務系統會存在兩個 master(業務系統 client 那邊緩存的業務系統 master 信息是定時從zookeeper 更新的,所以會有更新不一樣步的問題)。
- 若是要在業務系統 client 的 master 信息不一直的狀況下,仍要保持系統的數據一致性,惟一的方法是「先 kill 掉老 master,再在 zookeeper 上更新 master 信息」。可是在是否要 kill current master 這個問題上,程序是沒法徹底自動決定的(由於網絡隔離的時候 zookeeper 已經不可用了,自動腳本沒有全局信息,無論怎麼作均可能是錯的,什麼都不作也多是錯的。當網絡故障的時候,只有運維人員纔有全局信息,程序是沒法接電話得知其餘機房的狀況的)。所以系統沒法自動的保障數據一致性,必需要人工介入。而人工介入的典型時間是半個小時以上,咱們不能讓系統這麼長時間不可用。所以咱們必須在某個方向上進行妥協,最多見的妥協方式是放棄‘強一致性’,而接受‘最終一致性’。
- 若是咱們須要人工介入才能保證‘可靠的強一致性’,那麼 zookeeper 的價值就大打折扣。
6.咱們能作什麼
- 咱們或者選擇人工介入的強一致性,或者選擇程序自動化進行的弱一致性。須要進行取捨。
- 最終一致性甚至未必是程序來作的,有時候人工修正數據反而在靈活、可靠、低成本上有優點。這須要權衡。
- 不要迷信 zookeeper,有時候不妨考慮一下主備數據庫。數據庫自帶權限控制,用起來比 zookeeper 方便多了。
- zookeeper 比較有價值的東西也許是內容變化的時候,能夠阻塞回調的方式通知全部在線的 client 實時更新信息,但這個功能用處不大。由於 php 這樣的模塊你很難說它是在線仍是離線,每次都是新發起的。一旦這個功能沒法支持 php,就沒法覆蓋整個系統,那麼就沒法保證強一致性了。
PS:以上只是我的對 zookeeper 的一些認識,歡迎討論和指正。
歡迎關注本站公眾號,獲取更多信息