Content Table

本机安装 ZooKeeper 集群

ZooKeeper 的集群最好是使用 3,5,7,9 奇数台服务器,开发环境可能没有这么多机器给我们使用,不过可以在本机运行多个 ZooKeeper 实例,模拟集群。

下载 ZooKeeper

访问 http://zookeeper.apache.org/releases.html#download 下载 ZooKeeper。

ZooKeeper 是绿色软件,解压即是安装。

单机 ZooKeeper

安装单机的 ZooKeeper 只需要 3 步:

  1. 解压 ZooKeeper

  2. 创建 data 和 dataLog 目录

  3. 配置 conf/zoo.cfg

    1
    2
    3
    4
    5
    6
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/Users/Biao/Documents/zookeeper/temp/zk1/data
    dataLogDir=/Users/Biao/Documents/zookeeper/temp/zk1/dataLog
    clientPort=2181

启动关闭 ZooKeeper:

  • 启动: bin/zkServer.sh start
  • 关闭: bin/zkServer.sh stop
  • 重启: bin/zkServer.sh restart
  • 状态: bin/zkServer.sh status

集群 ZooKeeper

解压下载得到的 zookeeper-3.3.6.tar.gz 三次(不要在意版本号),并重命名得到三个目录,每个目录下是一个 ZooKeeper 的实例,例如放在目录 /Users/Biao/Documents/zookeeper 下:

  • /Users/Biao/Documents/zookeeper/zookeeper-1
  • /Users/Biao/Documents/zookeeper/zookeeper-2
  • /Users/Biao/Documents/zookeeper/zookeeper-3
1
2
3
4
5
6
7
8
9
10
11
12
├── zookeeper-1
│   ├── bin
│   ├── conf
│   ├── contrib
├── zookeeper-2
│   ├── bin
│   ├── conf
│   ├── contrib
├── zookeeper-3
│   ├── bin
│   ├── conf
│   ├── contrib

data 和 dataLog 目录

为每个 ZooKeeper 实例创建独立的数据存储目录 data 和日志目录 dataLog,例如放在目录 /Users/Biao/Documents/zookeeper 下:

  • /Users/Biao/Documents/zookeeper/temp/zk1
  • /Users/Biao/Documents/zookeeper/temp/zk2
  • /Users/Biao/Documents/zookeeper/temp/zk3
1
2
3
4
5
6
7
8
9
10
11
12
/Users/Biao/Documents/zookeeper/temp/zk1

├── temp
│   ├── zk1
│   │   ├── data
│   │   └── dataLog
│   ├── zk2
│   │   ├── data
│   │   └── dataLog
│   └── zk3
│   ├── data
│   └── dataLog

zk1 是 ZooKeeper 实例 1 的目录

zk2 是 ZooKeeper 实例 2 的目录

zk3 是 ZooKeeper 实例 3 的目录

服务器 ID 文件 myid

  • 创建文件 /Users/Biao/Documents/zookeeper/temp/zk1/data/myid,内容为 1
  • 创建文件 /Users/Biao/Documents/zookeeper/temp/zk2/data/myid,内容为 2
  • 创建文件 /Users/Biao/Documents/zookeeper/temp/zk3/data/myid,内容为 3

配置文件 zoo.cfg

为每个 ZooKeeper 实例创建配置文件,在 ZooKeeper 的 conf 目录中

  • 创建 /Users/Biao/Documents/zookeeper/zookeeper-1/conf/zoo.cfg,内容为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/Users/Biao/Documents/zookeeper/temp/zk1/data
    dataLogDir=/Users/Biao/Documents/zookeeper/temp/zk1/dataLog
    clientPort=2181
    server.1=localhost:2287:3387
    server.2=localhost:2288:3388
    server.3=localhost:2289:3389

    clientPort: the port at which the clients will connect,例如下面用到的 zkCli.sh

  • 创建 /Users/Biao/Documents/zookeeper/zookeeper-2/conf/zoo.cfg,内容为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/Users/Biao/Documents/zookeeper/temp/zk2/data
    dataLogDir=/Users/Biao/Documents/zookeeper/temp/zk2/dataLog
    clientPort=2182
    server.1=localhost:2287:3387
    server.2=localhost:2288:3388
    server.3=localhost:2289:3389
  • 创建 /Users/Biao/Documents/zookeeper/zookeeper-3/conf/zoo.cfg,内容为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/Users/Biao/Documents/zookeeper/temp/zk3/data
    dataLogDir=/Users/Biao/Documents/zookeeper/temp/zk3/dataLog
    clientPort=2183
    server.1=localhost:2287:3387
    server.2=localhost:2288:3388
    server.3=localhost:2289:3389

因为是在一台机器上模拟集群,所以每个 ZooKeeper 实例的端口号 clientPort 不同。

生产环境中,分布式集群部署的步骤与上面基本相同,只不过因为各 ZooKeeper 分布在不同的机器,上述配置文件中的 localhost 换成各服务器的真实 IP 即可。分布在不同的机器后,不存在端口冲突问题,可以让每个服务器的 clientPort 均采用相同的端口,这样管理起来比较方便。

启动 ZooKeeper

执行下面的命令启动 ZooKeeper 服务器:

  • /Users/Biao/Documents/zookeeper/zookeeper-1/bin/zkServer.sh start
  • /Users/Biao/Documents/zookeeper/zookeeper-2/bin/zkServer.sh start
  • /Users/Biao/Documents/zookeeper/zookeeper-3/bin/zkServer.sh start

使用命令 jps 可以看到 ZooKeeper 的进程信息

1
2
3
17145 QuorumPeerMain
17212 QuorumPeerMain
17234 QuorumPeerMain

或则从任务管理器里可以看到 3 个名为 java 的进程,看看进程信息就知道是不是 ZooKeeper 的进程了,很多 Java 程序的进程名都叫 java。

访问 ZooKeeper

执行命令 bin/zkCli.sh -server localhost:2181,localhost:2182,127.0.0.1:2183 使用 ZooKeeper 客户端访问 ZooKeeper,连接成功则说明 ZooKeeper 服务启动了:

1
2
3
4
5
6
Connecting to localhost:2181
2017-04-11 21:33:56,163 - INFO [main:Environment@97] - Client environment:zookeeper.version=3.3.6-1366786, built on 07/29/2012 06:22 GMT
2017-04-11 21:33:56,165 - INFO [main:Environment@97] - Client environment:host.name=192.168.0.101
2017-04-11 21:33:56,166 - INFO [main:Environment@97] - Client environment:java.version=1.8.0_77
2017-04-11 21:33:56,166 - INFO [main:Environment@97] - Client environment:java.vendor=Oracle Corporation
...

使用客户端访问 ZooKeeper 时传入了 ZooKeeper 集群的多个服务器的 IP:Port 信息,当某一个 ZooKeeper 的进程关闭后客户端会自动连接到其他 ZooKeeper 服务器。所以要连接的 ZooKeeper 集群的服务器信息并不是 ZooKeeper 服务器告诉客户端的,而是我们明确的指定给客户端的。

执行 bin/zkCli.sh 则连接到本机的 2181 端口的 ZooKeeper,当 2181 的 ZooKeeper 进程关闭后,不会自动连接到其他的 ZooKeeper。

至此,本机 ZooKeeper 的集群搭建完成,以后就可以在此基础上使用 ZooKeeper 开发了,例如使用 Dubbo 开发分布式服务。