ZooKeeper 的集群最好是使用 3,5,7,9 奇数台服务器,开发环境可能没有这么多机器给我们使用,不过可以在本机运行多个 ZooKeeper 实例,模拟集群。
下载 ZooKeeper
访问 http://zookeeper.apache.org/releases.html#download 下载 ZooKeeper。
ZooKeeper 是绿色软件,解压即是安装。
单机 ZooKeeper
安装单机的 ZooKeeper 只需要 3 步:
解压 ZooKeeper
创建 data 和 dataLog 目录
配置 conf/zoo.cfg
1
2
3
4
5
6tickTime=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 | ├── zookeeper-1 |
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 | /Users/Biao/Documents/zookeeper/temp/zk1 |
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
9tickTime=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:3389clientPort: 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
9tickTime=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
9tickTime=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 | 17145 QuorumPeerMain |
或则从任务管理器里可以看到 3 个名为 java 的进程,看看进程信息就知道是不是 ZooKeeper 的进程了,很多 Java 程序的进程名都叫 java。
访问 ZooKeeper
执行命令 bin/zkCli.sh -server localhost:2181,localhost:2182,127.0.0.1:2183
使用 ZooKeeper 客户端访问 ZooKeeper,连接成功则说明 ZooKeeper 服务启动了:
1 | Connecting to localhost:2181 |
使用客户端访问 ZooKeeper 时传入了 ZooKeeper 集群的多个服务器的 IP:Port 信息,当某一个 ZooKeeper 的进程关闭后客户端会自动连接到其他 ZooKeeper 服务器。所以要连接的 ZooKeeper 集群的服务器信息并不是 ZooKeeper 服务器告诉客户端的,而是我们明确的指定给客户端的。
执行
bin/zkCli.sh
则连接到本机的 2181 端口的 ZooKeeper,当 2181 的 ZooKeeper 进程关闭后,不会自动连接到其他的 ZooKeeper。
至此,本机 ZooKeeper 的集群搭建完成,以后就可以在此基础上使用 ZooKeeper 开发了,例如使用 Dubbo 开发分布式服务。