Docker搭建Zookeeper集群(神器)

大家好,我是程序員小羅,這是我的技術(shù)學(xué)習(xí)筆記。

起因

由于最近在學(xué)習(xí)zookeeper的原理,所以需要在安裝一個集群來實驗一些特性加深理解。

但是問題來了,我們作為個人學(xué)習(xí)者,要搭建集群又沒有那么多機器,要么就是搭建偽集群,或者就是需要安裝一個虛擬機軟件(比如vmWare),裝多個虛擬機。 這兩種方法我之前都試過,都不太理想,一個需要改端口,一種需要安裝很多虛擬機,而且換了電腦也不好遷移。每次都得搞重復(fù)的配置,實現(xiàn)是太令人煩惱了;

目標

綜上,上述的痛點,都不是我們愿意做的。接下來,就要介紹今天我用的神器:Docker 。

使用Docker 基本上不用我們裝環(huán)境之類的配置,比如安裝 jdk?,F(xiàn)在我們直接可以從鏡像倉庫拉別人制作好的鏡像,簡直不要太方便,直接運行即可。

今天我要搭建的是一個由四臺 zk 構(gòu)成的 zk 集群,其中一臺為 Leader,兩臺 Follower,一臺 Observer。

talk is cheap,show me your code, 接著往下看吧!


實戰(zhàn)

不管你現(xiàn)在用的windows 還是linux 系統(tǒng),首先你需要安裝好Docker環(huán)境。 這里就不在敘述了,官網(wǎng)下載安裝即可。

如果對Docker 基本操作不熟悉的話,可以看我之前寫的 Docker入門(鏡像、容器、倉庫)

PS: 本次所制作的鏡像,可以直接保存到自己的私服,以后隨時隨地直接拉取運行即可。一次制作,到處運行。

私服的搭建也可以看我之前寫的Docker入門。

獲取鏡像

docker pull zookeeper:3.4.11 這里我選擇了3.4.11 版本。

設(shè)置docker固定ip

因為我們要搭建的是集群環(huán)境,所以ip地址必須固定,因此需要自定義一種網(wǎng)絡(luò)類型。

創(chuàng)建自定義網(wǎng)絡(luò)類型,并且指定網(wǎng)段

sudo docker network create --subnet=192.168.0.0/24 staticnet

通過docker network ls可以查看到網(wǎng)絡(luò)類型中多了一個 staticnet

使用新的網(wǎng)絡(luò)類型創(chuàng)建并啟動容器

chong@L MINGW64 ~
$ docker run --name zookeeper-1 --restart always --net staticnet --ip 192.168.0.10 -d zookeeper:3.4.11
61a331b2584b6ef949e2183892c5a73a2e214b7071d4879993f7cbba41c836ed

通過docker inspect可以查看容器 ip為192.168.0.10,關(guān)閉容器并重啟,發(fā)現(xiàn)容器ip并未發(fā)生改變。

進入容器進行配置

由于容器在后臺運行,因此我們需要進入容器,有三種方式,有興趣的可以看我之前寫的 Docker入門(鏡像、容器、倉庫)

$ docker exec -ti 61a bash   # 61a為容器id

登入后,我們只需要做2件事:

  1. 修改zoo.cfg

在 zoo.cfg 文件中添加 zk 集群節(jié)點列表

bash-4.4# vi /conf/zoo.cfg
clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
maxClientCnxns=60
server.1=192.168.0.10:2888:3888
server.2=192.168.0.11:2888:3888
server.3=192.168.0.12:2888:3888
server.4=192.168.0.13:2888:3888:observer

  1. 創(chuàng)建 myid 文件

在一步的zoo.cfg文件中我們可以看到dataDir的路徑,在/data 目錄中創(chuàng)建表示當前主機編號的 myid 文件。該主機編號要與 zoo.cfg 文件中設(shè)置的編號一致。

bash-4.4# echo 1 > /data/myid

保存修改后的鏡像

因為我們上面對正在運行的容器做了三點修改,這也正是我們需要的集群配置,所以我們要將這個容器制作成鏡像,如下操作:

$ docker commit -m "create zk1" -a "coderluo" 61a zookeeper-1:3.4.11
sha256:455b27d32c83365790b7b6eff7d58021556858390d28d27b07aca206e83c507c

chong@L MINGW64 ~
$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
zookeeper-1                  3.4.11              455b27d32c83        8 seconds ago       146MB
39.108.186.135:5000/ubuntu   v1                  a2a15febcdf3        13 days ago         64.2MB
zookeeper                    3.4.11              56d414270ae3        19 months ago       146MB

使用docekr commit 進行基于已有的鏡像進行創(chuàng)建,我的上一篇Docker入門中也有寫。然后通過docker images 查看到zookeeper-1 這個鏡像已經(jīng)存在了。

到這里一臺鏡像已經(jīng)制作好了,接下來就是一樣的事情重復(fù)干幾遍:

  • 進入容器
  • 修改myid
  • 保存修改制作為新鏡像

查詢?nèi)萜鱥d

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
61a331b2584b        zookeeper:3.4.11    "/docker-entrypoint.…"   About an hour ago   Up 12 minutes       2181/tcp, 2888/tcp, 3888/tcp   zookeeper-1

進入容器執(zhí)行修改(第2,3臺都執(zhí)行此操作):

$ docker exec -ti 61a bash
bash-4.4# echo 2 > /data/myid
bash-4.4# cat /data/myid
2
bash-4.4# exit
exit

創(chuàng)建新的鏡像(第2,3臺都執(zhí)行此操作):

$ docker commit -m "create zookeeper-2" -a "coderluo" 61a zookeeper-2:3.4.11
sha256:c775aff13fd3b2fc30066f6fc5f8a5ee429be3052b790c8e02cf74b5e4bf71e9

完成后,這里要注意,第四臺主機因為我們要讓他作為Observer,所以他需要在zoo.cfg中增加一行配置:

peerType=observer

1.png

然后在執(zhí)行上面和第2,3臺機器一樣的操作。

最后我們查看當前所有的鏡像,不出意外的話下圖展示的你也都有了:

2.png

到這里,今天的學(xué)習(xí)就要接近尾聲了,最后一步

依次啟動4臺zookeeper實例

直接按照我下面的命令一次執(zhí)行即可:

chong@L MINGW64 ~
$  docker run --name zookeeper-1 --restart always --net staticnet --ip 192.168.0.10 -d zookeeper-1:3.4.11 #第一臺
35acd4f798c8154047f30af184145d8b4124ec8a4e8e4a549db0d333a1c33785
chong@L MINGW64 ~
$  docker run --name zookeeper-2 --restart always --net staticnet --ip 192.168.0.11 -d zookeeper-2:3.4.11 #第二臺
7ef30c809183dc223e42e891880ad8c85381fac11d15da5c0455400b915c77bb

chong@L MINGW64 ~
$  docker run --name zookeeper-3 --restart always --net staticnet --ip 192.168.0.12 -d zookeeper-3:3.4.11 #第三臺
f138451dd21ce5217eb6e4472116b3ffa32e9ea2afbcaae44ee4d633040299f9
chong@L MINGW64 ~
$  docker run --name zookeeper-4 --restart always --net staticnet --ip 192.168.0.13 -d zookeeper-4:3.4.11 #第四臺
c662d3438db74414c9b0178bc756b6cf96cd0458cbc226e8854da4a06337d656

查看運行狀態(tài):

$ docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED              STATUS              PORTS                          NAMES
c662d3438db7        zookeeper-4:3.4.11   "/docker-entrypoint.…"   6 seconds ago        Up 4 seconds        2181/tcp, 2888/tcp, 3888/tcp   zookeeper-4
f138451dd21c        zookeeper-3:3.4.11   "/docker-entrypoint.…"   24 seconds ago       Up 23 seconds       2181/tcp, 2888/tcp, 3888/tcp   zookeeper-3
7ef30c809183        zookeeper-2:3.4.11   "/docker-entrypoint.…"   41 seconds ago       Up 39 seconds       2181/tcp, 2888/tcp, 3888/tcp   zookeeper-2
35acd4f798c8        zookeeper-1:3.4.11   "/docker-entrypoint.…"   About a minute ago   Up About a minute   2181/tcp, 2888/tcp, 3888/tcp   zookeeper-1

總結(jié)

至此我們今天要搭建的四臺zk實例組成的集群已經(jīng)搞定了,有沒有感覺到有了Docker 簡直是神奇啊,只有親身體會下才能感覺他的便利。

歡迎在留言區(qū)討論,今天就到這里啦,可以愉快的學(xué)習(xí)第zk的底層原理了。

Docker 入門基礎(chǔ)知識,可以看我整理的這篇文章:

Docker入門(鏡像、容器、倉庫)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容