本文簡要說明了如何在Docker容器中啓動和配置Zookeeper。docker
$ docker pull zookeeper:3.4
建立一個名爲zk-overlay的network數據庫
$ docker network create -d overlay zk-overlaybash
$ docker run --name some-zookeeper --restart always -d zookeeper:3.4
啓動後會EXPOSE端口:2181, 2888, 3888。並設置爲始終重啓。服務器
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
$ docker network create --attachable -d overlay zk-overlay
注意要添加參數--attachable,不然以後建立的客戶端容器沒法加入這個網絡。網絡
$ docker stack deploy -c zk-stack.yml some-zookeeper
3個zookeeper服務器容器將以swarm的複製模式啓動 。端口2181-2183將對外暴露。tcp
登陸到運行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狀態rest
$ zkServer.sh status # 狀態信息 ZooKeeper JMX enabled by default Using config: /conf/zoo.cfg Mode: leader # 是顯示leader或者follower
Zookeeper配置位於/conf。更改它的一種方法是將配置文件做爲卷安裝:日誌
$ docker run --name some-zookeeper --restart always -d -v $(pwd)/zoo.cfg:/conf/zoo.cfg zookeeper:3.4
若是zoo.cfg未提供文件,則使用ZooKeeper推薦的默認值。可使用如下環境變量覆蓋它們。
$ docker run -e "ZOO_INIT_LIMIT=10" --name some-zookeeper --restart always -d zookeeper:3.4
默認爲2000。zk的tickTime,以毫秒爲單位。
ZK中全部時間都是以這個時間單元爲基礎,進行整數倍配置。
默認爲5。zk的initLimit。
Zookeeper等待客戶端初始化鏈接的響應時,最長能等待多少個tickTime。例如默認設置爲 5,表示超過5個心跳的時間(也就是ZOO_TICK_TIME)長度後 ,Zookeeper 服務器尚未收到客戶端的返回信息,就認爲這個客戶端鏈接失敗。總的超時時間等於ZOO_INIT_LIMITZOO_TICK_TIME=52000=10000毫秒
默認爲2。zk的syncLimit
Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime。例如默認設置爲2,表示超過2個心跳的時間(也就是ZOO_TICK_TIME)長度後 ,Leader 與 Follower通訊超時。
默認爲60。zk的maxClientCnxns
單個客戶端與單臺zk服務器之間的鏈接數的限制,是ip級別的,若是設置爲0,那麼代表不做任何限制。
若是要以複製模式運行Zookeeper,則必須使用下面的環境變量。
id必須在總體中是惟一的,而且應該具備介於1和255之間的值。請注意,若是使用/data已包含該myid文件的目錄啓動容器,則此變量不會產生任何影響。
此變量容許您指定Zookeeper集合的計算機列表。每一個條目都有server.id=host:port:port。參賽做品以空格分隔。請注意,若是使用/conf已包含該zoo.cfg文件的目錄啓動容器,則此變量不會產生任何影響。
/data和/datalog分別用來保存內存數據庫的快照和更新數據庫的事務日誌。
放置事務日誌的位置要考慮對性能的影響。專用的事務日誌設備保持良好性能的關鍵。將日誌置於繁忙的設備上會對性能產生負面影響。
生產環境中zookeeper的數據文件須要保證持久性,可經過掛載數據目錄到Gluster FS Volume。
前提:單點模式啓動一個名爲some-zookeeper的zookeeper服務器容器。
從一個Zookeeper客戶端容器的命令行鏈接到Zookeeper服務器容器:
$ docker run -it --rm --link some-zookeeper:zookeeper zookeeper:3.4 zkCli.sh -server zookeeper
注意:
前提:集羣模式啓動一組zookeeper服務器容器。
從一個Zookeeper客戶端容器的命令行鏈接到Zookeeper服務器容器:
$ docker run -it --rm --network zk-overlay --link zoo1:zookeeper zookeeper:3.4 zkCli.sh -server zookeeper
注意: