目錄
正文
鑒于 ZooKeeper 本身的特點,服務(wù)器集群的節(jié)點數(shù)推薦設(shè)置為奇數(shù)臺。我這里我規(guī)劃為三臺, 為別為 hadoop1,hadoop2,hadoop3
下載地址:http://mirrors.hust.edu.cn/apache/ZooKeeper/
此處使用的是3.4.10版本
[hadoop@hadoop1 ~]$ tar -zxvf zookeeper-3.4.10.tar.gz -C apps/
ZooKeeper 運行最重要的四個東西
[hadoop@hadoop1 zookeeper-3.4.10]$ cd conf/[hadoop@hadoop1 conf]$ mv zoo_sample.cfg zoo.cfg[hadoop@hadoop1 conf]$ vi zoo.cfg
tickTime
心跳基本時間單位,毫秒級,ZK基本上所有的時間都是這個時間的整數(shù)倍。
initLimit
tickTime的個數(shù),表示在leader選舉結(jié)束后,followers與leader同步需要的時間,如果followers比較多或者說leader的數(shù)據(jù)灰常多時,同步時間相應(yīng)可能會增加,那么這個值也需要相應(yīng)增加。當(dāng)然,這個值也是follower和observer在開始同步leader的數(shù)據(jù)時的最大等待時間(setSoTimeout)
syncLimit
tickTime的個數(shù),這時間容易和上面的時間混淆,它也表示follower和observer與leader交互時的最大等待時間,只不過是在與leader同步完畢之后,進入正常請求轉(zhuǎn)發(fā)或ping等消息交互時的超時時間。
dataDir
內(nèi)存數(shù)據(jù)庫快照存放地址,如果沒有指定事務(wù)日志存放地址(dataLogDir),默認(rèn)也是存放在這個路徑下,建議兩個地址分開存放到不同的設(shè)備上。
clientPort
配置ZK監(jiān)聽客戶端連接的端口
在配置文件末尾添加
server.serverid=host:tickpot:electionport
server:固定寫法
serverid:每個服務(wù)器的指定ID(必須處于1-255之間,必須每一臺機器不能重復(fù))
host:主機名
tickpot:心跳通信端口
electionport:選舉端口
dataLogDir
將事務(wù)日志存儲在該路徑下,比較重要,這個日志存儲的設(shè)備效率會影響ZK的寫吞吐量。
globalOutstandingLimit
(Java system property: zookeeper.globalOutstandingLimit)默認(rèn)值是1000,限定了所有連接到服務(wù)器上但是還沒有返回響應(yīng)的請求個數(shù)(所有客戶端請求的總數(shù),不是連接總數(shù)),這個參數(shù)是針對單臺服務(wù)器而言,設(shè)定太大可能會導(dǎo)致內(nèi)存溢出。
preAllocSize
(Java system property: zookeeper.preAllocSize)默認(rèn)值64M,以KB為單位,預(yù)先分配額定空間用于后續(xù)transactionlog 寫入,每當(dāng)剩余空間小于4K時,就會又分配64M,如此循環(huán)。如果SNAP做得比較頻繁(snapCount比較小的時候),那么請減少這個值。
snapCount
(Java system property: zookeeper.snapCount)默認(rèn)值100,000,當(dāng)transaction每達到snapCount/2+rand.nextInt(snapCount/2)時,就做一次SNAPSHOT,默認(rèn)情況下是50,000~100,000條transactionlog就會做一次,之所以用隨機數(shù)是為了避免所有服務(wù)器可能在同一時間做snapshot.
traceFile (Java system property: requestTraceFile)
maxClientCnxns
默認(rèn)值是10,一個客戶端能夠連接到同一個服務(wù)器上的最大連接數(shù),根據(jù)IP來區(qū)分。如果設(shè)置為0,表示沒有任何限制。設(shè)置該值一方面是為了防止DoS攻擊。
clientPortAddress
與clientPort匹配,表示某個IP地址,如果服務(wù)器有多個網(wǎng)絡(luò)接口(多個IP地址),如果沒有設(shè)置這個屬性,則clientPort會綁定到所有IP地址上,否則只綁定到該設(shè)置的IP地址上。
minSessionTimeout
最小的session time時間,默認(rèn)值是2個tick time,客戶端設(shè)置的session time 如果小于這個值,則會被強制協(xié)調(diào)為這個最小值。
maxSessionTimeout
最大的session time 時間,默認(rèn)值是20個tick time. ,客戶端設(shè)置的session time 如果大于這個值,則會被強制協(xié)調(diào)為這個最大值。
electionAlg
領(lǐng)導(dǎo)選舉算法,默認(rèn)是3(fast leader election,基于TCP),0表示leader選舉算法(基于UDP),1表示非授權(quán)快速選舉算法(基于UDP),2表示授權(quán)快速選舉算法(基于UDP),目前1和2算法都沒有應(yīng)用,不建議使用,0算法未來也可能會被干掉,只保留3(fast leader election)算法,因此最好直接使用默認(rèn)就好。
initLimit
tickTime的個數(shù),表示在leader選舉結(jié)束后,followers與leader同步需要的時間,如果followers比較多或者說leader的數(shù)據(jù)灰常多時,同步時間相應(yīng)可能會增加,那么這個值也需要相應(yīng)增加。當(dāng)然,這個值也是follower和observer在開始同步leader的數(shù)據(jù)時的最大等待時間(setSoTimeout)
syncLimit
tickTime的個數(shù),這時間容易和上面的時間混淆,它也表示follower和observer與leader交互時的最大等待時間,只不過是在與leader同步完畢之后,進入正常請求轉(zhuǎn)發(fā)或ping等消息交互時的超時時間。
leaderServes
(Java system property: zookeeper.leaderServes) 如果該值不是no,則表示該服務(wù)器作為leader時是需要接受客戶端連接的。為了獲得更高吞吐量,當(dāng)服務(wù)器數(shù)三臺以上時一般建議設(shè)置為no。
cnxTimeout
(Java system property: zookeeper.cnxTimeout) 默認(rèn)值是5000,單位ms 表示leaderelection時打開連接的超時時間,只用在算法3中。
skipACL
(Java systemproperty: zookeeper.skipACL) 默認(rèn)值是no,忽略所有ACL檢查,相當(dāng)于開放了所有數(shù)據(jù)權(quán)限給任何人。
forceSync
(Java systemproperty: zookeeper.forceSync) 默認(rèn)值是yes, 表示transactionlog在commit時是否立即寫到磁盤上,如果關(guān)閉這個選項可能會在斷電時丟失信息。
jute.maxbuffer
(Java system property: jute.maxbuffer)默認(rèn)值0xfffff,單位是KB,表示節(jié)點數(shù)據(jù)最多1M。如果要設(shè)置這個值,必須要在所有服務(wù)器上都需要設(shè)置。
授權(quán)認(rèn)證配置項
DigestAuthenticationProvider.superDigest
(Java system property only: zookeeper.DigestAuthenticationProvider.superDigest) 設(shè)置這個值是為了確定一個超級用戶,它的值格式為
super:<base64encoded(SHA1(idpassword))> ,一旦當(dāng)前連接addAuthInfo超級用戶驗證通過,后續(xù)所有操作都不會checkACL.
[hadoop@hadoop1 apps]$ scp -r zookeeper-3.4.10/ hadoop2:$PWD[hadoop@hadoop1 apps]$ scp -r zookeeper-3.4.10/ hadoop3:$PWD
然后是最重要的步驟,一定不能忘了。 去你的各個 ZooKeeper 服務(wù)器節(jié)點,新建目錄 dataDir=/home/hadoop/data/zkdata,這個 目錄就是你在 zoo.cfg 中配置的 dataDir 的目錄,建好之后,在里面新建一個文件,文件 名叫 myid,里面存放的內(nèi)容就是服務(wù)器的 id,就是 server.1=hadoop01:2888:3888 當(dāng)中的 id, 就是 1,那么對應(yīng)的每個服務(wù)器節(jié)點都應(yīng)該做類似的操作 拿服務(wù)器 hadoop1 舉例:
[hadoop@hadoop1 ~]$ mkdir /home/hadoop/data/zkdata[hadoop@hadoop1 ~]$ cd data/zkdata/[hadoop@hadoop1 zkdata]$ echo 1 > myid
當(dāng)以上所有步驟都完成時,意味著我們 ZooKeeper 的配置文件相關(guān)的修改都做完了。
[hadoop@hadoop1 ~]$ vi .bashrc
#Zookeeperexport ZOOKEEPER_HOME=/home/hadoop/apps/zookeeper-3.4.10export PATH=$PATH:$ZOOKEEPER_HOME/bin
保存退出
[hadoop@hadoop1 ~]$ source .bash
命令
啟動:zkServer.sh start
停止:zkServer.sh stop
查看狀態(tài):zkServer.sh status
注意:雖然我們在配置文件中寫明了服務(wù)器的列表信息,但是,我們還是需要去每一臺服務(wù) 器去啟動,不是一鍵啟動集群模式
每啟動一臺查看一下狀態(tài)再啟動下一臺
[hadoop@hadoop1 ~]$ zkServer.sh startZooKeeper JMX enabled by defaultUsing config: /home/hadoop/apps/zookeeper-3.4.10/bin/../conf/zoo.cfgStarting zookeeper ... STARTED[hadoop@hadoop1 ~]$ zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /home/hadoop/apps/zookeeper-3.4.10/bin/../conf/zoo.cfgError contacting service. It is probably not running.[hadoop@hadoop1 ~]$
[hadoop@hadoop2 ~]$ zkServer.sh startZooKeeper JMX enabled by defaultUsing config: /home/hadoop/apps/zookeeper-3.4.10/bin/../conf/zoo.cfgStarting zookeeper ... STARTED[hadoop@hadoop2 ~]$ zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /home/hadoop/apps/zookeeper-3.4.10/bin/../conf/zoo.cfgMode: leader[hadoop@hadoop2 ~]$
此時在查看hadoop1的狀態(tài)
[hadoop@hadoop3 ~]$ zkServer.sh startZooKeeper JMX enabled by defaultUsing config: /home/hadoop/apps/zookeeper-3.4.10/bin/../conf/zoo.cfgStarting zookeeper ... STARTED[hadoop@hadoop3 ~]$ zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /home/hadoop/apps/zookeeper-3.4.10/bin/../conf/zoo.cfgMode: follower[hadoop@hadoop3 ~]$
3臺機器上都有QuorumPeerMain進程
[hadoop@hadoop1 ~]$ jps2499 Jps2404 QuorumPeerMain[hadoop@hadoop1 ~]$