ZooKeeper 搭建

在這裏插入圖片描述

認識ZooKeeper

ZooKeeper概述

背景

隨着互聯網技術的高速發展,企業對計算機系統的計算、存儲能力要求越來越高,最簡單的證明就是出現了一些諸如:高併發,海量存儲這樣的詞彙。在這樣的背景下,單純依靠少量高性能主機來完成計算任務已經不能滿足企業的需求,企業的IT架構逐步從集中式向分佈式過渡,所謂的分佈式是指:把一個計算任務分解成若干個計算單元,並且分派到若干不同的計算機中去執行,然後彙總計算結果的過程!

ZooKeeper是什麼

ZooKeeper是源代碼開放的分佈式協調服務,由雅虎創建,是Google Chubby的開源實現。ZooKeeper是一個高性能的分佈式數據一致性解決方案,它將那些複雜的、容易出錯的分佈式一致性服務封裝起來,構成一個高效可靠的原語集,並提供一系列簡單易用的接口給用戶使用

ZooKeeper的應用場景
  • 數據發佈/訂閱

數據發佈/訂閱 顧名思義就是一方把數據發佈出來,另一方通過某種手段可以得到這些數據
通常數據訂閱有兩種方式:推模式和拉模式,推模式一般是服務器主動向客戶端推送信息, 拉模式是客戶端主動去服務器獲取數據(通常是採用定時輪詢的方式),
ZK採用兩種方式相結合
發佈者將數據發佈到ZK集羣節點上,訂閱者通過一定的方法告訴服務器,我對哪個節點的數據感興趣,那服務器在這些節點的數據發生變化時,就通知客戶端,客戶端得到通知後可以去服務器獲取數據信息

  • 負載均衡

步驟:
1、首先DB在啓動的時候先把自己在ZK上註冊成一個臨時節點,ZK的節點後面我們會講到有兩種,一種是永久節點,一類是臨時節點臨時節點在服務器出現問題的時候,節點會自動的從ZK上刪除,那麼這樣ZK上的服務器列表就是最新的可用的列表
2、客戶端在需要讀寫數據庫的時候首先它去ZooKeeper得到所有可用的DB的連接信息(一張列表)
3、客戶端隨機選擇一個與之建立連接
4、當客戶端發現連接不可用的時候可再次從ZK上獲取可用的DB連接信息,當然也可以在剛獲取的那個列表裏移除掉不可用的連接後再隨機選擇一個DB與之連接

  • 命名服務

顧名思義,就是提供名稱的服務,例如數據庫表格ID,一般用得比較多的有兩種ID,一種是自動增長的ID,一種是UUID(9291d71a-0354-4d8e-acd8-64f7393c64ae),兩種ID各自都有缺陷,自動增長的ID侷限在單庫單表中使用,不能在分佈式中使用,UUID可以在分佈式中使用但是由於ID沒有規律難於理解,我們可以借用ZK來生成一個順序增長的,可以在集羣環境下使用的,命名易於理解的ID

  • 分佈式協調/通知

心跳檢測
在分佈式系統中,我們常常需要知道某個機器是否可用,傳統的開發中,可以通過Ping某個主機來實現,Ping得通說明對方是可用的,相反是不可用的,ZK 中我們讓所有的機其都註冊一個臨時節點,我們判斷一個機器是否可用,我們只需要判斷這個節點在ZK中是否存在就可以了,不需要直接去連接需要檢查的機器 ,降低系統的複雜度

Zookeeper的環境搭建

Zookeeper使用java語言編寫,所以它的運行環境需要java環境的支持

下載Zookeeper的安裝包

下載地址:下載stable路徑下的版本
http://mirrors.hust.edu.cn/apache/zookeeper/

Zookeeper有兩種運行模式,集羣模式和單機模式

zookeeper-端口說明

一、zookeeper有三個端口(可以修改)
1、2181
2、3888
3、2888

二、3個端口的作用
1、2181:對cline端提供服務
2、3888:選舉leader使用
3、2888:集羣內機器通訊使用(Leader監聽此端口)

三、部署時注意
1、單機單實例,只要端口不被佔用即可
2、單機僞集羣(單機,部署多個實例),三個端口必須修改爲組組不一樣
如:myid1 : 2181,3888,2888
myid2 : 2182,3788,2788
myid3 : 2183,3688,2688
3、集羣(一臺機器部署一個實例)

四、集羣爲大於等於3個基數,如 3、5、7…,不宜太多,集羣機器多了選舉和數據同步耗時時長長,不穩定。目前覺得,三臺選舉+N臺observe很不錯。

zookeeper的安裝和配置

Zookeeper的目的是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。Zookeeper有兩種運行模式,單機模式(Standalone)和集羣模式(Distributed),但是Zookeeper的長處在於可以搭建分佈式的Zookeeper集羣(一個Leader,多個Follower),從而可以保證集羣的高可用性、高穩定性、高可靠性。

下面說明一下Zookeeper兩種模式的配置:
在配置Zookeeper之前,下載Zookeeper的安裝包:http://zookeeper.apache.org/releases.html#download
我使用的是zookeeper-3.3.6版本的。

Zookeeper的單機模式(standalone)

下載安裝包之後,使用Winscp放到Linux的環境中,然後解壓安裝包:

1.tar zxvf zookeeper-3.3.6.tar.gz
解壓後開始配置Zookeeper,進入到配置文件的目錄:
2.cd zookeeper-3.3.6/conf/
將目錄下面的 zoo_sample.cfg修改爲zoo.cfg,然後配置內容爲:

1).# The number of milliseconds of each tick
2).tickTime=2000
3).# The number of ticks that the initial
4).# synchronization phase can take
5).initLimit=10
6).# The number of ticks that can pass between
7).# sending a request and getting an acknowledgement
8).syncLimit=5
9).# the directory where the snapshot is stored.
10).dataDir=/tmp/zookeeper
11).# the port at which the clients will connect
12).clientPort=2181

上面各個配置參數的含義:

  • tickTime:這個時間是作爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
  • dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。
  • lientPort:這個端口就是客戶端連接
  • Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
  • dataLogDir: log目錄, 同樣可以是任意目錄. 如果沒有設置該參數, 將使用和dataDir相同的設置,這個參數我沒有設置。

3.配置好後,啓動Zookeeper服務器進程:

1).cd zookeeper-3.3.6/
2).bin/zkServer.sh start

4.啓動成功後,用jps -m的命令查詢,Zookeeper的進程爲QuorumPeerMain

5.用客戶端進程連接服務器,執行如下命令:
bin/zkCli.sh -server logsrv03:2181
上面的logsrv是我的主機名,後面的2181是連接的端口號
連接成功後,出現以下的連接信息:

1).[root@logsrv03 zookeeper-3.3.6]# bin/zkCli.sh -server logsrv03:2181
2).Connecting to logsrv03:2181
3).2015-08-18 10:23:48,966 - INFO [main:Environment@97] - Client environment:zookeeper.version=3.3.6-1366786, built on 07/29/2012 06:22 GMT
4).2015-08-18 10:23:48,969 - INFO [main:Environment@97] - Client environment:host.name=logsrv03
5).2015-08-18 10:23:48,970 - INFO [main:Environment@97] - Client environment:java.version=1.7.0_71
6).2015-08-18 10:23:48,970 - INFO [main:Environment@97] - Client environment:java.vendor=Oracle Corporation
7).2015-08-18 10:23:48,971 - INFO [main:Environment@97] - Client environment:java.home=/usr/local/jdk1.7.0_71/jre
8).2015-08-18 10:23:48,971 - INFO [main:Environment@97] - Client environment:java.class.path=/usr/local/jiang/zookeeper-3.3.6/bin/…/build/classes:/usr/local/jiang/zookeeper-3.3.6/bin/…/build/lib/.jar:/usr/local/jiang/zookeeper-3.3.6/bin/…/zookeeper-3.3.6.jar:/usr/local/jiang/zookeeper-3.3.6/bin/…/lib/log4j-1.2.15.jar:/usr/local/jiang/zookeeper-3.3.6/bin/…/lib/jline-0.9.94.jar:/usr/local/jiang/zookeeper-3.3.6/bin/…/src/java/lib/.jar:/usr/local/jiang/zookeeper-3.3.6/bin/…/conf:.:/usr/local/jdk1.7.0_71/lib:/usr/local/jdk1.7.0_71/lib/dt.jar:/usr/local/jdk1.7.0_71/lib/tools.jar
9).2015-08-18 10:23:48,972 - INFO [main:Environment@97] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
10).2015-08-18 10:23:48,972 - INFO [main:Environment@97] - Client environment:java.io.tmpdir=/tmp
11).2015-08-18 10:23:48,973 - INFO [main:Environment@97] - Client environment:java.compiler=
12).2015-08-18 10:23:48,973 - INFO [main:Environment@97] - Client environment:os.name=Linux
13).2015-08-18 10:23:48,974 - INFO [main:Environment@97] - Client environment:os.arch=amd64
14).2015-08-18 10:23:48,974 - INFO [main:Environment@97] - Client environment:os.version=2.6.32-431.el6.x86_64
15).2015-08-18 10:23:48,975 - INFO [main:Environment@97] - Client environment:user.name=root
16).2015-08-18 10:23:48,975 - INFO [main:Environment@97] - Client environment:user.home=/root
17).2015-08-18 10:23:48,976 - INFO [main:Environment@97] - Client environment:user.dir=/usr/local/jiang/zookeeper-3.3.6
18).2015-08-18 10:23:48,977 - INFO [main:ZooKeeper@379] - Initiating client connection, connectString=logsrv03:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMainMyWatcher@1698ab0419.WelcometoZooKeeper!20.2015081810:23:48,995INFO[mainSendThread():ClientCnxnMyWatcher@1698ab04 19).Welcome to ZooKeeper! 20).2015-08-18 10:23:48,995 - INFO [main-SendThread():ClientCnxnSendThread@1058] - Opening socket connection to server logsrv03/172.17.6.148:2181
21).2015-08-18 10:23:49,002 - INFO [main-SendThread(logsrv03:2181):ClientCnxnSendThread@947]Socketconnectionestablishedtologsrv03/172.17.6.148:2181,initiatingsession22.JLinesupportisenabled23.2015081810:23:49,020INFO[mainSendThread(logsrv03:2181):ClientCnxnSendThread@947] - Socket connection established to logsrv03/172.17.6.148:2181, initiating session 22).JLine support is enabled 23).2015-08-18 10:23:49,020 - INFO [main-SendThread(logsrv03:2181):ClientCnxnSendThread@736] - Session establishment complete on server logsrv03/172.17.6.148:2181, sessionid = 0x24f3b0a17ea0002, negotiated timeout = 30000

25).WATCHER::
26).
27).WatchedEvent state:SyncConnected type:None path:null
28).[zk: logsrv03:2181(CONNECTED) 0]
到這,Zookeeper Standalone模式就配置完成了。

Zookeeper的集羣模式(Distributed)

Zookeeper服務自身組成一個集羣(2n+1個服務允許n個失效)。Zookeeper服務有兩個角色,一個是leader,負責寫服務和數據同步,剩下的是follower,提供讀服務,leader失效後會在follower中重新選舉新的leader。在整個Zookeeper集羣模式下,整個集羣是一個整體,在集羣中的任何一個Zookeeper節點共享整個集羣的服務。

下面介紹集羣模式的配置過程:

第一步:配置主機名和ip的映射

在Zookeeper集羣運行的過程中,每一個Zookeeper節點是需要相互通信的,並且是通過主機名來相互通信的,集羣每個節點需要相互識別,所以,在配置一個Zookeeper節點的時候需要配置其他節點主機名到ip的映射

例如配置我的Zookeeper集羣,集羣中一共有三臺機子:logsrv02、logsrv03、logsrv04,以logsrv03爲例子,進入/etc/hosts,內容如下所示:

1.172.17.6.142 logsrv02
2.172.17.6.148 logsrv03
3.172.17.6.149 logsrv04

第二步:配置Zookeeper的配置文件

1.# The number of milliseconds of each tick
2.tickTime=2000
3.# The number of ticks that the initial
4.# synchronization phase can take
5.initLimit=10
6.# The number of ticks that can pass between
7.# sending a request and getting an acknowledgement
8.syncLimit=5
9.# the directory where the snapshot is stored.
10.dataDir=/tmp/zookeeper
11.# the port at which the clients will connect
12.clientPort=2181
13.server.1=logsrv02:2888:3888
14.server.2=logsrv03:2888:3888
15.server.3=logsrv04:2888:3888

以上配置文件與單機模式相比其實也就多了集羣中server.id和主機名、端口號的映射信息。

第三步:在logsrv02和logsrv04添加安裝文件

我們在logsrv03中配置好了Zookeeper安裝文件,在一個集羣中,每一個Zookeeper節點只需要使用相同的安裝文件就行了,所以需要將配置好的文件複製到另外兩臺機子上,這裏介紹兩種方法:

第一種:使用Winscp將文件直接複製出去,然後再複製到另外兩臺機子上,這種方式需要安裝Winscp(用於在本地與遠程計算機間安全的複製文件,支持scp協議)
下載地址:http://winscp.net/eng/download.php

第二種:遠程命令的方式直接複製到logsrv02和logsrv04上,如下面所示:
1.cd /usr/local/
2.scp -r zookeeper-3.3.6/ root@logsrv02:/usr/local/
3.scp -r zookeeper-3.3.4/ root@logsrv04:/usr/local/

第四步:設置myid

在我們配置的dataDir指定的目錄下面,創建一個myid文件,裏面內容爲一個數字,用來標識當前主機,在conf/zoo.cfg中配置的server.x中x是什麼數字就設置id爲這個數字,如下面所示:

1.[root@logsrv02 zookeeper]# echo “1” > /tmp/zookeeper/myid
2.[root@logsrv03 zookeeper]# echo “2” > /tmp/zookeeper/myid
3.[root@logsrv04 zookeeper]# echo “3” > /tmp/zookeeper/myid

第五步:配置好後,啓動集羣

配置好後,進入/usr/local/zookeeper-3.3.6/目錄下,然後執行如下命令啓動zookeeper:

1.[root@logsrv02 zookeeper-3.3.6]# bin/zkServer start
2.[root@logsrv03 zookeeper-3.3.6]# bin/zkServer start
3.[root@logsrv04 zookeeper-3.3.6]# bin/zkServer start

第六步:安裝驗證

安裝完成後,可以通過zookeeper的腳本來查看zookeeper的啓動狀態,以及每個Zookeeper節點在集羣中的角色(Leader和Follower),下面是我的Zookeeper集羣各節點的查詢結果:

1.[root@logsrv02 zookeeper-3.3.6]# bin/zkServer.sh status
2.JMX enabled by default
3.Using config: /usr/local/jiang/zookeeper-3.3.6/bin/…/conf/zoo.cfg
4.Mode: follower
5.
6.[root@logsrv03 zookeeper-3.3.6]# bin/zkServer.sh status
7.JMX enabled by default
8.Using config: /usr/local/jiang/zookeeper-3.3.6/bin/…/conf/zoo.cfg
9.Mode: follower
10.
11.[root@logsrv04 zookeeper-3.3.6]# bin/zkServer.sh status
12.JMX enabled by default
13.Using config: /usr/local/zookeeper-3.3.6/bin/…/conf/zoo.cfg
14.Mode: leader

通過上面的信息可以得知,logsrv04是Leader,其餘兩個都是Follower。

集羣配置好後,可以通過其中一個Zookeeper節點連接點集羣上,而且通過一個節點可以共享整個集羣的服務,例如:當你配置好Zookeeper集羣后,再安裝中間件KAFKA後,通過zookeeper啓動KAFKA,然後通過腳本創建topic,topic的創建時需要指定zookeeper的節點,當許多節點都對應了topic,這個時候在zookeeper集羣中,查詢一個節點對應的topic列表,可以查詢到整個集羣的所有節點的topic列表。

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