Zookeeper是一種在分散式系統中被廣泛用來作為:分散式狀態管理、分散式協調管理、分散式配置管理、和分散式鎖服務的叢集。kafka增加和減少伺服器都會在Zookeeper節點上觸發相應的事件kafka系統會捕獲這些事件,進行新一輪的負載均衡,客戶端也會捕獲這些事件來進行新一輪的處理。
Kafka叢集是把狀態儲存在Zookeeper中的,首先要搭建Zookeeper叢集。
- Linux伺服器一臺、三臺、五臺、(2*n+1),是否可以用偶數,不一定,其實沒必要。假設叢集中有3臺伺服器在工作,根據zookeeper的工作原理,只要有半數以上存活,那麼整個叢集就能對外服務,3臺中超過兩臺超過半數,允許1臺掛掉。如果有4臺,那麼不允許掛掉2臺,因為剩餘2臺的話,也沒有超過半數,也就是隻允許掛掉1臺。
- Zookeeper是用java寫的所以他的需要JAVA環境,java是執行在java虛擬機器上的,本部落格http://www.cnblogs.com/wt645631686/p/8267239.html有安裝方法。
- Zookeeper的穩定版本Zookeeper 3.4.6版本
開始搭建
一、環境準備
環境:Centos6,三臺伺服器,分別是192.168.244.131、192.168.244.133、192.168.244.134,Java版本1.8
Zookeeper3.6.4下載地址 連結:https://pan.baidu.com/s/1XlQ4viDo-q0J66geFyErvQ 提取碼:h7to
二、目錄建立
在每臺機器的/usr/local/建立zookeeper目錄,然後分別下載Zookeeper的tag包到/usr/local/zookeeper(專案目錄)目錄下,在/usr/local/zookeeper建立zkdata(存放快照日誌)和zkdataLog(存放事務日誌)目錄,用於zookeeper的配置。
三、解壓包,並複製、修改配置檔案
# tar -zxvf zookeeper-3.4.6.tar.gz
# cd zookeeper-3.4.6/conf/
# cp zoo_sample.cfg zoo.cfg //zoo_sample.cfg 這個檔案是官方給我們的zookeeper的樣板檔案,給他複製一份命名為zoo.cfg,zoo.cfg是官方指定的檔案命名規則。
//--------------------------------conf start------------------------
# The number of milliseconds of each tick
tickTime=2000 //這個時間是作為 Zookeeper 伺服器之間或客戶端與伺服器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會傳送一個心跳。
# The number of ticks that the initial
# synchronization phase can take
initLimit=10 //這個配置項是用來配置 Zookeeper 接受客戶端(這裡所說的客戶端不是使用者連線 Zookeeper 伺服器的客戶端,而是 Zookeeper 伺服器叢集中連線到 Leader 的 Follower 伺服器)初始化連線時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是 tickTime)長度後 Zookeeper 伺服器還沒有收到客戶端的返回資訊,那麼表明這個客戶端連線失敗。總的時間長度就是 5*2000=10 秒,10秒內要啟動叢集並出現leader和floower。
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5 //這個配置項標識 Leader 與Follower 之間傳送訊息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是5*2000=10秒,超出時間認為是當機。
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper/zkdata //快照日誌的儲存路徑
dataLogDir=/usr/local/zookeeper/zkdataLog //事物日誌的儲存路徑,如果不配置這個那麼事物日誌會預設儲存到dataDir制定的目錄,這樣會嚴重影響zk的效能,當zk吞吐量較大的時候,產生的事物日誌、快照日誌太多
# the port at which the clients will connect
clientPort=12181 //這個埠就是客戶端連線 Zookeeper 伺服器的埠,Zookeeper 會監聽這個埠,接受客戶端的訪問請求。修改他的埠改大點
server.1=192.168.244.131:12888:13888
server.2=192.168.244.133:12888:13888
server.3=192.168.244.134:12888:13888
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
//-------------------------------conf end-----------------------------------
//server.1 這個1是伺服器的標識也可以是其他的數字, 表示這個是第幾號伺服器,用來標識伺服器,這個標識要寫到快照目錄下面myid檔案裡
//192.168.244.131為叢集裡的IP地址,第一個埠是master和slave之間的通訊埠,預設是2888,第二個埠是leader選舉的埠,叢集剛啟動的時候選舉或者leader掛掉之後進行新的選舉的埠預設是3888
四、每臺伺服器建立myid檔案
既然在配置檔案中設定了每臺機器的標識,標識要寫在快照目錄下面,需要進入zkdata目錄下建立,對應好配置檔案的ip,和server id。
//server1 192.168.244.131
#echo "1" > /usr/local/zookeeper/zkdata/myid
//server2 192.168.244.133
# echo "2" > /usr/local/zookeeper/zkdata/myid
//server3 192.168.244.134
# echo "3" > /usr/local/zookeeper/zkdata/myid
五、啟動三臺zookeeper
進入每臺zookeeper伺服器的/usr/local/zookeeper/zookeeper-3.4.6/bin目錄,啟動zkServer
# ./zkServer.sh //檢視有哪些命令
JMX enabled by default
Using config: /usr/local/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Usage: ./zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
# ./zkServer.sh start //啟動
JMX enabled by default
Using config: /usr/local/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
下面檢視每臺zookeeper的狀態,這裡可能會報錯,先把每臺的防火牆關掉再執行檢視命令
192.168.244.131
# ./zkServer.sh status //192.168.244.131
JMX enabled by default
Using config: /usr/local/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
192.168.244.133
# ./zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
192.168.244.134
# ./zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
leader是表示領導,follower表示是屬下,zookeeper叢集一般只有一個leader,多個follower,主(leader)一般是相應客戶端的讀寫請求,向(follower)傳送資料,而從(follower)主要是同步資料,當主掛掉之後就會從follower裡重新選舉一個leader出來。
到此,zookeeper叢集搭建完畢。
可以用“jps”檢視zk的程式,這個是zk的整個工程的main
# jps
4912 Jps
4064 QuorumPeerMain //zk工程的類
其他說明
一、log4j.properties配置檔案
- https://www.cnblogs.com/30go/p/7200739.html
- https://www.cnblogs.com/likui360/p/7992982.html
- https://blog.csdn.net/damacheng/article/details/42393827
二、zkEnv.sh和zkServer.sh檔案
- zkServer.sh 主的管理程式檔案
- zkEnv.sh 是主要配置,zookeeper叢集啟動時配置環境變數的檔案
三、事務日誌檔案的清理(zoo.cfg的dataLogDir配置項)
工作時會產生大量日誌,不清理會沾滿自盤,所以需要清理。
官網說明:http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html#sc_maintenance
ZooKeeper server will not remove old snapshots and log files when using the default configuration (see autopurge below), this is the responsibility of the operator
使用預設配置時,ZooKeeper伺服器不會刪除舊的快照和日誌檔案(參見下面的自動清除),這是操作員的職責。
自動定時定期清理的指令碼,每臺機器都需要設定同樣的定時任務
#!/bin/bash
#snapshot file dir
dataDir=/usr/local/zookeeper/zkdata/version-2
#tran log dir
dataLogDir=/usr/local/zookeeper/zkdatalog/version-2
#Leave 66 files
count=66
count=$[$count+1]
ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f
ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f
#以上這個指令碼定義了刪除對應兩個目錄中的檔案,保留最新的66個檔案,可以將他寫到crontab中,設定為每天凌晨2點執行一次就可以了。
#zk log dir del the zookeeper log
#logDir=
#ls -t $logDir/zookeeper.log.* | tail -n +$count | xargs rm -f
舉例,讓每個星期天的0點0分執行。
# crontab -e
0 0 * * 0 sh /usr/local/zookeeper/cleanup.sh //分時日月周,周是0-6,0表示週日
# crontab -l
sh /usr/local/zookeeper/cleanup.sh
其他方法:
①使用ZK的工具類PurgeTxnLog,它的實現了一種簡單的歷史檔案清理策略,可以在這裡看一下他的使用方法 http://zookeeper.apache.org/doc/r3.4.6/zookeeperAdmin.html
②對於上面這個執行,ZK自己已經寫好了指令碼,在bin/zkCleanup.sh中,所以直接使用這個指令碼也是可以執行清理工作的。
③從3.4.0開始,zookeeper提供了自動清理snapshot和事務日誌的功能,通過配置 autopurge.snapRetainCount 和 autopurge.purgeInterval 這兩個引數能夠實現定時清理了。這兩個引數都是在zoo.cfg中配置的:
autopurge.purgeInterval 這個引數指定了清理頻率,單位是小時,需要填寫一個1或更大的整數,預設是0,表示不開啟自己清理功能。
autopurge.snapRetainCount 這個引數和上面的引數搭配使用,這個引數指定了需要保留的檔案數目。預設是保留3個。
推薦使用指令碼清理,對於運維人員來說,將日誌清理工作獨立出來,便於統一管理也更可控。