分布式網站架構后續:zookeeper技術淺析


  Zookeeper是hadoop的一個子項目,雖然源自hadoop,但是我發現zookeeper脫離hadoop的范疇開發分布式框架的運用越來越多。今天我想談談zookeeper,本文不談如何使用zookeeper,而是zookeeper到底有哪些實際的運用,哪些類型的應用能發揮zookeeper的優勢,最后談談zookeeper對分布式網站架構能產生怎樣的作用。

  Zookeeper是針對大型分布式系統的高可靠的協調系統。由這個定義我們知道zookeeper是個協調系統,作用的對象是分布式系統。為什么分布式系統需要一個協調系統了?理由如下:

  開發分布式系統是件很困難的事情,其中的困難主要體現在分布式系統的“部分失敗”。“部分失敗”是指信息在網絡的兩個節點之間傳送時候,如果網絡出了故障,發送者無法知道接收者是否收到了這個信息,而且這種故障的原因很復雜,接收者可能在出現網絡錯誤之前已經收到了信息,也可能沒有收到,又或接收者的進程死掉了。發送者能夠獲得真實情況的唯一辦法就是重新連接到接收者,詢問接收者錯誤的原因,這就是分布式系統開發里的“部分失敗”問題。

  Zookeeper就是解決分布式系統“部分失敗”的框架。Zookeeper不是讓分布式系統避免“部分失敗”問題,而是讓分布式系統當碰到部分失敗時候,可以正確的處理此類的問題,讓分布式系統能正常的運行。

  下面我要講講zookeeper的實際運用場景:

  場景一:有一組服務器向客戶端提供某種服務(例如:我前面做的分布式網站的服務端,就是由四台服務器組成的集群,向前端集群提供服務),我們希望客戶端每次請求服務端都可以找到服務端集群中某一台服務器,這樣服務端就可以向客戶端提供客戶端所需的服務。對於這種場景,我們的程序中一定有一份這組服務器的列表,每次客戶端請求時候,都是從這份列表里讀取這份服務器列表。那么這分列表顯然不能存儲在一台單節點的服務器上,否則這個節點掛掉了,整個集群都會發生故障,我們希望這份列表時高可用的。高可用的解決方案是:這份列表是分布式存儲的,它是由存儲這份列表的服務器共同管理的,如果存儲列表里的某台服務器壞掉了,其他服務器馬上可以替代壞掉的服務器,並且可以把壞掉的服務器從列表里刪除掉,讓故障服務器退出整個集群的運行,而這一切的操作又不會由故障的服務器來操作,而是集群里正常的服務器來完成。這是一種主動的分布式數據結構,能夠在外部情況發生變化時候主動修改數據項狀態的數據機構。Zookeeper框架提供了這種服務。這種服務名字就是:統一命名服務,它和javaEE里的JNDI服務很像。

  場景二:分布式鎖服務。當分布式系統操作數據,例如:讀取數據、分析數據、最后修改數據。在分布式系統里這些操作可能會分散到集群里不同的節點上,那么這時候就存在數據操作過程中一致性的問題,如果不一致,我們將會得到一個錯誤的運算結果,在單一進程的程序里,一致性的問題很好解決,但是到了分布式系統就比較困難,因為分布式系統里不同服務器的運算都是在獨立的進程里,運算的中間結果和過程還要通過網絡進行傳遞,那么想做到數據操作一致性要困難的多。Zookeeper提供了一個鎖服務解決了這樣的問題,能讓我們在做分布式數據運算時候,保證數據操作的一致性。

  場景三:配置管理。在分布式系統里,我們會把一個服務應用分別部署到n台服務器上,這些服務器的配置文件是相同的(例如:我設計的分布式網站框架里,服務端就有4台服務器,4台服務器上的程序都是一樣,配置文件都是一樣),如果配置文件的配置選項發生變化,那么我們就得一個個去改這些配置文件,如果我們需要改的服務器比較少,這些操作還不是太麻煩,如果我們分布式的服務器特別多,比如某些大型互聯網公司的hadoop集群有數千台服務器,那么更改配置選項就是一件麻煩而且危險的事情。這時候zookeeper就可以派上用場了,我們可以把zookeeper當成一個高可用的配置存儲器,把這樣的事情交給zookeeper進行管理,我們將集群的配置文件拷貝到zookeeper的文件系統的某個節點上,然后用zookeeper監控所有分布式系統里配置文件的狀態,一旦發現有配置文件發生了變化,每台服務器都會收到zookeeper的通知,讓每台服務器同步zookeeper里的配置文件,zookeeper服務也會保證同步操作原子性,確保每個服務器的配置文件都能被正確的更新。

  場景四:為分布式系統提供故障修復的功能。集群管理是很困難的,在分布式系統里加入了zookeeper服務,能讓我們很容易的對集群進行管理。集群管理最麻煩的事情就是節點故障管理,zookeeper可以讓集群選出一個健康的節點作為master,master節點會知道當前集群的每台服務器的運行狀況,一旦某個節點發生故障,master會把這個情況通知給集群其他服務器,從而重新分配不同節點的計算任務。Zookeeper不僅可以發現故障,也會對有故障的服務器進行甄別,看故障服務器是什么樣的故障,如果該故障可以修復,zookeeper可以自動修復或者告訴系統管理員錯誤的原因讓管理員迅速定位問題,修復節點的故障。大家也許還會有個疑問,master故障了,那怎么辦了?zookeeper也考慮到了這點,zookeeper內部有一個“選舉領導者的算法”,master可以動態選擇,當master故障時候,zookeeper能馬上選出新的master對集群進行管理。

  下面我要講講zookeeper的特點:

  1. zookeeper是一個精簡的文件系統。這點它和hadoop有點像,但是zookeeper這個文件系統是管理小文件的,而hadoop是管理超大文件的。
  2. zookeeper提供了豐富的“構件”,這些構件可以實現很多協調數據結構和協議的操作。例如:分布式隊列、分布式鎖以及一組同級節點的“領導者選舉”算法。
  3. zookeeper是高可用的,它本身的穩定性是相當之好,分布式集群完全可以依賴zookeeper集群的管理,利用zookeeper避免分布式系統的單點故障的問題。
  4. zookeeper采用了松耦合的交互模式。這點在zookeeper提供分布式鎖上表現最為明顯,zookeeper可以被用作一個約會機制,讓參入的進程不在了解其他進程的(或網絡)的情況下能夠彼此發現並進行交互,參入的各方甚至不必同時存在,只要在zookeeper留下一條消息,在該進程結束后,另外一個進程還可以讀取這條信息,從而解耦了各個節點之間的關系。
  5. zookeeper為集群提供了一個共享存儲庫,集群可以從這里集中讀寫共享的信息,避免了每個節點的共享操作編程,減輕了分布式系統的開發難度。
  6. zookeeper的設計采用的是觀察者的設計模式,zookeeper主要是負責存儲和管理大家關心的數據,然后接受觀察者的注冊,一旦這些數據的狀態發生變化,Zookeeper 就將負責通知已經在 Zookeeper 上注冊的那些觀察者做出相應的反應,從而實現集群中類似 Master/Slave 管理模式。

  由此可見zookeeper很利於分布式系統開發,它能讓分布式系統更加健壯和高效。

  前不久我參加了部門的hadoop興趣小組,測試環境的hadoop、mapreduce、hive及hbase都是我來安裝的,安裝hbase時候安裝要預先安裝zookeeper,最早我是在四台服務器上都安裝了zookeeper,但是同事說安裝四台和安裝三台是一回事,這是因為zookeeper要求半數以上的機器可用,zookeeper才能提供服務,所以3台的半數以上就是2台了,4台的半數以上也是兩台,因此裝了三台服務器完全可以達到4台服務器的效果,這個問題說明zookeeper進行安裝的時候通常選擇奇數台服務器。在學習hadoop的過程中,我感覺zookeeper是最難理解的一個子項目,原因倒不是它技術負責,而是它的應用方向很讓我困惑,所以我有關hadoop技術第一篇文章就從zookeeper開始,也不講具體技術實現,而從zookeeper的應用場景講起,理解了zookeeper應用的領域,我想再學習zookeeper就會更加事半功倍。

  之所以今天要談談zookeeper,也是為我上一篇文章分布式網站框架的補充。雖然我設計網站架構是分布式結構,也做了簡單的故障處理機制,比如:心跳機制,但是對集群的單點故障還是沒有辦法的,如果某一台服務器壞掉了,客戶端任然會嘗試連接這個服務器,導致部分請求的阻塞,也會導致服務器資源的浪費。不過我目前也不想去修改自己的框架,因為我總覺得在現有的服務上添加zookeeper服務會影響網站的效率,如果有獨立的服務器集群部署zookeeper還是值得考慮的,但是服務器資源太寶貴了,這個可能性不大。幸好我們部門也發現了這樣的問題,我們部門將開發一個強大的遠程調用框架,將集群管理和通訊管理這塊剝離出來,集中式提供高效可用的服務,等部門的遠程框架開發完畢,我們的網站加入新的服務,我想我們的網站將會更加穩定和高效。

 


免責聲明!

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



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