單機模式
下載zookeeper的安裝包之后, 解壓到合適目錄. 進入zookeeper目錄下的conf子目錄, 創建zoo.cfg:
tickTime=2000 dataDir=/Users/apple/zookeeper/data dataLogDir=/Users/apple/zookeeper/logs clientPort=4180
參數說明:
- tickTime: zookeeper中使用的基本時間單位, 毫秒值.
- dataDir: 數據目錄. 可以是任意目錄.
- dataLogDir: log目錄, 同樣可以是任意目錄. 如果沒有設置該參數, 將使用和dataDir相同的設置.
- clientPort: 監聽client連接的端口號.
至此, zookeeper的單機模式已經配置好了. 啟動server只需運行腳本
bin/zkServer.sh start
Server啟動之后, 就可以啟動client連接server了, 執行腳本:
bin/zkCli.sh -server localhost:4180
偽集群模式
所謂偽集群, 是指在單台機器中啟動多個zookeeper進程, 並組成一個集群. 以啟動3個zookeeper進程為例.
將zookeeper的目錄拷貝3份:
- |--zookeeper0
- |--zookeeper1
- |--zookeeper2
更改zookeeper0/conf/zoo.cfg文件為:
tickTime=2000 initLimit=5 syncLimit=2 dataDir=/Users/apple/zookeeper0/data dataLogDir=/Users/apple/zookeeper0/logs clientPort=4180 server.0=127.0.0.1:8880:7770 server.1=127.0.0.1:8881:7771 server.2=127.0.0.1:8882:7772
新增了幾個參數, 其含義如下:
- initLimit: zookeeper集群中的包含多台server, 其中一台為leader, 集群中其余的server為follower. initLimit參數配置初始化連接時, follower和leader之間的最長心跳時間. 此時該參數設置為5, 說明時間限制為5倍tickTime, 即5*2000=10000ms=10s.
- syncLimit: 該參數配置leader和follower之間發送消息, 請求和應答的最大時間長度. 此時該參數設置為2, 說明時間限制為2倍tickTime, 即4000ms.
- server.X=A:B:C 其中X是一個數字, 表示這是第幾號server. A是該server所在的IP地址. B配置該server和集群中的leader交換消息所使用的端口. C配置選舉leader時所使用的端口. 由於配置的是偽集群模式, 所以各個server的B, C參數必須不同.
參照zookeeper0/conf/zoo.cfg, 配置zookeeper1/conf/zoo.cfg, 和zookeeper2/conf/zoo.cfg文件. 只需更改dataDir, dataLogDir, clientPort參數即可.
在之前設置的dataDir中新建myid文件, 寫入一個數字, 該數字表示這是第幾號server. 該數字必須和zoo.cfg文件中的server.X中的X一一對應.
/Users/apple/zookeeper0/data/myid文件中寫入0, /Users/apple/zookeeper1/data/myid文件中寫入1, /Users/apple/zookeeper2/data/myid文件中寫入2.
分別進入/Users/apple/zookeeper0/bin, /Users/apple/zookeeper1/bin, /Users/apple/zookeeper2/bin三個目錄, 啟動server.
任意選擇一個server目錄, 啟動客戶端:
bin/zkCli.sh -server localhost:4180
集群模式
集群模式的配置和偽集群基本一致.
由於集群模式下, 各server部署在不同的機器上, 因此各server的conf/zoo.cfg文件可以完全一樣.
下面是一個示例:
tickTime=2000 initLimit=5 syncLimit=2 dataDir=/home/zookeeper/data dataLogDir=/home/zookeeper/logs clientPort=4180 server.43=10.1.39.43:2888:3888 server.47=10.1.39.47:2888:3888 server.48=10.1.39.48:2888:3888
示例中部署了3台zookeeper server, 分別部署在10.1.39.43, 10.1.39.47, 10.1.39.48上. 需要注意的是, 各server的dataDir目錄下的myid文件中的數字必須不同.
10.1.39.43 server的myid為43, 10.1.39.47 server的myid為47, 10.1.39.48 server的myid為48.
重要配置說明
1、myid文件和server.myid 在快照目錄下存放的標識本台服務器的文件,他是整個zk集群用來發現彼此的一個重要標識。
2、zoo.cfg 文件是zookeeper配置文件 在conf目錄里。
3、log4j.properties文件是zk的日志輸出文件 在conf目錄里用java寫的程序基本上有個共同點日志都用log4j,來進行管理。
zkEnv.sh和zkServer.sh文件
但是可以通過命令去定期的清理。
第一種:
#!/bin/bash #snapshot file dir dataDir=/opt/zookeeper/zkdata/version-2 #tran log dir dataLogDir=/opt/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
第二種:對於上面這個執行,ZK自己已經寫好了腳本,在bin/zkCleanup.sh中,所以直接使用這個腳本也是可以執行清理工作的。
第三種:從3.4.0開始,zookeeper提供了自動清理snapshot和事務日志的功能,通過配置 autopurge.snapRetainCount 和 autopurge.purgeInterval 這兩個參數能夠實現定時清理了。這兩個參數都是在zoo.cfg中配置的:
./zkServer.sh status JMX enabled by default Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg #配置文件 Mode: follower #他是否為領導
zk集群一般只有一個leader,多個follower,主一般是相應客戶端的讀寫請求,而從主同步數據,當主掛掉之后就會從follower里投票選舉一個leader出來。
可以用“jps”查看zk的進程,這個是zk的整個工程的main #執行命令jps 20348 Jps 4233 QuorumPeerMain