1. 程式人生 > >zookeeper叢集環境搭建詳細圖文教程

zookeeper叢集環境搭建詳細圖文教程

zookeeper叢集環境搭建詳細圖文教程

zhoubang @ 2018-01-02

 【文件大綱】

  友情介紹

  軟體環境

  注意點

環境安裝

    1、 新建用於儲存安裝包以及軟體安裝的目錄

    2、 下載安裝zookeeper

    3、 解壓zookeeper壓縮包

單節點zookeeper配置

    1、 配置zoo.cfg檔案

    2、 配置zookeeper的資料儲存目錄

    3、 新建myid檔案

    4、 配置zookeeper叢集節點

    5、 啟動zookeeper服務

    6、 檢查zookeeper服務是否成功啟動

多節點zookeeper配置

    1、不同虛擬機器下的zookeeper配置

    2、 驗證不同虛擬機器下的zookeeper服務

zookeeper客戶端連線測試

    1、 連線節點自身

    2、 跨節點連線

停止任意zk節點,觀察zk自動選舉leader效果

恢復停止的zk節點,觀察zk叢集節點最新角色分配情況

總結

經驗補充 

友情介紹

QQ技術交流群 470414533

在這裡,你可以學習到什麼?

  • 你可以完整的學會zookeeper叢集環境的搭建和配置
  • 通過測試,清楚的知道zookeeper對於存在宕機節點情況下的
    leader自動選舉

  該文件不僅僅包含zookeeper叢集環境搭建的內容,也補充了zookeeper的主從節點等相關的介紹內容,方便學習研究,加深對zookeeper的學習。

  文件內容文字較多,圖文豐富,請耐心閱讀,不會讓你失望。

word版本

如果覺得當前網頁中的圖片看不清,這裡將word版的分享出來,可自行下載瀏覽。

軟體環境

如果自己沒有伺服器的話,可以在本機安裝WMware虛擬機器,如何安裝虛擬機器,請自行解決。

VMware-workstation-full-14虛擬機器下載地址(裡面有永久註冊碼)

CentOS-6.5_64位下載地址

Zookeeper_3.4.9下載地址

注意點

在登入虛擬機器中的Linux系統的時候,登入使用者請使用系統自帶的root,密碼即為安裝過程中自定義的密碼。

不要使用自定義的使用者名稱登入,不然有些目錄是沒有寫的許可權的,避免出現一些意外的情況,建議使用root最高許可權賬戶登入.

環境安裝

我們先在一臺虛擬機器中安裝配置好單個ZK服務,成功後我們克隆出多個虛擬機器,就無需在其他虛擬機器中重新下載安裝zookeeper等重複操作。

1、新建用於儲存安裝包以及軟體安裝的目錄

/ 目錄下建立一個以我的名字zhoubang為名稱的目錄,個人習慣罷了,這個請自行命名;

同時在zhoubang目錄下再新建2個目錄software(儲存安裝包)、operation(軟體安裝的目錄),這些都是個人習慣,你們也可以自行選擇目錄建立。

 

2、下載安裝zookeeper

  • 線上下載:推薦使用此方式,簡單方便。
  • 本地上傳安裝包  :前提是本地已經有zookeeper的安裝包了。你可以通過FTP等上傳工具直接上傳到對應目錄下.

zk線上下載與安裝

通過命令 cd /zhoubang/software 進入安裝包的儲存目錄,使用wget命令下載zookeeper(下載地址文件上面已經提供);如下圖,回車即可下載:

回車之後如果出現下圖所示的<未知的名稱或服務>錯誤,請檢查當前虛擬機器下的Linux系統的網路連線是否正常;

3、解壓zookeeper壓縮包

進入 /zhoubang/software目錄, 通過命令 tar -zxvf ./zookeeper-3.4.9.tar.gz -C /zhoubang/operation/ 解壓zookeeper包到指定目錄,這裡我解壓到 /zhoubang/operation 目錄下,如圖:

此時,在/zhoubang/operation目錄下,就會有zookeeper的資源,如下圖:

單節點zookeeper配置

1配置zoo.cfg檔案

如上圖,zk提供的配置檔名稱為zoo_sample.cfg ,首先我們需要將此檔案重新命名為zoo.cfg。因為zookeeper預設會載入zoo.cfg的檔案,這是zk的規定。

檢視一下zoo.cfg配置檔案裡面的內容有什麼,如下圖:

其中,最常用的配置有以下幾個:

  • tickTime:這個時間是作為 Zookeeper 伺服器之間或客戶端與伺服器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
  • dataDir:顧名思義就是 Zookeeper 儲存資料的目錄,預設情況下,Zookeeper的日誌檔案是在bin目錄下,有一個zookeeper.out檔案
  • clientPort:這個埠就是客戶端連線 Zookeeper 伺服器的埠,Zookeeper 會監聽這個埠,接受客戶端的訪問請求。偽叢集模式下,這個埠需要配置成不同的。如果是多臺虛擬機器或者伺服器下,則無需更改。

2、配置zookeeper的資料儲存目錄

這裡我就在zookeeper的安裝根目錄下,新建了一個dataDir目錄,用於儲存zookeeper的資料。

如下圖:

 修改zoo.cfg中的dataDir配置,即為剛剛新建的dataDir的目錄地址。最終修改的結果如下圖:

3、新建myid檔案

在剛剛新建的dataDir目錄下,新建一個myid檔案該檔案裡面的內容,這裡我就填寫為1,至於數值1有何作用和意義?是否可以為其他數字?當然,我也不多做玄乎了,這數值是可以自定義的,單範圍只能是1-255之間。具體的含義,下面會介紹。如下圖:

4、配置zookeeper叢集節點

zoo.cfg檔案中的最下面,配置zk叢集節點資訊;當前配置的是單臺虛擬機器,所以配置內容目前只有一個server節點(等將其他虛擬機器克隆並啟動之後,就可以將其他虛擬機器資訊新增到此),效果如圖:

server的配置含義說明:

server.A=B:C:D

其中 A 是一個數字,表示這個是第幾號伺服器;

B 是這個伺服器的 ip 地址;

C 表示的是這個伺服器與叢集中的 Leader 伺服器交換資訊的埠;

D 表示的是萬一叢集中的 Leader 伺服器掛了,需要一個埠來重新進行選舉,選出一個新的 Leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠。

如果是偽叢集的配置方式也就是在一臺伺服器上搭建多個ZK服務節點,由於 一臺伺服器下的IP地址肯定一樣,所以不同的 Zookeeper 例項通訊埠號不能一樣,故需要給它們分配不同的埠號。

相反,如果是在不同的伺服器下(不同的虛擬機器,IP地址不同)搭建ZK的話,由於IP地址不同,則C與D對應的通訊埠可以保持一致。當然也可以配置成其他的埠。

注意點】:

其中的server.1裡面的數字1,是我們在myid檔案中指定的數值。代表不同的zk節點。

同時,IP地址配置也要與server.1所在的伺服器節點的IP地址一致。

後面的2個通訊埠,隨意指定,只要不與其他埠衝突就行。

5、啟動zookeeper服務

進入zookeeperbin目錄下,執行命令啟動zookeeper服務

如下圖:

6、檢查zookeeper服務是否成功啟動

bin目錄下,通過命令 ./zkServer.sh status 檢視啟動狀態,如圖:

由於我只啟動了一個ZK服務,所以Mode後面的資訊為standalone,意思獨立節點。

多節點zookeeper配置

到上面為止,我們只是在單臺虛擬機器中成功搭建了zookeeper服務。接下來我們就開始在其他的虛擬機器節點中配置zookeeper叢集節點資訊。

我本機電腦上克隆出了3個虛擬機器(當然你也可以克隆很多個,為了學習方便,只配置3個節點就夠了)。

IP地址分別是:

192.168.52.128

192.168.52.129

192.168.52.130

虛擬機器克隆情況,如圖所示:

* 這裡虛擬機器的命名,是方便大家檢視的。 後面的數值123分別是我在zookeepermyid檔案中指定的數值。

* 每臺虛擬機器中的系統環境以及zookeeper的安裝配置,都與上面的單節點的zookeeper配置一致。

1、不同虛擬機器下的zookeeper配置

需要更改的地方有以下幾點:

  •  myid檔案
  •  zoo.cfg 檔案

1.1  首先我們修改192.168.52.128 對應的虛擬機器中的zookeeper配置。

  myid檔案中的數值為1(當前第一臺虛擬機器下的zookeeper可以不用修改,只修改另外2臺即可)

  然後修改zoo.cfg檔案,在最下面新增ZK節點配置.

  最終配置效果如下:

 

通過配置我們可以看到,需要將其他的zookeeper節點資訊配置進來。

再強調一遍,server.1server.2server.3 中的數值123,對應的是dataDirmyid檔案中的數值,不要配置錯了,包括IP也要對應。

按照上面的操作步驟,分別對192.168.52.129192.168.52.130的虛擬機器中的zookeeper進行配置。如下:

1.2192.168.52.129虛擬機器中的zookeeper下的myid中的數值填寫 2 ,對應的zoo.cfg檔案最下面的配置,和上圖一樣的server配置,可以直接copy過去,最終配置如下:

1.3192.168.52.130虛擬機器中的zookeeper下的myid中的數值填寫 3 ,對應的zoo.cfg檔案最下面的配置,和上圖一樣的server配置,可以直接copy過去,最終配置如下:

至此,我們3zookeeper節點的配置已經完畢。下面我們就啟動zookeeper服務,驗證叢集是否搭建成功!

2、驗證不同虛擬機器下的zookeeper服務

分別進入每個虛擬機器下的zookeeperbin目錄下,執行命令 ./zkServer.sh start 啟動ZK服務!

通過命令 ./zkServer.sh status檢視ZK啟動狀態。如果出現了以下錯誤:

 我們去檢視一下日誌(bin目錄下zookeeper.out日誌檔案)。檢視裡面的內容,有一段錯誤資訊如下:

這種情況下,網上很多人都說是防火牆開啟導致埠無法通訊造成的;那我就在每個虛擬機器上,把防火牆關閉;可以使用命令 service iptables stop 臨時修改防火牆狀態,關閉防火牆。

防火牆關閉了,這時候全部重啟zookeeper,再通過 ./zkServer.sh status 命令檢視啟動狀態,如果出現下面的任意一個結果,說明ZK叢集環境已經搭建成功,如下圖:

到此,zookeeper叢集環境已經搭建完畢!

zookeeper客戶端連線測試

我們可以通過zkCli.sh提供的命令進行客戶端連線測試,檢測是否可以跨節點連線。

先看一下各zookeeper節點的角色關係:

192.168.52.128  follower

如下圖:

192.168.52.129  follower

如下圖:

192.168.52.130  leader

如下圖:

連線節點自身

我們先在任意一個zookeeper節點的bin目錄,通過命令./zkCli.sh -server 192.168.52.129:2181連線自己本身(這裡我就在IP192.168.52.129的伺服器下做客戶端連線測試),

如圖:

出現上圖所示內容,說明zookeeper客戶端連線OK。退出命令為 quit

跨節點連線

既然是叢集環境,那肯定可以在任意zookeeper節點下,去連線任意的zookeeper節點。

我們試一下就知道了,同樣的,通過命令./zkCli.sh -server 192.168.52.129:2181連線任意節點。

上面已經做了連線自身的測試了,現在我們就來操作,在192.168.52.129的伺服器上去連線其他的2臺伺服器上的zookeeper服務。

先連線192.168.52.128伺服器上的zookeeper服務,如圖:

從圖中可以看出,跨服務節點的連線是OK的!

 連線192.168.52.130伺服器上的zookeeper服務,如圖

 從圖中可以看出,跨服務節點的連線是OK的!

停止任意zk節點,觀察zk自動選舉leader效果

既然是叢集,就必然脫離不了主從的角色,zookeeper自身會根據節點的生存、死亡狀態,自動的進行選舉切換。

這裡我們將角色為leader的解決給停止掉,然後看一下其餘的2個處於正常情況的角色分配情況,看看zookeeper會不會自動進行選舉leader並切換。

再說明一下當前3zk節點的角色關係

192.168.52.128  follower

192.168.52.129  follower

192.168.52.130  leader

我們先停止192.168.52.130這個leader主節點,進入zookeeperbin目錄,執行命令 ./zkServer.sh stop 停止服務。然後通過命令 ./zkServer.sh status 檢視當前zk節點狀態是否已經停止,如圖:

說明之前的leader角色的節點已經停止成功了!

乘勝追擊,大約等待530秒左右,我們去看一下另外2zk節點的角色狀態,經過檢視,最新的角色分配情況如下:

192.168.52.128  follower

192.168.52.129  leader

從以上2張圖中可以看到,192.168.52.129這個伺服器上的zk節點的角色,從之前的follower變成了leader192.168.52.128角色沒有發生變化。

這就證明了,zookeeper會自動進行leader選舉,而異常停止的zk節點會被剔除在外,不再提供服務。

恢復停止的zk節點,觀察zk叢集節點最新角色分配情況

上面的操作,我們知道了zk可以自動進行leader選舉,剔除死亡的服務節點;那麼,當我們恢復剛剛停止的zk節點的話,那這3個節點之間的覺得分配情況又是如何呢?

啟動剛剛停止的zk節點(192.168.52.130),然後在每一個zkbin目錄下,通過命令 ./zkServer.sh status 檢視角色分配情況,結果如下圖:

192.168.52.128  follower

 192.168.52.129  leader

192.168.52.130  follower

從圖中可以觀察到,我們把之前停止的zk節點(192.168.52.130)恢復後,這個節點的角色為follower,並沒有恢復原先停止之前的leader角色。

這說明,當zk進行重新leader選舉後,除非leader意外宕機,否則角色不會發生變化。

總結

經過了詳細的操作以及測試,我相信對於新手而言,肯定會學習到不少知識點。這也不枉費我的心血付出啊,寫文件好累的啊~不過一切值得,文件完成的那一刻,將會永久留存在網際網路中,供他人學習使用。

其實zookeeper的叢集環境搭建以及配置,是很簡單的。只有親身操作,才感受到很簡單,沒有那麼複雜。不要被“叢集”等專業術語所嚇到。

本文件寫的很詳細了,不僅僅只包含環境搭建和配置,也對zk的一些特點以及主從選舉進行了案例測試和說明,加深此文件的知識儲備水平。

好了,就說到這吧,祝各位學習順利~

【經驗補充】

1、如果在zoo.cfg檔案中只配置了一個server節點,且server的內容為當前伺服器的資訊;是否可以啟動成功呢?比如下面的情況:

則在通過命令 ./zkServer.sh start 啟動zk服務的時候,是可以正常啟動的。如下圖:

可以看到,Modestandalone 的資訊,說明是ZK單點。因為我們在zoo.cfg中只配置了自己的server資訊.

當然,在zoo.cfg中如果一個server配置都沒有的話,也是這樣的效果,可以成功啟動。

2、與上面第一點相反,如果在zoo.cfg中配置了大於1個的server的配置,如果只啟動一個ZK例項,會啟動成功嗎?如下圖:

這時候如果上面3ZK沒有一個啟動的話(都是停止狀態),如果此時在任意一個ZKbin目錄下通過命令 ./zkServer.sh start啟動的話,再使用命令 ./zkServer status 檢視啟動狀態,你會發現,會一直報一個錯誤,如圖:

這種錯誤的原因,就是因為你只啟動了一個ZK例項導致的;為什麼會這樣呢?

你想想,既然是在zoo.cfg中配置了3server,說明是叢集的配置,既然是叢集,那麼必然會有2種角色,一個是leader、一個是follower這就說明,我們的ZK服務節點必須至少有2臺是正常服務的。

如果只有一臺例項啟動,請問這臺是leader角色還是follower角色呢?都不是!原因很簡單,如果唯一啟動的這臺ZK突然宕機了,請問,下一個接手的ZK服務節點是誰呢?肯定沒有。這樣的話,也就失去了叢集的意義。

因此,ZK啟動的時候,本身會進行驗證,必須啟動至少2臺ZK例項,才可以正常提供leader選舉服務。否則就會一直出現上圖的錯誤資訊;

3、 如下圖所示,在zoo.cfg中server配置中,是否可以將其中的IP地址使用域名或者其他易於識別的名稱代替?如圖:

思考:我們都知道,一個伺服器正常都是使用域名來訪問的,使用域名的好處就是防止IP發生變化導致伺服器頻繁修改IP引用。在上圖的zookeeper叢集的配置中,使用的是IP地址的配置訪問,其實使用IP來這麼做的一個缺陷,肯定就是剛剛說的IP變化所帶來的服務不可用。所以,線上環境一般建議通過域名來配置,方便擴充套件維護。

問題:如何將192.168.52.128192.168.52.129192.168.52.130通過域名或者其他易於識別的別名替換?

答案:解決方案肯定是有的。

我們就拿其中一個zookeeper節點進行講解配置,其他的節點配置都是一樣的。

我這裡選擇了 192.168.52.128這個伺服器進行zookeeper叢集資訊的優化配置;

1、首先,肯定需要設定IP地址與域名的對映關係,類似於window系統中的host

通過命令vi編輯 /etc/hosts 檔案,進入編輯區域。最終配置如圖:

檔案內部最頂層是系統預設有的配置,我們不用理會。我們只需要新增zookeeper3臺伺服器節點的IP與別名的對映關係即可。

IP地址右側的配置,可以隨意指定別名或者域名,方便區分標識即可。

儲存之後,你也可以通過ping命令來測一下網路狀態,如圖:

 

圖中所示結果,說明配置的沒有問題。

2、修改zookeeper的zoo.cfg檔案,將裡面的server配置部分中的IP地址,替換為上面對應配置的別名,zoo.cfg最終配置如下:

3、重啟zookeeper,進行測試驗證,是否可以成功啟動

  • 從上圖會看到,zookeeper重啟後,zookeeper服務是正常的。故:按照上面的/etc/hosts的對映配置,是可以實現IP地址替換為別名的。
  • 當然,有的朋友或許會問, /etc/hosts 檔案下不還是有IP地址的配置嗎,有什麼提升和好