ZooKeeper 是 Apache 的一個頂級項目,爲分佈式應用提供高效、高可用的分佈式協調服務,提供了諸如數據發佈/訂閱、負載均衡、命名服務、分佈式協調/通知和分佈式鎖等分佈式基礎服務。 因爲 ZooKeeper 便捷的使用方式、卓越的性能和良好的穩定性,被普遍地應用於諸如 Hadoop、HBase、Kafka 和 Dubbo 等大型分佈式系統中。node
Zookeeper 有三種運行模式:單機模式
、僞集羣模式
和集羣模式
。這裏咱們以集羣模式
爲例進行介紹。 集羣模式最重要的一點是,只要集羣中存在超過一半的機器可以正常工做,那麼整個集羣就可以正常對外服務。正是基於這個特性,要將 ZK 集羣的節點數量要爲奇數
(2n+1:如 三、五、7 個節點)較爲合適。apache
下載 zookeeper-3.4.12.tar.gz
到指定目錄:服務器
wget -P /home/{$user}/software https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/
複製代碼
解壓到安裝目錄session
tar -zxvf zookeeper-3.4.12.tar.gz -C /home/{$user}/zookeeper
複製代碼
在各 zookeeper 節點目錄下建立如下目錄:數據結構
cd /home/{$user}/zookeeper/zookeeper-3.4.12
mkdir data
mkdir logs
複製代碼
在各服務器節點(server-01
、server-02
、server-03
)的 dataDir 目錄下建立名爲 myid 的文件,在文件第一行寫上對應的 Server id。這個id必須在集羣環境中服務器標識中是惟一的,且大小在1~255之間。app
server-01:
echo "1" > myid
server-02:
echo "2" > myid
server-03:
echo "3" > myid
複製代碼
將 zookeeper-3.4.12/conf 目錄下的 zoo_sample.cfg 文件拷貝一份,命名爲 zoo.cfg
負載均衡
cp zoo_sample.cfg zoo.cfg
複製代碼
修改zoo.cfg
配置文件 (3臺機器都須要,能夠先配置好一臺,而後經過 scp 等命令複製到其它服務器節點)tcp
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/{$user}/zookeeper/zookeeper-3.4.12/data
dataLogDir=/home/{$user}/zookeeper/zookeeper-3.4.12/logs
autopurge.snapRetainCount=10
autopurge.purgeInterval=1
clientPort=2181
server.1=IP1:2881:3881
server.2=IP2:2882:3882
server.3=IP3:2883:3883
複製代碼
參數說明:分佈式
tickTime=2000
Zookeeper最小時間單元,單位爲ms
,默認值爲3000。也就是Leader與Follower每隔tickTime時間就會發送一個心跳。
initLimit=10
Leader服務器等待Follower啓動並完成數據同步的時間,默認值10。 當已經超過10*tickTime後,Leader尚未收到Follower的返回信息,那麼代表這個Follower鏈接或同步失敗。
syncLimit=5
Leader服務器和Follower之間進行心跳檢測的最大延時時間,默認值5,最長不能超過5*tickTime
dataDir=/home/{$user}/zookeeper/zookeeper-3.4.12/data
存放內存數據結構的snapshot,便於快速恢復,默認狀況下,事務日誌也會存儲在這裏。建議同時配置參數dataLogDir, 事務日誌的寫性能直接影響zk性能。
dataLogDir=/home/{$user}/zookeeper/zookeeper-3.4.12/data
dataLogDir事務日誌輸出目錄。爲了達到性能最大化,通常建議把dataDir和dataLogDir分到不一樣的磁盤上,這樣就能夠充分利用磁盤順序寫的特性。
autopurge.purgeInterval, autopurge.snapRetainCount
客戶端在與zookeeper交互過程當中會產生很是多的日誌,並且zookeeper也會將內存中的數據做爲snapshot保存下來,這些數據是不會被自動刪除的,這樣磁盤中這樣的數據就會愈來愈多。不過能夠經過這兩個參數來設置,讓zookeeper自動刪除數據。
autopurge.purgeInterval:指定自動清理快照文件和事務日誌文件的時間,單位爲h
,默認爲0
表示不自動清理,這個時候可使用腳本zkCleanup.sh手動清理。若是不清理則磁盤空間佔用愈來愈大。
autopurge.snapRetainCount:用於指定保留快照文件和事務日誌文件的個數,默認爲3。
不過若是你的集羣是一個很是繁忙的集羣,而後又碰上這個刪除操做,可能會影響zookeeper集羣的性能,因此通常會讓這個過程在訪問低谷的時候進行,可是遺憾的是zookeeper並無設置在哪一個時間點運行的設置,因此有的時候咱們會禁用這個自動刪除的功能,而在服務器上配置一個cron,而後在凌晨來幹這件事。
clientPort=2181
顧名思義,就是客戶端鏈接zookeeper服務的端口。這是一個TCP port。
server.id
=IP/Host
: port1
: port2
id:用來配置ZK集羣中的各節點,並建議id的值和myid保持一致。
IP/Host: 服務器的 IP 或者是與 IP 地址作了映射的主機名
port1:Leader和Follower或Observer交換數據使用
port2:用於Leader選舉
注意
:若是是僞集羣的配置方式,不一樣的 Zookeeper 實例通訊端口號不能同樣,因此要給它們分配不一樣的端口號。
maxClientCnxns
對於一個客戶端的鏈接數限制,默認是60,這在大部分時候是足夠了。
可是在咱們實際使用中發現,在測試環境常常超過這個數,通過調查發現有的團隊將幾十個應用所有部署到一臺機器上,以方便測試,因而這個數字就超過了
minSessionTimeout, maxSessionTimeout
通常,客戶端鏈接zookeeper的時候,都會設置一個session timeout,若是超過這個時間client沒有與zookeeper server有聯繫,則這個session會被設置爲過時(若是這個session上有臨時節點,則會被所有刪除,這就是實現集羣感知的基礎,後面的文章會介紹這一點)。
可是這個時間不是客戶端能夠無限制設置的,服務器能夠設置這兩個參數來限制客戶端設置的範圍。
在防火牆中打開要用到的端口 218一、288一、3881
切換到 root 用戶權限,執行如下命令:
chkconfig iptables on
service iptables start
複製代碼
編輯/etc/sysconfig/iptables
vi /etc/sysconfig/iptables
複製代碼
如server-01 增長如下 3 行:
## zookeeper
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2881 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3881 -j ACCEPT
複製代碼
重啓防火牆:
service iptables restart
複製代碼
查看防火牆端口狀態:
service iptables status
複製代碼
若是使用普通用戶啓動則到 /home/{$user}/zookeeper/node-0X/bin 目錄中執行:
./zkServer.sh start
複製代碼
顯示:
ZooKeeper JMX enabled by default
Using config: /home/{$user}/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
複製代碼
輸入 jps 命令查看進程:
jps
複製代碼
顯示:
xxxx QuorumPeerMain
複製代碼
其中,QuorumPeerMain 是 zookeeper 進程,說明啓動成功。
查看狀態:
./zkServer.sh status
複製代碼
顯示:
ZooKeeper JMX enabled by default
Using config: /home/{$user}/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: leader(或者follower)
複製代碼
查看 zookeeper 服務輸出信息:
服務信息輸出文件在/home/{$user}/zookeeper/zookeeper-3.4.12/bin/zookeeper.out
tailf zookeeper.out
複製代碼
./zkServer.sh stop
複製代碼
編輯 server-0一、sersver-0二、server-03 中的 /etc/rc.d/rc.local
文件,分別加入:
export JAVA_HOME={$JAVA_HOME}
su - {$user} -c '/home/{$user}/zookeeper/zookeeper-3.4.12/bin/zkServer.sh start'
複製代碼
登陸ZookeeperClient:
./zkCli.sh -server ip:port
複製代碼
ip: 能夠爲Leader,也能夠爲Follower的ip或主機名
port: 2181爲ZooKeerp提供的客戶端服務端口。
進入ZooKeeper命令行操做界面後,輸入help而後回車,能夠看到ZooKeeper支持的命令列表:
[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
複製代碼
zookeeper服務器會產生三類日誌:事務日誌、快照日誌和log4j日誌。
在zookeeper默認配置文件zoo.cfg(能夠修改文件名)中有一個配置項dataDir,該配置項用於配置zookeeper快照日誌和事務日誌的存儲地址。
在官方提供的默認參考配置文件zoo_sample.cfg中,只有dataDir配置項。其實在實際應用中,還能夠爲事務日誌專門配置存儲地址,配置項名稱爲dataLogDir,在zoo_sample.cfg中並未體現出來。在沒有dataLogDir配置項的時候,zookeeper默認將事務日誌文件和快照日誌文件都存儲在dataDir對應的目錄下。
建議將事務日誌(dataLogDir)與快照日誌(dataLog)單獨配置,由於當zookeeper集羣進行頻繁的數據讀寫操做是,會產生大量的事務日誌信息,將兩類日誌分開存儲會提升系統性能,並且,能夠容許將兩類日誌存在在不一樣的存儲介質上,減小磁盤壓力。
dataDir:存在一個文件夾version-2,該文件夾中保存着數據快照日誌文件。如:acceptedEpoch、currentEpoch dataLogDir:存在一個文件夾version-2,該文件夾中保存着事物日誌文件。如:log.*
log4j用於記錄zookeeper集羣服務器運行日誌,該日誌的配置地址在conf/目錄下的log4j.properties文件中,該文件中有一個配置項爲「zookeeper.log.dir=.」,表示log4j日誌文件在與執行程序zkServer.sh在同一目錄下。當執行zkServer.sh時,在該文件夾下會產生zookeeper.out日誌文件。
若是不作修改,默認zookeeper的日誌輸出信息都打印到了zookeeper.out文件中,這樣輸出路徑和大小無法控制,由於日誌文件沒有輪轉。因此須要修改日誌輸出方式。具體操做以下:
修改 ZOOKEEPER_HOME/bin/zkEnv.sh
將:
ZOO_LOG_DIR="."
改成:
ZOO_LOG_DIR="/home/{$user}/zookeeper/logs"
再修改下ZOO_LOG4J_PROP,讓日誌不是輸出到zookeeper.out,而是寫入到日誌文件
將:
ZOO_LOG4J_PROP="INFO,CONSOLE"
改成:
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
修改: ZOOKEEPER_HOME/conf/log4j.properties
若是按日誌文件大小輪轉,只需執行一步
zookeeper.root.logger=INFO,ROLLINGFILE
若是按照天輪轉,需執行如下兩步
1) log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
2) zkEnv.sh:註釋掉# log4j.appender.ROLLINGFILE.MaxFileSize=10MB
修改 /opt/zookeeper-3.4.6/bin/zkServer.sh(可選)
可不修改該文件,只是zk的啓動腳本默認用 nohup 啓動會生成一個zookeeper.out的空文件
若修改則執行如下兩步:
1) 註釋如下行:
#_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"
# nohup "$JAVA" "-Dzookeeper.log.dir.........
# -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN.........
複製代碼
2) 添加該行:
"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" &
複製代碼