困而學,學而知
最近在學習Zookeeper, 既然要學習Zookeeper,首先要需要搭建一個Zookeeper的環境.這裡隻講怎麼搭建,不會具體說具體原理.
我最開始搭建的是隻有一個執行個體的Zookeeper服務. 然後開始搭建一個單機僞叢集(因為我隻有一台主機). 在搭建隻有一個執行個體的Zookeeper執行個體的服務的時候,我是使用docker來搭建的. 本來也是想用docker來搭建這個僞叢集的,但是我嘗試了一天, 始終都報錯,并且都沒有找到原因…(也是心累)算了,還是用最簡單的方式來搭建了單機僞叢集.
搭建隻有一個執行個體的Zookeeper服務是很簡單的.
一. 使用docker搭建Zookeeper服務
1. 在 docker hub
上找到 zookeeper
的官方鏡像, 并拉取官方鏡像.
docker hub
zookeeper
docker pull zookeeper
之前拉取過鏡像, 就截圖鏡像清單啦.
2. 啟動Zookeeper鏡像, 将容器的2181映射到主機的2181端口
docker run --privileged=true -d --name myzk --publish 2181:2181 -d zookeeper
3. 來檢視啟動日志
> docker logs -f myzk
--------------------------------
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
2019-07-01 16:38:15,150 [myid:] - INFO [main:[email protected]] - Reading configuration from: /conf/zoo.cfg
...
2019-07-01 16:38:15,365 [myid:1] - INFO [main:[email protected]] - binding to port /0.0.0.0:2181
2019-07-01 16:38:15,387 [myid:1] - INFO [main:[email protected]] - zookeeper.snapshotSizeFactor = 0.33
2019-07-01 16:38:15,391 [myid:1] - INFO [main:[email protected]] - Snapshotting: 0x0 to /data/version-2/snapshot.0
2019-07-01 16:38:15,396 [myid:1] - INFO [main:[email protected]] - Snapshotting: 0x0 to /data/version-2/snapshot.0
2019-07-01 16:38:15,418 [myid:1] - INFO [main:[email protected]] - Using checkIntervalMs=60000 maxPerMinute=10000
4. Zookeeper是有一個用戶端的, 我們可以使用 --link
來連結到容器的用戶端
--link
docker run -it --rm --link myzk:zookeeper zookeeper zkCli.sh -server zookeeper
至此, 我使用
docker
搭建了一個隻有一個執行個體的Zookeeper服務. 在這個過程中沒有報錯十分順利. 想着一鼓作氣使用docker來搭建一個僞叢集(友鍊: 使用 Docker 一步搞定 ZooKeeper 叢集的搭建),但是總是事與願違, 搞了一天都沒有搞出來, 氣煞我也,換成了最簡單的方式來搭建叢集.
二. 使用官方包來搭建Zookeeper服務
首先當然是要從官網下載下傳包啦.Download
這裡我想說一句,我本來是下載下傳最新版本3.5.5的,但是運作的時候居然報錯, 後面會講講報錯情況.
- 将zookeeper-3.4.14.tar.gz解壓到檔案夾(我的是/usr/local/apache/zookeeper)
- 進入解壓目錄下的
檔案夾, 使用conf/
, 建立一個cp zoo_sample.cfg zoo.cfg
配置檔案.因為Zookeeper的預設配置檔案就是這個zoo.cfg
這個檔案zoo.cfg
- 後退進入解壓目錄下的
檔案夾, 使用bin/
啟動Zookeeper檔案.sh zkServer.sh start
- 繼續在
目錄下,可以中bin/
使用用戶端sh zkCli.sh
- 最後使用結束後, 用
關閉Zookeeper.sh zkServer.sh stop
三. 搭建Zookeeper單機僞叢集
因為本人隻有一台主機, 想想要搭建一個最少三台的Zookeeper叢集,還是算了吧.但條條大路通羅馬, 事情總是有解決辦法的. 我的解決的辦法就是在一個單機上通過不同的端口搭建一個僞叢集.
1. 建立檔案夾
為了搭建一個僞叢集, 我們現在本地目錄下建立三個目錄. 我的是在
/usr/local/apache/zookeeper
我們在
/usr/local/apache/zookeeper
這個目錄下建立一個
tmp
的目錄用于儲存Zookeeper的data和log.
## /usr/local/apache/zookeeper
mkdir tmp
cd tmp
## 在tmp目錄下建立`zk1/data`, `zk1/log`, `zk2/data`, `zk2/log`, `zk3/data`, `zk3/log`
mkdir zk1 zk2 zk3
mkdir zk1/data zk1/log zk2/data zk2/log zk3/data zk3/log
2. 解壓zookeeper-3.4.14.tar.gz
進入到存有
zookeeper-3.4.14.tar.gz
的目錄, 執行下面的指令
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xvf zookeeper-3.4.14.tar.gz -C /usr/local/apache/zookeeper/
cd /usr/local/apache/zookeeper/
cp -rf zookeeper-3.4.14 zookeeper-1
cp -rf zookeeper-3.4.14 zookeeper-2
cp -rf zookeeper-3.4.14 zookeeper-3
rm -rf zookeeper-3.4.14
3. 配置zoo.cfg
進入上面圖檔中的
conf/
目錄下
cp zoo_sample.cfg zoo.cfg
将下面的内容複制到zoo.cfg中
3.1. zookeeper-1下的zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/apache/zookeeper/tmp/zk1/data
dataLogDir=/usr/local/apache/zookeeper/tmp/zk1/log
clientPort=2181
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
3.2. zookeeper-2下的zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/apache/zookeeper/tmp/zk2/data
dataLogDir=/usr/local/apache/zookeeper/tmp/zk2/log
clientPort=2182
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
3.3. zookeeper-3下的zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/apache/zookeeper/tmp/zk3/data
dataLogDir=/usr/local/apache/zookeeper/tmp/zk3/log
clientPort=2183
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
4. 建立myid檔案
這個配置很重要, 要配置叢集的話,就必須要配置. 在
zoo.cfg
中配置了
dataDir
.在
dataDir
的目錄下, 建立一個
myid
的檔案, 檔案内容為叢集
id
. 比如
zookeeper-1
下的
myid
内容就是
1
,
zookeeper-2
下的
myid
内容就是
2
,
zookeeper-3
下的
myid
内容就是
3
.
5. 啟動叢集
現在配置好了,直接啟動就好了.
/usr/local/apache/zookeeper/zookeeper-1/bin/zkServer.sh start
/usr/local/apache/zookeeper/zookeeper-2/bin/zkServer.sh start
/usr/local/apache/zookeeper/zookeeper-3/bin/zkServer.sh start
5.1. 檢視狀态
/usr/local/apache/zookeeper/zookeeper-1/bin/zkServer.sh status
6. 關閉叢集
/usr/local/apache/zookeeper/zookeeper-1/bin/zkServer.sh stop
/usr/local/apache/zookeeper/zookeeper-2/bin/zkServer.sh stop
/usr/local/apache/zookeeper/zookeeper-3/bin/zkServer.sh stop
一個一個啟動太麻煩了, 我建立了兩個簡單的腳本
startZookeeper.sh
和
stopZookeeper.sh
- startZookeeper.sh
/usr/local/apache/zookeeper/zookeeper-1/bin/zkServer.sh start
/usr/local/apache/zookeeper/zookeeper-2/bin/zkServer.sh start
/usr/local/apache/zookeeper/zookeeper-3/bin/zkServer.sh start
- stopZookeeper.sh
/usr/local/apache/zookeeper/zookeeper-1/bin/zkServer.sh stop
/usr/local/apache/zookeeper/zookeeper-2/bin/zkServer.sh stop
/usr/local/apache/zookeeper/zookeeper-3/bin/zkServer.sh stop
四. 問題記錄
1. 錯誤: 找不到或無法加載主類 org.apache.zookeeper.server.quorum.QuorumPeerMain
問題: 我使用
zookeeper-3.5.5.tar.gz
的時候, 發現啟動不起來, 每次啟動都是報這個錯誤. 在網上查閱資料發現是少了jar包, 進入目錄一看,發現果然沒有jar包. 重新下了一次也沒有, 我就果斷換成了
zookeeper-3.4.14.tar.gz
這個版本.
2. 使用docker安裝時候,報錯 as it does not belong to the default network.
as it does not belong to the default network.
檢視目前的
network
或
最後宣傳一下自己無人問津的個人網站http://meisen.pro