# Zookeeper 安装
## Docker 部署 Zookeeper
#### 单个实例
- 官网仓库:
- 单个实例:`docker run -d --restart always --name one-zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime zookeeper:latest`
- 默认端口暴露是:`This image includes EXPOSE 2181 2888 3888 (the zookeeper client port, follower port, election port respectively)`
- 容器中的几个重要目录(有需要挂载的可以指定):
- `/data`
- `/datalog`
- `/conf`
#### 单机多个实例(集群)
- 创建 docker compose 文件:`vim zookeeper.yml`
- 下面内容来自官网仓库:
```
version: '3.1'
services:
zoo1:
image: zookeeper
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
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
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
```
- 启动:`docker-compose -f zookeeper.yml -p zk_test up -d`
- 参数 -p zk_test 表示这个 compose project 的名字,等价于:`COMPOSE_PROJECT_NAME=zk_test docker-compose -f zookeeper.yml up -d`
- 不指定项目名称,Docker-Compose 默认以当前文件目录名作为应用的项目名
- 报错是正常情况的。
- 停止:`docker-compose -f zookeeper.yml -p zk_test stop`
#### 先安装 nc 再来校验 zookeeper 集群情况
- 环境:CentOS 7.4
- 官网下载:,找到 rpm 包
- 当前时间(201803)最新版本下载:`wget https://nmap.org/dist/ncat-7.60-1.x86_64.rpm`
- 安装:`sudo rpm -i ncat-7.60-1.x86_64.rpm`
- ln 下:`sudo ln -s /usr/bin/ncat /usr/bin/nc`
- 检验:`nc --version`
#### 校验
- 命令:`echo stat | nc 127.0.0.1 2181`,得到如下信息:
```
Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
Clients:
/172.21.0.1:58872[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: follower
Node count: 4
```
- 命令:`echo stat | nc 127.0.0.1 2182`,得到如下信息:
```
Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
Clients:
/172.21.0.1:36190[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x500000000
Mode: follower
Node count: 4
```
- 命令:`echo stat | nc 127.0.0.1 2183`,得到如下信息:
```
Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
Clients:
/172.21.0.1:33344[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x500000000
Mode: leader
Node count: 4
```
#### 多机多个实例(集群)
- 三台机子:
- 内网 ip:`172.24.165.129`,外网 ip:`47.91.22.116`
- 内网 ip:`172.24.165.130`,外网 ip:`47.91.22.124`
- 内网 ip:`172.24.165.131`,外网 ip:`47.74.6.138`
- 修改三台机子 hostname:
- 节点 1:`hostnamectl --static set-hostname youmeekhost1`
- 节点 2:`hostnamectl --static set-hostname youmeekhost2`
- 节点 3:`hostnamectl --static set-hostname youmeekhost3`
- 三台机子的 hosts 都修改为如下内容:`vim /etc/hosts`
```
172.24.165.129 youmeekhost1
172.24.165.130 youmeekhost2
172.24.165.131 youmeekhost3
```
- 节点 1:
```
docker run -d \
-v /data/docker/zookeeper/data:/data \
-v /data/docker/zookeeper/log:/datalog \
-e ZOO_MY_ID=1 \
-e "ZOO_SERVERS=server.1=youmeekhost1:2888:3888 server.2=youmeekhost2:2888:3888 server.3=youmeekhost3:2888:3888" \
--name=zookeeper1 --net=host --restart=always zookeeper
```
- 节点 2:
```
docker run -d \
-v /data/docker/zookeeper/data:/data \
-v /data/docker/zookeeper/log:/datalog \
-e ZOO_MY_ID=2 \
-e "ZOO_SERVERS=server.1=youmeekhost1:2888:3888 server.2=youmeekhost2:2888:3888 server.3=youmeekhost3:2888:3888" \
--name=zookeeper2 --net=host --restart=always zookeeper
```
- 节点 3:
```
docker run -d \
-v /data/docker/zookeeper/data:/data \
-v /data/docker/zookeeper/log:/datalog \
-e ZOO_MY_ID=3 \
-e "ZOO_SERVERS=server.1=youmeekhost1:2888:3888 server.2=youmeekhost2:2888:3888 server.3=youmeekhost3:2888:3888" \
--name=zookeeper3 --net=host --restart=always zookeeper
```
## 需要环境
- JDK 安装
## 下载安装
- 官网:
- 此时(201702)最新稳定版本:Release `3.4.9`
- 官网下载:
- 我这里以:`zookeeper-3.4.8.tar.gz` 为例
- 安装过程:
- `mkdir -p /usr/program/zookeeper/data`
- `cd /opt/setups`
- `tar zxvf zookeeper-3.4.8.tar.gz`
- `mv /opt/setups/zookeeper-3.4.8 /usr/program/zookeeper`
- `cd /usr/program/zookeeper/zookeeper-3.4.8/conf`
- `mv zoo_sample.cfg zoo.cfg`
- `vim zoo.cfg`
- 将配置文件中的这个值:
- 原值:`dataDir=/tmp/zookeeper`
- 改为:`dataDir=/usr/program/zookeeper/data`
- 防火墙开放2181端口
- `iptables -A INPUT -p tcp -m tcp --dport 2181 -j ACCEPT`
- `service iptables save`
- `service iptables restart`
- 启动 zookeeper:`sh /usr/program/zookeeper/zookeeper-3.4.8/bin/zkServer.sh start`
- 停止 zookeeper:`sh /usr/program/zookeeper/zookeeper-3.4.8/bin/zkServer.sh stop`
- 查看 zookeeper 状态:`sh /usr/program/zookeeper/zookeeper-3.4.8/bin/zkServer.sh status`
- 如果是集群环境,下面几种角色
- leader
- follower
## 集群环境搭建
### 确定机子环境
- 集群环境最少节点是:3,且节点数必须是奇数,生产环境推荐是:5 个机子节点。
- 系统都是 CentOS 6
- 机子 1:192.168.1.121
- 机子 2:192.168.1.111
- 机子 3:192.168.1.112
### 配置
- 在三台机子上都做如上文的流程安装,再补充修改配置文件:`vim /usr/program/zookeeper/zookeeper-3.4.8/conf/zoo.cfg`
- 三台机子都增加下面内容:
``` nginx
server.1=192.168.1.121:2888:3888
server.2=192.168.1.111:2888:3888
server.3=192.168.1.112:2888:3888
```
- 在 机子 1 增加一个该文件:`vim /usr/program/zookeeper/data/myid`,文件内容填写:`1`
- 在 机子 2 增加一个该文件:`vim /usr/program/zookeeper/data/myid`,文件内容填写:`2`
- 在 机子 3 增加一个该文件:`vim /usr/program/zookeeper/data/myid`,文件内容填写:`3`
- 然后在三台机子上都启动 zookeeper:`sh /usr/program/zookeeper/zookeeper-3.4.8/bin/zkServer.sh start`
- 分别查看三台机子的状态:`sh /usr/program/zookeeper/zookeeper-3.4.8/bin/zkServer.sh status`,应该会得到类似这样的结果:
```
Using config: /usr/program/zookeeper/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: follower 或者 Mode: leader
```
## 资料
-