Tips
做一個終身學習的人!
日拱一卒,功不唐捐。
在過去的幾十年里,互聯網改變了我們生活的方式。Internet上提供的服務通常由復雜的軟件系統支持,這些系統跨越了大量的服務器,而且常常位於不同的地理位置上。這種系統被稱為計算機科學術語中的分布式系統。為了正確和有效地運行這些大型系統,這些系統內部的過程應該彼此之間達成某種協議;本協議也稱為分布式協調。構成分布式系統的組件所達成的協議包括分布式系統的總體目標或達成一些最終導致目標的子任務的協議。這並不像聽起來那么簡單,因為流程不僅要達成一致,而且要確定他們的對等組件所同意的內容。
雖然在一個大的分布式系統中協調任務和過程聽起來很簡單,但是當要以容錯的方式正確地實現它們時,這是一個非常棘手的問題。Apache ZooKeeper是Apache軟件基金會的一個項目,它旨在通過簡單的api提供一組可靠的原語來解決分布式系統的設計和開發中的這些協調問題。
在本章中,我們將介紹下面的內容:
分布式系統是什么及其特點
為什么分布式系統中的協調是困難的
Apache ZooKeeper介紹
下載並安裝Apache ZooKeeper
使用ZooKeeper shell連接到ZooKeeper
多節點 ZooKeeper集群配置
1. 定義一個分布式系統
分布式系統被定義為一個由獨立的計算實體組成的軟件系統,由一個計算機網絡連接在一起,它的組件相互通信並相互協調以實現一個共同的目標。電子郵件系統,如Gmail或Yahoo !郵件就是這樣一個分布式系統的一個例子。另一個分布式系統的例子是一個多人在線游戲,玩家可以在不同的地理位置上玩。
為了確定分布式系統,以下是需要注意的關鍵特性:
- 資源共享:這指的是在系統中使用資源的可能性,例如存儲空間、計算能力、數據和來自任何地方的服務,等等。
- 可擴展性:這是指從硬件和軟件角度逐步擴展和改進系統的可能性
- 並發性:這指的是系統能夠同時被多個用戶使用,以完成相同的任務或不同的任務。
- 性能和可伸縮性:這確保系統的響應時間不會隨着整體負載的增加而降低。
- 容錯:這確保了系統總是可用,即使某些組件失敗或以降級模式運行。
- 通過API的抽象:這確保系統的各個組件隱藏於最終用戶,僅向他們提供最終服務。
要設計一個分布式系統是很困難的,當一個單獨的計算實體的集合被程序化到一起時,它就更加困難了。設計師和開發人員經常做出一些假設,這些假設也被稱為分布式計算的謬論。這些謬論的列表最初是由SUN 公司的工程師在研究網絡文件系統Network File System(NFS)的初始設計時創造的。可以在以下表格中引用這些內容:
假設 | 現實 |
---|---|
網絡是可靠的 | 在現實中,由於系統內部錯誤或由於電源故障等外部因素,網絡或組件之間的互連可能會失敗。 |
零延遲 | 分布式系統的用戶可以從全球任何地方連接到它,並且需要時間將數據從一個地方移動到另一個地方。網絡的服務質量也影響應用程序的延遲。 |
帶寬是無限的 | 網絡帶寬在最近已經改進了很多倍,但在世界范圍內這並不是統一的。帶寬取決於網絡的類型(T1,LAN,WAN,移動網絡,等等)。 |
網絡是安全的 | 網絡永遠不安全。通常,系統面臨拒絕服務攻擊的可能,因為在他們的設計中沒有認真考慮應用程序的安全方面的隱患。 |
拓撲結構不會改變 | 實際上,拓撲結構永遠不是恆定。 組件隨時間被移除/添加,系統應該能夠容忍這種更改。 |
有一個管理員 | 分布式系統從不孤立地運行。它們與其他外部系統相互作用;這可能超出了管理的控制。 |
傳輸成本為零 | 這遠不是真實的,因為到處都有成本,從建立網絡到發送網絡數據包到目的地。成本可以是CPU周期的形式,用來支付給網絡服務提供商的實際美元。 |
網絡是同質的 | 網絡由大量不同的實體組成。因此,要使應用程序正確地運行,它需要與各種組件進行互操作,即網絡、操作系統,甚至是實現語言。 |
分布式系統設計者必須設計出一套系統,以保持所有之前的要點。除此之外,解決的下一個棘手問題是讓參與的計算實體,或者獨立的程序,協調他們的活動。通常,開發人員和設計人員在實現這種協調邏輯時陷入困境;這導致系統設計不正確,效率低下。正是基於這個動機,Apache ZooKeeper被設計和開發出來,使得分布式協調非常可靠。
2. 為什么在分布式系統中協調如此具有挑戰性
在介紹了Apache ZooKeeper以及它在分布式應用程序設計和開發中的角色之后,讓我們深入探討一下為什么分布式系統中的協調是一個難題。讓我們以一個分布式應用程序的配置管理為例,它包含多個獨立運行的軟件組件,跨多個物理服務器。現在,有一個集群配置存儲的主節點,以及從這個主節點下載它的其他工作節點,自動配置本身似乎是一個簡單而優雅的解決方案。但是,這個解決方案遇到了主節點的一個潛在問題,它是一個單點故障。即使我們假定主節點被設計為容錯,設計了一個系統,在這個系統中,配置中的更改被動態地傳播到所有的工作節點,這並不簡單。
分布式系統中的另一個協調問題是服務發現。通常,為了維持負載並增加應用程序的可用性,我們向系統添加了更多的物理服務器。但是,我們可以讓客戶機或工作節點知道集群成員身份的變化,以及在集群中托管不同服務的新機器的可用性。這需要在客戶機應用程序本身中仔細地設計和實現邏輯。
可伸縮性提高了可用性,但它使協調變得復雜。一個橫向可擴展的分布式系統,跨越了成百上千的物理機器,常常容易出現諸如硬件故障、系統崩潰、通信鏈路故障等故障。這些類型的失敗並沒有真正遵循任何模式,因此,在應用程序邏輯中處理此類故障,並設計系統是容錯的,這確實是一個難題。
因此,到目前為止已經注意到的是,很明顯,構建分布式系統並不是那么簡單。進行正確、快速和可伸縮的集群協調非常困難,常常容易出現錯誤,從而導致集群的整體不一致性。這就是Apache ZooKeeper在分布式系統的設計和開發中作為一個健壯的協調服務來拯救的地方。
3. Apache ZooKeeper介紹
Apache ZooKeeper是Apache軟件基金會的軟件項目;它為大型分布式系統中的各種協調問題提供了一個開源的解決方案。ZooKeeper最初是在Yahoo !公司開發的。
作為一個集中的協調服務,ZooKeeper是分布式且高度可靠的,運行在一個名為ZooKeeper集成的服務器集群上。分布式協商一致、組管理、存在協議和領導選舉由服務實現,這樣應用程序就不需要通過自己的實現來重新定義車輪。在這些之上,由ZooKeeper公開的原語可以被應用程序用來構建更強大的抽象來解決各種各樣的問題。
Apache ZooKeeper是用Java實現的。它附帶了C、Java、Perl和Python客戶端綁定。社區提供的客戶端庫可以用於多種語言,如Go、Scala、Erlang等。