# zookeeper集群

三台主机：

* 主机一：172.16.3.52
* 主机一：172.16.3.63
* 主机一：172.16.3.64

1、下载镜像

```
docker pull zookeeper:3.4.12
```

2、在主机上建立挂载目录和zookeeper配置文件

```
mkdir -p /home/data/zookeeper_data/conf \
mkdir -p /home/data/zookeeper_data/data \
cd /home/data/zookeeper_data/conf
touch zoo.cfg
vi zoo.cfg
```

三台主机上的zoo.cfg配置信息如下：

```
clientPort=2181
dataDir=/data
dataLogDir=/data/log
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
server.0=172.16.3.52:2888:3888
server.1=172.16.3.63:2888:3888
server.2=172.16.3.64:2888:3888
```

3、在主机一上为自己分配server id，命令如下：

```
cd /home/data/zookeeper_data/data
echo "0" > myid
```

在主机二上为自己分配server id，命令如下：

```
cd /home/data/zookeeper_data/data
echo "1" > myid
```

在主机二上为自己分配server id，命令如下：

```
cd /home/data/zookeeper_data/data
echo "2" > myid
```

4、三台主机依次启动容器：

```
docker run  --restart=always --network host -v /home/data/zookeeper_data/data:/data -v /home/data/zookeeper_data/conf:/conf --name zookeeper -d zookeeper:3.4.12
```

命令说明：

* \--network host: 使用主机上的网络配置，如果不用这种模式，而用默认的bridge模式，会导致容器跨主机间通信失败
* -v /data/zookeeper\_data/data:/data：主机的数据目录挂载到容器/data下
* -v /data/zookeeper\_data/conf:/conf： 主机的配置目录挂载到容器的/conf下，容器内的zkServer.sh默认会读取/conf/zoo.cfg下的配置

都启动完成后，每台主机的2181/2888/3888端口都会开放出来了

5、验证

```
docker exec -it 容器id /bin/bash
```

```
docker logs 容器id/容器名称
```

使用windows工具zoolnspector

6、排错\
前面两台发现没有问题，后面有台机器报错。\
权限不足，发现用户不一样：

```
[root@bogon conf]# id
#不能启动的主机用户
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
#正常的主机用户
uid=0(root) gid=0(root) 组=0(root)
```

根据后面的信息我查到是因为selinux的原因。

```
[root@bogon conf]# docker logs -f 19f5e6824a57
chown: /data: Permission denied
chown: /data: Permission denied
```

这是因为开启了SELinux，解决办法：\
①直接将SELinux的工作模式设置成 disabled，这样就不会出现策略拦截问题了，但是这样的话我们的系统就没有SELinux安全防护了

②通过 restorecon 或者 chcon 命令来修复我们的文件上下文信息

命令 restorecon 可以用来恢复文件默认的上下文：

```
restorecon -R -v /home/data/zookeeper_data/　
```

//-R 表示递归，如果是目录，则该目录下的所有子目录、文件都会得到修复　　\
命令 chcon 可以改变文件的上下文信息，通常我们使用一个参照文件来进行修改：

```
chcon --reference=/var/www/html/index.html /var/www/html/test.html
restorecon -v zoo.cfg
```
