本文簡要說明了如何在Docker容器中啟動和配置Zookeeper。
1 准備工作
1.1 下載zookeeper鏡像
$ docker pull zookeeper:3.4
1.2 單點模式
- 安裝Docker CE
1.3 集群模式
-
安裝Docker EE
-
創建一個名為zk-overlay的network
$ docker network create -d overlay zk-overlay
2 啟動Zookeeper
2.1 單點模式啟動
$ docker run --name some-zookeeper --restart always -d zookeeper:3.4
啟動后會EXPOSE端口:2181, 2888, 3888。並設置為始終重啟。
2.2 集群模式啟動
a, 編寫集群啟動文件zk-stack.yml:
version: '3.1'
services:
zoo1:
image: zookeeper:3.4
networks:
zk-overlay:
aliases:
- zoo1
restart: always
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo2:
image: zookeeper:3.4
networks:
zk-overlay:
aliases:
- zoo2
restart: always
hostname: zoo2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888
zoo3:
image: zookeeper:3.4
networks:
zk-overlay:
aliases:
- zoo3
restart: always
hostname: zoo3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888
networks:
zk-overlay:
external:
name: zk-overlay
b, 創建一個overlay網絡
$ docker network create --attachable -d overlay zk-overlay
注意要添加參數--attachable,否則之后創建的客戶端容器無法加入這個網絡。
c, 在Swarm Manager主機上運行
$ docker stack deploy -c zk-stack.yml some-zookeeper
3個zookeeper服務器容器將以swarm的復制模式啟動 。端口2181-2183將對外暴露。
c, 查看集群狀態
登錄到運行Zookeeper容器的主機,查看容器id
$ docker ps | grep zookeeper
# zk容器列表
8d5b86f4bb18 zookeeper:3.4 "/docker-entrypoin..." 3 hours ago Up 3 hours 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp some-zookeeper_zoo1_1
a614e3211de7 zookeeper:3.4 "/docker-entrypoin..." 3 hours ago Up 3 hours 2888/tcp, 3888/tcp, 0.0.0.0:2182->2181/tcp some-zookeeper_zoo2_1
進入zk容器
$ docker exec -it <container id> bash
查看zk狀態
$ zkServer.sh status
# 狀態信息
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: leader # 是顯示leader或者follower
3 配置Zookeeper
3.1 配置文件
Zookeeper配置位於/conf。更改它的一種方法是將配置文件作為卷安裝:
$ docker run --name some-zookeeper --restart always -d -v $(pwd)/zoo.cfg:/conf/zoo.cfg zookeeper:3.4
3.2 環境變量
如果zoo.cfg未提供文件,則使用ZooKeeper推薦的默認值。可以使用以下環境變量覆蓋它們。
$ docker run -e "ZOO_INIT_LIMIT=10" --name some-zookeeper --restart always -d zookeeper:3.4
ZOO_TICK_TIME
默認為2000。zk的tickTime,以毫秒為單位。
ZK中所有時間都是以這個時間單元為基礎,進行整數倍配置。
ZOO_INIT_LIMIT
默認為5。zk的initLimit。
Zookeeper等待客戶端初始化連接的響應時,最長能等待多少個tickTime。例如默認設置為 5,表示超過5個心跳的時間(也就是ZOO_TICK_TIME)長度后 ,Zookeeper 服務器還沒有收到客戶端的返回信息,就認為這個客戶端連接失敗。總的超時時間等於ZOO_INIT_LIMITZOO_TICK_TIME=52000=10000毫秒
ZOO_SYNC_LIMIT
默認為2。zk的syncLimit
Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime。例如默認設置為2,表示超過2個心跳的時間(也就是ZOO_TICK_TIME)長度后 ,Leader 與 Follower通信超時。
ZOO_MAX_CLIENT_CNXNS
默認為60。zk的maxClientCnxns
單個客戶端與單台zk服務器之間的連接數的限制,是ip級別的,如果設置為0,那么表明不作任何限制。
3.3 復制模式
如果要以復制模式運行Zookeeper,則必須使用下面的環境變量。
ZOO_MY_ID
id必須在整體中是唯一的,並且應該具有介於1和255之間的值。請注意,如果使用/data已包含該myid文件的目錄啟動容器,則此變量不會產生任何影響。
ZOO_SERVERS
此變量允許您指定Zookeeper集合的計算機列表。每個條目都有server.id=host:port:port。參賽作品以空格分隔。請注意,如果使用/conf已包含該zoo.cfg文件的目錄啟動容器,則此變量不會產生任何影響。
3.4 數據的存儲位置
/data和/datalog分別用來保存內存數據庫的快照和更新數據庫的事務日志。
放置事務日志的位置要考慮對性能的影響。專用的事務日志設備保持良好性能的關鍵。將日志置於繁忙的設備上會對性能產生負面影響。
生產環境中zookeeper的數據文件需要保證持久性,可通過掛載數據目錄到Gluster FS Volume。
4 連接Zookeeper
4.1 單點模式
前提:單點模式啟動一個名為some-zookeeper的zookeeper服務器容器。
從一個Zookeeper客戶端容器的命令行連接到Zookeeper服務器容器:
$ docker run -it --rm --link some-zookeeper:zookeeper zookeeper:3.4 zkCli.sh -server zookeeper
注意:
- 參數--link后的some-zookeeper要和zookeeper服務器容器的名稱一致;
- 參數-server zookeeper是固定寫法,無需改動。
4.2 集群模式
前提:集群模式啟動一組zookeeper服務器容器。
從一個Zookeeper客戶端容器的命令行連接到Zookeeper服務器容器:
$ docker run -it --rm --network zk-overlay --link zoo1:zookeeper zookeeper:3.4 zkCli.sh -server zookeeper
注意:
- 參數--network后的zk-overlay要和zookeeper集群的網絡一致;
- 參數--link后的zoo1,要和集群啟動文件中的參數hostname: zoo1保持一致;
- 參數-server zookeeper是固定寫法,無需改動。