本文简要说明了如何在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
注意: