安裝步驟
本安裝教程,採用zookeeper 3.6.1
- 裝java
- 下載zk包,分發到各個機器
- 確定或建立一個zookeeper的資料存放路徑,並在該路徑下建立一個myid檔案,其中設定當前zookeeper節點的編號,編號範圍1~255。整個zookeeper叢集唯一
- 在資料資料夾建立一個initialize檔案,初始化叢集時使用,啟動後,叢集會自動刪除該檔案。後續重啟叢集,不需要該檔案
initialize檔案
3.6.0的zk,在啟動後,如果發現自己的data 目錄是空的,則不會參與叢集選舉,知道該節點連上一個master, 然後從其同步過完整的資料後,才具有選舉權 ,之所以這麼做的原因是。萬一誰不小心刪了資料檔案,這個時候重啟該節點,如果執行該節點參與選舉,要是該節點被選成master, 會導致怎個叢集資料丟失。
但第一次啟動叢集,大家確實都沒資料,如果都沒有選舉權的話,第一次選舉就不會進行,所以要在data 目錄下建立一個initialize檔案,暫時遮蔽調3.6.0的資料丟失保護功能。叢集啟動,正常選舉後,該檔案會被刪除,進入資料丟失的保護機制
配置檔案
一般可直接配置zk髮型包conf下的zoo.cfg檔案
tickTime=2000
dataDir=/var/lib/zookeeper/data
dataLogDir=/var/lib/zookeeper/log #預設dataLogDir和dataDir在一起,最好將其分開,以提高zk效能。因為同時寫資料和日誌到一個磁碟,磁碟會有些瓶頸限制
autopurge.purgeInterval=1 #開啟定期清理功能,以免資料和日誌檔案過大
autopurge.snapRetainCount=1000
clientPort=2181 #zk叢集對外提供服務的埠
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888 #"server.1"中的1,即是該機器在資料資料夾中配置的myid。 zoo1,zoo2,zoo3是zk叢集的節點hostname或ip。 2888是follower用來跟leader通訊的埠,3888是用來選舉leader的埠
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
影響效能的點
資料盤獨立
磁碟的讀寫效能會嚴重影響到zk的效能。所以儘量將zk的資料儲存目錄防止帶單獨的磁碟。有條件的話,將其日誌檔案路徑也放置到單獨磁碟。同其它程式共用一個磁碟,當磁碟讀寫效能出現瓶頸時,zk的效能會急速下降
記憶體不要超機器限制
當zk申請的記憶體超過作業系統的空閒記憶體,那麼作業系統會啟用swap機制,即利用硬碟做為交換記憶體。這也將嚴重影響zk的效能。所以如果系統有4g記憶體,那麼zk申請記憶體最好小於等於3G。
兩種啟動方式
使用自帶指令碼
在bin下 ./zkServer.sh start
該zkServer.sh會首先執行zkEnv.sh
zkEnv.sh中有整個zk執行相關環境變數設定,從zkEnv.sh程式碼中可以看到
if [ -f "${ZOOCFGDIR}/zookeeper-env.sh" ]; then
. "${ZOOCFGDIR}/zookeeper-env.sh"
fi
if [ "x$ZOOCFG" = "x" ]
then
ZOOCFG="zoo.cfg"
fi
ZOOCFG="$ZOOCFGDIR/$ZOOCFG"
if [ -f "$ZOOCFGDIR/java.env" ]
then
. "$ZOOCFGDIR/java.env"
fi
它回去zk配置目錄,也即CONF中找zookeeper-env.sh,和java.env。所以我們可以將相關的環境變數設定到這兩個檔案中(沒有就建立)
.env檔案其實跟shell差不多,啟動定義的環境變數格式為key=value
,最終生效,通過執行該檔案,或者source 它都可以。
從zkEnv.sh中還可以得出的資訊是,要設定zk server端的記憶體佔用大小,是通過ZK_SERVER_HEAP
來,因為zkEnv.sh有如下程式碼
# default heap for zookeeper server
ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-1000}"
export SERVER_JVMFLAGS="-Xmx${ZK_SERVER_HEAP}m $SERVER_JVMFLAGS"
當然其它一些-D的java 引數, 可以設定到這個變數上SERVER_JVMFLAGS
使用java 命令
上述指令碼實際上最終入口,是執行了zookeeper的jar。我們當然也可以直接通過java命令啟動zookeeper的jar,並加裝指定配置
java -cp zookeeper.jar:lib/*:conf org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.conf
參考資料
https://zookeeper.apache.org/doc/r3.6.1/zookeeperAdmin.html#sc_zkMulitServerSetup