1. 概述

ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper 的架构通过冗余服务实现高可用性。

Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

目前我司的生产项目中用到 Zookeeper 的场景有:

  1. 数据库中间件 Canal 的集群部署。
  2. ShardingSphere-Proxy 配置规则的中心化管理。

2. 部署

有条件的可以分开不同的机器进行部署(真正的分布式),如果想节省成本可以在本机进行伪集群部署即可。

2.1 目录说明

.
├── docker-compose.yml
├── zk-1
│   ├── conf
│   │   └── zoo.cfg
│   ├── data
│   └── datalog
├── zk-2
│   ├── conf
│   │   └── zoo.cfg
│   ├── data
│   └── datalog
└── zk-3
    ├── conf
    │   └── zoo.cfg
    ├── data
    └── datalog

2.2 脚本

2.2.1 docker-compose.yml

version: '3'

services:
  zk-1:
    image: zookeeper:3.6
    restart: always
    container_name: zk-1
    hostname: zk-1
    # 给docker容器给超级权限,访问宿主机目录
    privileged: true
    ports:
      - 2181:2181
      - 8181:8080
    environment:
      # 当前zk实例的id
      ZOO_MY_ID: 1
      # 整个zk集群的机器端口列表(2181:对client端提供服务的端口,3888:选举leader使用,2888:集群内机器通讯使用(Leader监听此端口))
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
    volumes:
      - ./zk-1/data:/data
      - ./zk-1/datalog:/datalog
      - ./zk-1/conf:/conf
    networks:
      - zk-net

  zk-2:
    image: zookeeper:3.6
    restart: always
    container_name: zk-2
    hostname: zk-2
    privileged: true
    ports:
      - 2182:2181
      - 8182:8080
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
    volumes:
      - ./zk-2/data:/data
      - ./zk-2/datalog:/datalog
      - ./zk-2/conf:/conf
    networks:
      - zk-net

  zk-3:
    image: zookeeper:3.6
    restart: always
    container_name: zk-3
    hostname: zk-3
    privileged: true
    ports:
      - 2183:2181
      - 8183:8080
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
    volumes:
      - ./zk-3/data:/data
      - ./zk-3/datalog:/datalog
      - ./zk-3/conf:/conf
    networks:
      - zk-net
# 给zk集群配置一个网络,网络名为zk-net
networks:
  zk-net:
    name: zk-net

2.2.2 zoo.cfg


# 存储快照文件snapshot的目录(相当于redis的rdb)
dataDir=/data

# ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如,session的最小超时时间是2*tickTime
tickTime=2000

# 初始值显示的刻度数,同步阶段可能需要
initLimit=10

# 发送请求和获得确认之间可以传递的心跳数
syncLimit=5

# 暴露服务端对外端口
clientPort=2181

# 单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制
maxClientCnxns=60

# 需要保留的文件数目,默认是保留3个
autopurge.snapRetainCount=3

# ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能
autopurge.purgeInterval=1

# 监控指标
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpPort=7000
metricsProvider.exportJvmInfo=true

3. 运行

3.1 启动容器

docker-compose up -d

3.2 查看运行状况

docker-compose ps

[root@Reseach zkCluster]# docker-compose ps
Name              Command               State                                 Ports                               
------------------------------------------------------------------------------------------------------------------
zk-1   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:8181->8080/tcp
zk-2   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2182->2181/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:8182->8080/tcp
zk-3   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2183->2181/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:8183->8080/tcp

3.3 校验服务可用性

curl localhost:8181/commands/stats

{
  "version" : "3.6.3--6401e4ad2087061bc6b9f80dec2d69f2e3c8660a, built on 04/08/2021 16:35 GMT",
  "read_only" : false,
  "server_stats" : {
    "packets_sent" : 0,
    "packets_received" : 0,
    "fsync_threshold_exceed_count" : 0,
    "client_response_stats" : {
      "last_buffer_size" : -1,
      "min_buffer_size" : -1,
      "max_buffer_size" : -1
    },
    "provider_null" : false,
    "data_dir_size" : 615,
    "log_dir_size" : 615,
    "last_processed_zxid" : 0,
    "outstanding_requests" : 0,
    "server_state" : "standalone",
    "avg_latency" : 0.0,
    "max_latency" : 0,
    "min_latency" : 0,
    "num_alive_client_connections" : 0,
    "auth_failed_count" : 0,
    "non_mtlsremote_conn_count" : 0,
    "non_mtlslocal_conn_count" : 0,
    "uptime" : 498771
  },
  "client_response" : {
    "last_buffer_size" : -1,
    "min_buffer_size" : -1,
    "max_buffer_size" : -1
  },
  "node_count" : 5,
  "connections" : [ ],
  "secure_connections" : [ ],
  "command" : "stats",
  "error" : null
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐