本安裝教程,採用zookeeper 3.6.1html
3.6.0的zk,在啓動後,若是發現本身的data 目錄是空的,則不會參與集羣選舉,知道該節點連上一個master, 而後從其同步過完整的數據後,才具備選舉權 ,之因此這麼作的緣由是。萬一誰不當心刪了數據文件,這個時候重啓該節點,若是運行該節點參與選舉,要是該節點被選成master, 會致使怎個集羣數據丟失。java
但第一次啓動集羣,你們確實都沒數據,若是都沒有選舉權的話,第一次選舉就不會進行,因此要在data 目錄下建立一個initialize文件,暫時屏蔽調3.6.0的數據丟失保護功能。集羣啓動,正常選舉後,該文件會被刪除,進入數據丟失的保護機制shell
通常可直接配置zk髮型包conf下的zoo.cfg文件apache
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
2015-07-02 21:06:01,682 [myid:] - ERROR [main:QuorumPeerMain@86] - Invalid config, exiting abnormally org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Address unresolved: Master.Hadoop:3888 at org.apache.zookeeper.server.quorum.QuorumPeer$QuorumServer.<init>(QuorumPeer.java:205) at org.apache.zookeeper.server.quorum.flexible.QuorumMaj.<init>(QuorumMaj.java:89) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.createQuorumVerifier(QuorumPeerConfig.java:401) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseDynamicConfig(QuorumPeerConfig.java:425) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:291) at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:126) at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:110) at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79) Invalid config, exiting abnormally
這種錯誤是由於配置文件,端口號後面有空格,去掉空格就能夠了oop
磁盤的讀寫性能會嚴重影響到zk的性能。因此儘可能將zk的數據存儲目錄防止帶單獨的磁盤。有條件的話,將其日誌文件路徑也放置到單獨磁盤。同其它程序共用一個磁盤,當磁盤讀寫性能出現瓶頸時,zk的性能會急速降低性能
當zk申請的內存超過操做系統的空閒內存,那麼操做系統會啓用swap機制,即利用硬盤作爲交換內存。這也將嚴重影響zk的性能。因此若是系統有4g內存,那麼zk申請內存最好小於等於3G。flex
在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 它均可以。code
從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
上述腳本實際上最終入口,是執行了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