容器化系列 - Zookeeper启动和配置 on Docker

本文简要说明了如何在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:
          - zoo2
    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, 在Swarm Manager主机上运行
$ docker stack deploy -c zk-stack.yml 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                                  rootcloudzookeeper_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                                  rootcloudzookeeper_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_LIMIT_ZOO_TICK_TIME=5_2000=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

4.2 集群模式

前提:集群模式启动一组zookeeper服务器容器。

从一个Zookeeper客户端容器的命令行连接到Zookeeper服务器容器:

$ docker run -it --rm --network rootcloudzookeeper_default --link zoo1:zookeeper zookeeper:3.4 zkCli.sh -server zookeeper

这里的--link参数后的zoo1,要和集群启动文件中的参数hostname: zoo1保持一致。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云原生架构实践

Jenkins 配置CI/CD任务

任务内容是部署/更新一个mysql数据库的容器,类似任务都在yourcompany-database任务视图下。

1675
来自专栏皮振伟的专栏

[kvm][qemu]CPU虚拟化

前言: 这里作者再次自不量力了,以一点微末的道行分析一下KVM的CPU虚拟化部分的代码。 分析: 1,分析具体代码逻辑之前,可以先使用strace大致看一下...

4407
来自专栏云极客Frey

腾讯云容器微服务API设计实践

本文会在腾讯云容器服务上面构造微服务基础小项目, 通过搭建ELK集群,实现利用Logstash 采集Nginx日志,收纳及利用kibana展示的功能。

2.5K22
来自专栏finleyMa

docker学习系列14 使用haproxy实现mysql集群的负载均衡

在上节中我们创建了 mysql 集群。 实际工作中,我们不希望让某一数据库节点处理所有的请求,这样的话单个负载高,性能差。

6892
来自专栏散尽浮华

centos下升级git版本的操作记录

在使用git pull、git push、git clone的时候,或者在使用jenkins发版的时候,可能会报类似如下的错误: error: The req...

3128
来自专栏实战docker

实战docker,构建nginx反向代理tomcat,学习link和docker-compose

上一次我们学习了制作Dockerfile构建定制的tomcat镜像文件,今天我们学习构建一个nginx镜像文件,然后通过docker-compse将nginx和...

4235
来自专栏散尽浮华

Tomcat自带的Session共享方案实施记录

一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到...

2582
来自专栏三木的博客

内核源码编译

编译内核的目的在于把纷繁复杂的内核源码编译成一个可执行的镜像文件。当然,内核功能复杂,并不是所有的 功能都需要用到,所以,我们在使用make对其编译前,要做一件...

2147
来自专栏北京马哥教育

通过实例来学习使用Linux KVM

KVM是Kernel-based Virtual Machine的缩写,从名字上可以知道,KVM是在支持虚拟化硬件环境上,基于Linux操作系统内核的虚拟化技...

2232
来自专栏魏艾斯博客www.vpsss.net

centOS 如何安装 lnmp 环境

3894

扫码关注云+社区

领取腾讯云代金券