歡迎來到 ZooKeeper 動物世界

本文作者:HelloGitHub-老荀

Hi,這裏是 HelloGitHub 推出的 HelloZooKeeper 系列,免費有趣、入門級的 ZooKeeper 開源教程,面向有編程基礎的新手。

ZooKeeper 是 Apache 軟件基金會的一個軟件項目,它爲大型分佈式計算提供開源的分佈式配置服務、同步服務和命名註冊。 ZooKeeper 曾經是 Hadoop 的一個子項目,但現在是一個頂級獨立的開源項目。

ZK 在實際開發工作中經常會用見到,算的上是喫飯的傢伙了,那可得玩透、用的趁手,要不怎麼進階和升職加薪呢?來和 HelloGitHub 一起學起來吧~

本系列教程是從零開始講解 ZooKeeper,內容從最基礎的安裝使用到背後原理和源碼的講解,整個系列希望通過有趣文字、詼諧的氣氛中讓 ZK 的知識“鑽”進你聰明的大腦。本教程是開放式:開源、協作,所以不管你是新手還是老司機,我們都希望你可以加入到本教程的貢獻中,一起讓這個教程變得更好

  • 新手:參與修改文中的錯字、病句、拼寫、排版等問題
  • 使用者:參與到內容的討論和問題解答、幫助其他人的事情
  • 老司機:參與到文章的編寫中,讓你的名字出現在作者一欄

項目地址:https://github.com/HelloGitHub-Team/HelloZooKeeper

接下來是和 ZooKeeper 的初次見面~你好,ZooKeeper

一、介紹

在開始介紹 ZooKeeper(以下簡稱 ZK)之前,我先來給大家講一個小故事(故事中的人物,純屬虛構,請勿對號入座,如有雷同,純屬巧合)。

1.1 動物村小故事

在很久很久以前,有一個動物星球,上面有一個動物村,村裏面住着好多小動物,好不熱鬧。

大家都各司其職,做着自己喜歡的事情

一開始鄰里之間都是互幫互助,互敬互愛,一切都很和諧,誰家發生了啥事,大家都能知道。

隨着村莊裏的小動物越來越多,整個村莊的鄰里關係也變成了一張巨大的網,而且由於不同動物之間的生活習性和飲食習慣的差異,導致了原本友愛的村莊,鄰里之間也漸漸產生了矛盾。

動物們也漸漸意識到了,整個村莊需要從一個大集體向小集體去發展了,不同的動物都自發聚集在了一起生活,建立了自己的小社區。

但是大家分開後就有一個問題,原來大家都住一起,雞家長馬家短大家都是能知道的。現在雞太美剛剛完成練習兩年半的舞蹈視頻,想分享給大家,但是現在大家的小區都分開了,而且還不能串門,可急死人了啊。

於是村委會緊急召開會議,聽取了各個村民業主代表的意見,發現大家都有類似的訴求,所以決定在動物星球成立一個公共辦事處,並且找了村裏資歷最老 69 歲的馬果果擔任辦事處的負責人。

現在開始只要村民有訴求都可以去辦事處登記,馬果果負責記錄,並且根據不同的事宜通知其他想了解此事情的村民。

現在雞太美就可以去辦事處登記了,馬果果拿了紙和筆記了下來:

雞太美上傳了舞蹈視頻

而隔壁的小狗坤坤一直暗戀雞太美,三天兩頭就往辦事處跑,問馬果果怎麼雞太美還不更新?不跳舞打籃球也行啊!被一直這麼問馬果果覺得好煩,就跟坤坤說:“你把你感興趣的,告訴我,我也記下來,以後不用你一直來問了,有新情況的時候我會通知你的!”,坤坤聽後也可高興了,畢竟出趟門還是很麻煩的。

於是馬果果又拿紙和筆記了下來:

雞太美更新了視頻得通知坤坤

之後當雞太美有了任何視頻更新的登記,馬果果都會直接打電話給坤坤通知他。

陸陸續續有更多的村民跑來登記,馬果果每次都會記下來。

雞太美上傳了舞蹈視頻
雞太美上傳了籃球視頻
馬小云最近有點飄
馬小騰發表了充值才能變得更強的論文
...

村民還能去登記自己感興趣的事情

馬小云投資了小狗東東的雜貨鋪得通知馬小騰
馬小騰最新迷戀上什麼遊戲得通知馬小云
雞太美更新了視頻得通知坤坤
...

有了辦事處,動物村又恢復了以往的熱鬧,馬果果覺得退休了還能發揮餘熱,實在是太好啦!

之後馬果果又和村委會的人提了:“這個辦事處還沒有名字呢?”。村委會一致決定,既然我們是動物村,那辦事處就叫 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 選擇一個合適的版本下載就行。

下載下來後是一個壓縮包,解壓後得到目錄如下:

lib/
docs/
conf/
bin/
README_packaging.md
README.md
NOTICE.txt
LICENSE.txt

使用者需要關注的就是 bin 目錄和 conf 目錄。我們先來看看 bin

.
├── 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 使用客戶端去連接剛剛啓動的服務端。

看到這個交互式的命令行界面就是連接成功了:

[zk: localhost:2181(CONNECTED) 0]

通過簡單的 ls / 命令測試下,服務端正常返回了:

[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]

2.2 Docker 安裝

現在全面容器化的時代,自然少不了 Docker。先下載最新的鏡像:

$ docker pull zookeeper

在 Docker 中啓動一個 ZK 的容器非常簡單,只需要一行命令,其中的 new-zookeeper 可以修改成任意的名字。

$ docker run -d -p 2181:2181 --name new-zookeeper zookeeper

然後通過 docker exec 命令進入容器

$ docker exec -it new-zookeeper bash

進入容器以後就是一個 Linux 環境了,之後連接服務端的方式和之前二進制的方式是一樣的。

其實我們這裏指定了 -p 2181:2181 所以不用進入容器也可以直接用客戶端連宿主機的 2181 端口進入交互式的客戶端,也和剛剛的方式一樣,就不贅述了。

Docker 由於不是本系列文章的重點,所以這裏就點到爲止,有興趣的自己再去研究下吧。

三、客戶端介紹

由於剛剛客戶端都是通過命令行去操作的,現實中,除了偶爾運維查看數據,幾乎是用不到的,在生產環境中肯定是需要通過代碼去操作 ZK 的,所以各個編程語言都有相對流行的 ZK 客戶端的庫,下面羅列出一些:

你可以看到上面的客戶端都是在開源社區 GitHub 上!這就是開源的力量!這就是社區的力量!

四、總結

本文作爲系列的第一篇簡單的介紹了 ZK 大致是什麼,也簡單的介紹瞭如何安裝和運行服務端,並使用自帶的命令行客戶端去連接。下一篇,我會以 Java 官方的客戶端作爲講解,演示下如何使用程序去進行一些基本的操作和進階的操作。


關注 HelloGitHub 公衆號 收到第一時間的更新。

還有更多開源項目的介紹和寶藏項目等待你的發掘。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章