本篇講述zookeeper單機及集群部署相种,筆者覺得還是比較詳細(xì)掖疮,希望能幫助到急需補充該方面知識的朋友,如發(fā)現(xiàn)有問題請及時指出
導(dǎo)讀
ZooKeeper是一個分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù)考润,是Google的Chubby一個開源的實現(xiàn),是Hadoop和Hbase的重要組件读处。它是一個為分布式應(yīng)用提供一致性服務(wù)的軟件伏尼,提供的功能包括:配置維護片拍、域名服務(wù)、分布式同步、組服務(wù)等吱韭。
ZooKeeper的基本運轉(zhuǎn)流程:
1愈捅、選舉Leader拯刁。
2谍咆、同步數(shù)據(jù)。
3包个、選舉Leader過程中算法有很多刷允,但要達(dá)到的選舉標(biāo)準(zhǔn)是一致的。
4、Leader要具有最高的執(zhí)行ID树灶,類似root權(quán)限纤怒。
5、集群中大多數(shù)的機器得到響應(yīng)并follow選出的Leader天通。
目前阿里開源的dubbo分布式服務(wù)框架推薦的注冊中心泊窘。
其更詳細(xì)原理可以參考:http://cailin.iteye.com/blog/2014486/
安裝
接下來我們進入zookeeper的安裝環(huán)節(jié),zookeeper的安裝總的來說比較簡單土砂,這里我準(zhǔn)備了3臺linux虛擬機州既,模擬集群環(huán)境谜洽,有條件的同學(xué)可以自己裝3臺(最少)萝映,其實集群和單機的區(qū)別不是太大,但是集群時節(jié)點數(shù)量一定是奇數(shù)(2n+1如3,5,7)阐虚,可參考選舉機制(FastLeaderElection算法)序臂。
工具: CentOS.7,zookeeper-3.4.6实束,Xshell5
注:zookeeper本身由java編寫奥秆,運行在java環(huán)境,故同學(xué)們必須先裝好java環(huán)境咸灿,才可以繼續(xù)zookeeper的安裝构订,這里我對java環(huán)境不做講解
單機模式
服務(wù)器CentOS7_64_1的ip:192.168.2.101
安裝包下載
首先使用grid用戶登錄CentOS7_64_1,將zookeeper-3.4.6的安裝包下載傳至/home/grid目錄下
http下載路徑: http://apache.fayea.com/zookeeper/
linux命令下載:$ wget http://apache.fayea.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
解壓安裝包
輸入tar -zxvf zookeeper-3.4.6.tar.gz將其解壓避矢,如下:
創(chuàng)建data和logs目錄
解壓后進入zookeeper-3.4.6目錄悼瘾,創(chuàng)建data目錄和logs目錄,zookeeper默認(rèn)是不帶這兩個目錄的审胸,需要用戶自行創(chuàng)建并指定亥宿。
[grid@h1 zookeeper-3.4.6]$ mkdir data
[grid@h1 zookeeper-3.4.6]$ mkdir logs
創(chuàng)建myid文件
在/home/grid/zookeeper-3.4.6/data下創(chuàng)建myid文件
編輯myid文件,并在對應(yīng)的IP的機器上輸入對應(yīng)的編號砂沛。如在第一臺zookeeper上烫扼,我們給該myid文件內(nèi)容指定就是1。如果只在單點上進行安裝配置碍庵,那么只有一個server映企,后面講集群的時候會有多臺服務(wù)器時就會有2,3,4,5...等等。
[grid@h1 data]$ vi myid
1
復(fù)制修改配置文件
接著進入zookeeper-3.4.6/conf目錄下静浴,將zoo_sample.cfg文件復(fù)制一份取名zoo.cfg
[grid@h1 conf]\$ cp zoo_sample.cfg zoo.cfg
注:之所以取名zoo.cfg是因為這是啟動時默認(rèn)約定讀取的
server.1=h1:2888:3888的解釋如下:
1是指一個數(shù)字堰氓,與前面創(chuàng)建的myid對應(yīng)即可,標(biāo)志這是第幾臺機器马绝,h1是我配置的映射名豆赏,大家可以直接將h1改為自己的ip,如
server.1=192.168.2.101:2888:3888;
Hosts映射配置:vi /etc/hosts掷邦,輸入自己的ip對應(yīng)寫個名字即可白胀,與windows類似,此配置步驟可以忽略抚岗,直接在zookeeper下的zoo.cfg文件寫ip地址即可
2888 表示的是這個服務(wù)器與集群中的 Leader 服務(wù)器交換信息的端或杠,2888端口簡單來說就是zookeeper服務(wù)之間的通信端口;
3888端口是zookeeper與其他應(yīng)用程序通信的端口
其他cfg參數(shù)說明
tickTime
tickTime這個時間是作為Zookeeper服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時間間隔,也就是每個tickTime時間就會發(fā)送一個心跳宣蔚。initLimit=10
initLimit這個配置項是用來配置Zookeeper接受客戶端(這里所說的客戶端不是用戶連接Zookeeper服務(wù)器的客戶端,而是Zookeeper服務(wù)器集群中連接到Leader的Follower 服務(wù)器)初始化連接時最長能忍受多少個心跳時間間隔數(shù)向抢。當(dāng)已經(jīng)超過10個心跳的時間(也就是tickTime)長度后Zookeeper 服務(wù)器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗∨呶總的時間長度就是10*2000=20 秒挟鸠。syncLimit=5
syncLimit這個配置項標(biāo)識Leader與Follower之間發(fā)送消息,請求和應(yīng)答時間長度,最長不能超過多少個tickTime的時間長度,總的時間長度就是5*2000=10秒。dataDir
dataDir顧名思義就是Zookeeper保存數(shù)據(jù)的目錄,默認(rèn)情況下Zookeeper將寫數(shù)據(jù)的日志文件也保存在這個目錄里亩冬。clientPort=2181
clientPort這個端口就是客戶端(應(yīng)用程序)連接Zookeeper服務(wù)器的端口,Zookeeper會監(jiān)聽這個端口接受客戶端的訪問請求
增加環(huán)境變量
修改該用戶下的.bash_profile文件艘希,此文件默認(rèn)為隱藏的
[grid@h1 data]$ vi /home/grid/.bash_profile
增加內(nèi)容如下:
export ZOOKEEPER_HOME=/home/grid/zookeeper-3.4.6
export PATH=$ZOOKEEPER_HOME/bin:$PATH
使配置文件生效:
[grid@h1 data]$ source /home/grid/.bash_profile
防火墻配置
在防火墻中打開要用到的端口,一般默認(rèn)是開放了22端口硅急,所以我們才能使用遠(yuǎn)程工具使用22進行連接覆享,現(xiàn)在我們?nèi)ヅ渲?181 2888 3888端口,切換到root用戶執(zhí)行如下命令
chkconfig iptables on 設(shè)置開機啟動
service iptables start 啟動防火墻
我這里設(shè)置時就報錯了营袜,報錯咱就得解決
解決方案:執(zhí)行下面命令下載安裝插件
[root@h1 ~]# yum install iptables-services
安裝完成后再次執(zhí)行chkconfig iptables on撒顿,service iptables start命令
接下來繼續(xù)開放防火墻端口
[root@h1 ~]# vi /etc/sysconfig/iptables
復(fù)制22端口那一行3次,然后將端口修改為需要開放的3個荚板,如下:
重啟防火墻
[root@h1 ~]# service iptables restart
開啟zookeeper服務(wù)
啟動并測試zookeeper(使用grid用戶啟動凤壁,不要使用root賬戶),在zookeeper目錄的bin下面執(zhí)行
[grid@h1 bin]$ ./zkServer.sh start
執(zhí)行jps查看狀態(tài)啸驯,其中QuorumPeerMain是zookeeper進程客扎,啟動正常
查看zookeeper服務(wù)輸出信息,其日志信息文件在
/home/grid/zookeeper-3.4.6/bin/zookeeper.out下
[grid@h1 bin]$ tail -222f zookeeper.out查看日志命令
設(shè)置服務(wù)為開機啟動
配置zookeeper為grid用戶開機啟動罚斗,不然在生產(chǎn)環(huán)境會很麻煩
編輯/etc/rc.local文件徙鱼,加入:
vi /etc/rc.local
su - grid -c '/home/grid/zookeeper-3.4.6/bin/zkServer.sh start'
注:su – grid是指切換到grid用戶,-c是指調(diào)用后面命令
好了针姿,單機版就講到這里袱吆,下面我們講解集群的配置
<br />
集群模式
服務(wù)器CentOS7_64_1的ip:192.168.2.101
服務(wù)器CentOS7_64_2的ip:192.168.2.102
服務(wù)器CentOS7_64_3的ip:192.168.2.103
首先我們將另外兩臺也按照如上方式進行配置,首先保證每臺機器自己啟動zookeeper成功,配置好后我們現(xiàn)在是擁有3臺單機的zookeeper距淫,那么下面我們進行集群的配置
hosts配置
首先修改3臺虛擬機的hosts映射配置:vi /etc/hosts绞绒,3臺機器分別加上自己ip和hosts別名的映射(修改后自動生效),如下:
修改防火墻端口
接下來配置3臺服務(wù)器的端口榕暇,防火墻那一塊改為下面對應(yīng)的端口
機器1—端口:2181,2881,3881
機器2—端口:2182,2882,3882
機器3—端口:2183,2883,3883
zookeeper配置
注意3臺機器**端口號**參數(shù)
vi /conf/zoo.cfg
另修改data文件夾下的myid文件的值蓬衡,分別對應(yīng)的值為1,2,3
啟動zookeeper
我啟動了第一臺服務(wù)出了如下異常喻杈,于是我想應(yīng)該是防火墻的哪個配置未生效
異常信息:
Cannot open channel to 2 at election address h2/192.168.2.102:3882
java.net.NoRouteToHostException: 沒有到主機的路由
應(yīng)該是防火墻配置改了未生效,于是重新啟動了3臺機器防火墻
service iptables restart
下面是我重新啟動后拋出的異常
異常信息:
Cannot open channel to 1 at election address h1/192.168.2.101:3881
java.net.ConnectException: 拒絕連接
解決異常
一開始認(rèn)為是等待其他機器開啟狰晚,但啟動其他兩臺后一直出現(xiàn)該問題筒饰,所以花了半個小時查原因,后來檢查沒發(fā)現(xiàn)配置問題壁晒,但3臺機器的hosts文件中有如下內(nèi)容瓷们,決定嘗試注釋后重啟,正常啟動
127.0.0.1 localhost h1 localhost4 localhost4.localdomain4
::1 localhost h1 localhost6 localhost6.localdomain6
再次重啟成功
下圖這里開始啟動出錯的原因是集群環(huán)境正等待著另外幾臺機器秒咐,否則一臺也沒辦法進行選舉等操作谬晕,第二臺機器起來后就恢復(fù)正常了。
查看狀態(tài)
接下來我們運行status命令分別查看各自的狀態(tài)
啟動的第一臺機器:3號機-領(lǐng)導(dǎo)者
啟動的第二臺機器:2號機-跟隨者
啟動第三臺機器:1號機-跟隨者
一旦leader停止服務(wù)携取,剩下的follower會選舉出leader攒钳,大家可以嘗試下看看狀態(tài)變化
那么zookeeper的集群暫時就講到這里,這都是筆者參考了網(wǎng)絡(luò)上的資料自行操作后寫出來分享給大家的歹茶,如有問題希望大家提出夕玩,共同學(xué)習(xí)共同進步