目前只有2台云服务器不够,搭建3个虚拟机来玩玩zookeeper
先拉zookeeper镜像,建议配置阿里云加速器,国外docker官网很慢的 https://blog.csdn.net/ypp91zr/article/details/88607254
环境,3台虚拟机 192.168.13.111 192.168.13.222 192.168.13.233 都是linux7 内核3.10
docker以及jdk等安装请自行百度、google安装或者本人其他文章也有 https://blog.csdn.net/ypp91zr/article/details/88606662
创建挂载目录
用于存储配置文件和数据。使用docker数据和配置文件等肯定是要放在自己宿主机,不是容器内,特别是数据
mkdir -p zookeeper/conf
mkdir -p zookeeper/data
至于放在什么地方,随意。我是放在ypp这个总目录下的,这里面包括了很多其他东西,zookeeper只是一部分,3台机器都各自建立对应的目录。
在conf创建配置文件:
touch zoo.cfg:
clientPort=2181
dataDir=/data
dataLogDir=/data/log
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
server.111=192.168.13.111:2888:3888
server.222=192.168.13.222:2888:3888
server.233=192.168.13.233:2888:3888
3台机器分别配置一样的
clientPort:客户端连接端口,监听客户端连接的端口
dataDir:数据文件目录+数据持久化路径
dataLogDir:日志文件目录
tickTime:通信心跳数,Zookeeper服务器心跳时间,单位毫秒
Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会 发送一个心跳,时间单位为毫秒。
它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)
initLimit:leader(L)-follower(F)初始通信时限
集群中的follower跟随者服务器(F)与leader领导者服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量), 用它来限定集群中的Zookeeper服务器连接到Leader的时限。
投票选举新leader的初始化时间
Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。
Leader允许F在initLimit时间内完成这个工作。
syncLimit:leader(L)-follower(F)同步通信时限
集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,
Leader认为Follwer死掉,从服务器列表中删除Follwer。
在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。
如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在线了。
具体的配置项请参照:https://www.cnblogs.com/smail-bao/p/7009633.html
配置myid:
在zookeeper/data目录下创建myid,并配置id,里面的id一定要和上面配置的server.id一致,比如我111的服务器,id就是111,就是server.后面的111 server.111(server.id)
先查询是否有镜像,docker search zookeeper:3.14.13 否则拉镜像会失败,一般都会有. 这里使用3.4.13的
拉镜像到本地 docker pull zookeeper:3.4.13 3台机器一样的
所有的pull complete才是拉取成功
3台主机运行zookeeper镜像,启动容器
docker run --network host -v /ypp/zookeeper/data:/data -v /ypp/zookeeper/conf:/conf --name zookeeper-2181 -d zookeeper:3.4.13
运行启动容器成功,如果docker关了,下次也可以继续使用,启动容器(name)就是了 docker start zookeeper-2181 或者用容器id启动也可以 docker start e1a0ac9fc80f
命令说明:
- --network host: 使用主机上的网络配置,如果不用这种模式,而用默认的bridge模式,会导致容器跨主机间通信失败
- -v /ypp/zookeeper/data:/data:主机的数据目录挂载到容器/data下
- -v /ypp/zookeeper/conf:/conf: 主机的配置目录挂载到容器的/conf下,容器内的zkServer.sh默认会读取/conf/zoo.cfg下的配置
都启动完成后,每台主机的2181/2888/3888端口都会开放出来了.如果使用的阿里云、腾讯云等服务器,注意安全组放行端口,不然找半天问题没找到问题,忘了放端口给外部,本人之前忘了一次,找了足足3个小时没找到原因才想起。
检查zookeeper运行情况,进入容器 docker exec -it zookeeper-2181 /bin
192.168.13.222这台机器是leader领导者,其他2台是follower跟随者。运行期中leader故障后可以用客户端连接写自己的算法来进行leader选举
集群搭建成功