1. 程式人生 > >歡迎來到 ZooKeeper 動物世界

歡迎來到 ZooKeeper 動物世界

![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124161622816-1605238160.png)

本文作者:HelloGitHub-老荀

Hi,這裡是 HelloGitHub 推出的 HelloZooKeeper 系列,**免費有趣、入門級的 ZooKeeper 開源教程**,面向有程式設計基礎的新手。 > ZooKeeper 是 Apache 軟體基金會的一個軟體專案,它為大型分散式計算提供開源的分散式配置服務、同步服務和命名註冊。 ZooKeeper 曾經是 Hadoop 的一個子專案,但現在是一個頂級獨立的開源專案。 ZK 在實際開發工作中經常會用見到,算的上是吃飯的傢伙了,那可得玩透、用的趁手,要不怎麼進階和升職加薪呢?來和 HelloGitHub 一起學起來吧~ 本系列教程是**從零開始**講解 ZooKeeper,內容從**最基礎的安裝使用到背後原理和原始碼的講解**,整個系列希望通過有趣文字、詼諧的氣氛中讓 ZK 的知識“鑽”進你聰明的大腦。本教程是開放式:開源、協作,所以不管你是新手還是老司機,我們都希望你可以**加入到本教程的貢獻中,一起讓這個教程變得更好**: - 新手:參與修改文中的錯字、病句、拼寫、排版等問題 - 使用者:參與到內容的討論和問題解答、幫助其他人的事情 - 老司機:參與到文章的編寫中,讓你的名字出現在作者一欄 > 專案地址:https://github.com/HelloGitHub-Team/HelloZooKeeper ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154506478-2099125004.png) 接下來是和 ZooKeeper 的初次見面~你好,ZooKeeper ## 一、介紹 在開始介紹 ZooKeeper(以下簡稱 ZK)之前,我先來給大家講一個小故事(故事中的人物,純屬虛構,請勿對號入座,如有雷同,純屬巧合)。 ### 1.1 動物村小故事 在很久很久以前,有一個動物星球,上面有一個動物村,村裡面住著好多小動物,好不熱鬧。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154515057-976712396.png) 大家都各司其職,做著自己喜歡的事情 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154521428-1499327452.png) 一開始鄰里之間都是互幫互助,互敬互愛,一切都很和諧,誰家發生了啥事,大家都能知道。 隨著村莊裡的小動物越來越多,整個村莊的鄰里關係也變成了一張巨大的網,而且由於不同動物之間的生活習性和飲食習慣的差異,導致了原本友愛的村莊,鄰里之間也漸漸產生了矛盾。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154527411-1553060692.png) 動物們也漸漸意識到了,整個村莊需要從一個大集體向小集體去發展了,不同的動物都自發聚集在了一起生活,建立了自己的小社群。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154533293-1847546897.png) 但是大家分開後就有一個問題,原來大家都住一起,雞家長馬家短大家都是能知道的。現在**雞太美**剛剛完成練習兩年半的舞蹈視訊,想分享給大家,但是現在大家的小區都分開了,而且還不能串門,可急死人了啊。 於是村委會緊急召開會議,聽取了各個村民業主代表的意見,發現大家都有類似的訴求,所以決定在動物星球成立一個公共辦事處,並且找了村裡資歷最老 69 歲的**馬果果**擔任辦事處的負責人。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154538993-993443824.png) 現在開始只要村民有訴求都可以去辦事處登記,**馬果果**負責記錄,並且根據不同的事宜通知其他想了解此事情的村民。 現在**雞太美**就可以去辦事處登記了,**馬果果**拿了紙和筆記了下來: ``` 雞太美上傳了舞蹈視訊 ``` 而隔壁的小狗**坤坤**一直暗戀**雞太美**,三天兩頭就往辦事處跑,問**馬果果**怎麼**雞太美**還不更新?不跳舞打籃球也行啊!被一直這麼問**馬果果**覺得好煩,就跟**坤坤**說:“你把你感興趣的,告訴我,我也記下來,以後不用你一直來問了,有新情況的時候我會通知你的!”,**坤坤**聽後也可高興了,畢竟出趟門還是很麻煩的。 於是**馬果果**又拿紙和筆記了下來: ``` 雞太美更新了視訊得通知坤坤 ``` 之後當**雞太美**有了任何視訊更新的登記,**馬果果**都會直接打電話給**坤坤**通知他。 陸陸續續有更多的村民跑來登記,**馬果果**每次都會記下來。 ``` 雞太美上傳了舞蹈視訊 雞太美上傳了籃球視訊 馬小云最近有點飄 馬小騰發表了充值才能變得更強的論文 ... ``` 村民還能去登記自己感興趣的事情 ``` 馬小云投資了小狗東東的雜貨鋪得通知馬小騰 馬小騰最新迷戀上什麼遊戲得通知馬小云 雞太美更新了視訊得通知坤坤 ... ``` ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154549988-25269848.png) 有了辦事處,動物村又恢復了以往的熱鬧,**馬果果**覺得退休了還能發揮餘熱,實在是太好啦! 之後**馬果果**又和村委會的人提了:“這個辦事處還沒有名字呢?”。村委會一致決定,既然我們是動物村,那辦事處就叫 ZooKeeper 吧! --- 小故事講(chui niu)完了,但是動物村的故事還遠遠沒有結束,盡情期待噢~ ## 1.2 正題開始 之後的 ZK 的知識點重點講解服務端,偶爾會涉及到客戶端,客戶端也是以 Apache 官方的 Java 客戶端為例子,如果你是別的程式語言的開發者,也不用擔心,我會盡量以不講程式碼的方式來講解 ZK 背後的原理。 下面開始用猿話來翻譯下,動物村原來的大集體就和以前單應用是一樣的,所有的業務都寫在一個應用(程序)裡,不管什麼業務更新,整個應用都要釋出,所以慢慢就有了分散式的架構(小集體),把不同的業務邏輯部署在不同的應用裡,這樣每一個業務更新,都不會影響到其他的業務,但是分散式的架構會導致原本在一個程序裡共享記憶體的兩個物件,現在要通過網路才能實現通訊,所以急需要引入一個脫離於應用的第三方元件來承擔起這個跨程序共享資料或者通訊的任務,在本系列文章裡,這個元件就是 ZK。如果你從來沒用過 ZK 或者說根本沒聽說過的話,那你就可以把 ZK 類比成為資料庫,也是一個獨立存放資料的地方,也能對資料進行增刪改查,只不過用的不是 SQL,而且 ZK 還支援回撥通知。什麼?你說你資料庫也沒用過?(Orz,這真的就很難解釋了...你可以直接留言給我們,我慢慢跟你解釋) 下面給出 ZK 的百度百科定義: > ZooKeeper 是一個**分散式**的,開放原始碼的分散式應用程式協調服務,是 Google 的 Chubby 一個**開源**的實現,是 Hadoop 和 Hbase 的重要元件。它是一個為分散式應用提供**一致性**服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。 是不是完全看不懂?看不懂就對了。上面這段話有幾個重點的關鍵字:開源、分散式、協調、一致性。 - **開源**意味著原始碼可以免費下載學習。 - **分散式**有兩重含義,第一個是給分散式的架構應用去使用,第二是 ZK 自身也是支援分散式部署實現高可用的。 - **協調**的意思是,ZK 說到底只是一個協調的框架或者服務,他提供了一些在分散式環境下的通知或者儲存的手段,但是具體怎麼用到業務中,還是需要使用者自己去選擇和評估的。 - **一致性**在 ZK 中是**最終一致性**,ZK 無法保證實時的強一致性,有一個時間視窗,但是最終 ZK 叢集中的資料都會是一樣的。 ## 二、安裝 ### 2.1 二進位制包安裝 既然 ZK 是一個服務,自然是需要部署安裝的,ZK 官網提供了二進位制包的下載 [下載頁面 https://zookeeper.apache.org/releases.html](https://zookeeper.apache.org/releases.html) 選擇一個合適的版本下載就行。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154558288-56590563.png) 下載下來後是一個壓縮包,解壓後得到目錄如下: ``` lib/ docs/ conf/ bin/ README_packaging.md README.md NOTICE.txt LICENSE.txt ``` 使用者需要關注的就是 `bin` 目錄和 `conf` 目錄。我們先來看看 `bin` ```bash . ├── README.txt ├── zkCleanup.sh ├── zkCli.cmd ├── zkCli.sh ├── zkEnv.cmd ├── zkEnv.sh ├── zkServer-initialize.sh ├── zkServer.cmd ├── zkServer.sh ├── zkSnapShotToolkit.cmd ├── zkSnapShotToolkit.sh ├── zkTxnLogToolkit.cmd └── zkTxnLogToolkit.sh ``` Windows 平臺就選擇 `cmd` 結尾的檔案啟動,Mac/Linux 平臺選擇 `sh` 結尾的檔案啟動。 這裡我以 Mac 平臺作為講解,嘗試將 ZK 啟動,但是在啟動之前,需要先將 `conf` 目錄下的 `zoo_sample.cfg` 重新命名為 `zoo.cfg` ,因為 ZK 啟動程式預設找的就是 `zoo.cfg`,重新命名完了就可以通過 `./zkServer.sh start-foreground` 在前臺啟動,或者 `./zkServer.sh start` 在後臺啟動,沒有報錯的話就是啟動成功了。 之後再通過官方給出的 `zkCli.sh` 使用客戶端去連線剛剛啟動的服務端。 看到這個互動式的命令列介面就是連線成功了: ```bash [zk: localhost:2181(CONNECTED) 0] ``` 通過簡單的 `ls /` 命令測試下,服務端正常返回了: ```bash [zk: localhost:2181(CONNECTED) 0] ls / [zookeeper] ``` ### 2.2 Docker 安裝 現在全面容器化的時代,自然少不了 Docker。先下載最新的映象: ```bash $ docker pull zookeeper ``` 在 Docker 中啟動一個 ZK 的容器非常簡單,只需要一行命令,其中的 `new-zookeeper` 可以修改成任意的名字。 ```bash $ docker run -d -p 2181:2181 --name new-zookeeper zookeeper ``` 然後通過 `docker exec` 命令進入容器 ```bash $ docker exec -it new-zookeeper bash ``` 進入容器以後就是一個 Linux 環境了,之後連線服務端的方式和之前二進位制的方式是一樣的。 其實我們這裡指定了 `-p 2181:2181` 所以不用進入容器也可以直接用客戶端連宿主機的 2181 埠進入互動式的客戶端,也和剛剛的方式一樣,就不贅述了。 Docker 由於不是本系列文章的重點,所以這裡就點到為止,有興趣的自己再去研究下吧。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154608737-1091799842.png) ## 三、客戶端介紹 由於剛剛客戶端都是通過命令列去操作的,現實中,除了偶爾運維檢視資料,幾乎是用不到的,在生產環境中肯定是需要通過程式碼去操作 ZK 的,所以各個程式語言都有相對流行的 ZK 客戶端的庫,下面羅列出一些: - Java - zookeeper,GitHub 地址:[https://github.com/apache/zookeeper](https://github.com/apache/zookeeper) - curator,GitHub 地址:[https://github.com/apache/curator](https://github.com/apache/curator) - Python - kazoo,GitHub 地址:[https://github.com/python-zk/kazoo](https://github.com/python-zk/kazoo) - Go - zk,GitHub 地址:[https://github.com/go-zookeeper/zk](https://github.com/go-zookeeper/zk) - Node.js - node-zookeeper-client,GitHub 地址:[https://github.com/alexguan/node-zookeeper-client](https://github.com/alexguan/node-zookeeper-client) - node-zookeeper,GitHub 地址:[https://github.com/yfinkelstein/node-zookeeper](https://github.com/yfinkelstein/node-zookeeper) - Ruby - zk,GitHub 地址:[https://github.com/zk-ruby/zk](https://github.com/zk-ruby/zk) 你可以看到上面的客戶端都是在開源社群 GitHub 上!這就是開源的力量!這就是社群的力量! ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154616613-1898065203.png) ## 四、總結 本文作為系列的第一篇簡單的介紹了 ZK 大致是什麼,也簡單的介紹瞭如何安裝和執行服務端,並使用自帶的命令列客戶端去連線。下一篇,我會以 Java 官方的客戶端作為講解,演示下如何使用程式去進行一些基本的操作和進階的操作。 ![](https://img2020.cnblogs.com/blog/759200/202101/759200-20210124154622261-626311440.png) --- 關注 **HelloGitHub 公眾號** 收到第一時間的更新。 還有更多開源專案的介紹和寶藏專案等待你的