一、概述

1.1、简介

Zookeeper是一个开源的,分布式的,为分布式应用提供协调服务的Apache项目

1.2、工作机制

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化Zookeeper就将负责通知已经在Zookeeper.上注册的那些观察者做出相应的反应。

1.3、特点

1) Zookeeper: 一个领导者(Leader) ,多个跟随者(Follower) 组成的集群。
2)集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。
3)全局数据一致:每个Server保存一份相同的数据副本,Client无论 连接到哪个Server,数据都是一致的。
4)更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行。
5)数据更新原子性,一次数据更新要么成功,要么失败。
6)实时性,在一定时间范围内,Client能读到最新数据。

1.4、数据结构

ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。
znode一共有4种类型:持久的(persistent)、临时的 (ephemeral)、持久有序的(persistent_sequential)和临时有序的 (ephemeral_sequential)。

1.5、应用场景

提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。

1.6、结合其他组件使用

HBase:在HBase中,ZooKeeper用于选举一个集群内的主节点,以便跟踪可用的服务器,并保存集群的元数据
Kafka:在Kafka中,ZooKeeper用于检测崩溃,实现主题(topic)的发现,并保持主题的生产和消费状态

二、集群部署

前提
①集群要求半数以上节点存活,所以集群数量最好是奇数个,最少是3个
②集群每台服务器必须安装JDK
③各节点时间/时区同步
④集群内部免密
⑤修改主机名并作本地解析

集群规划:在node1,node2,node3三个节点部署zookeeper

2.1、安装JDK

卸载老版本

rpm -qa | grep openjdk | xargs rpm -e --nodeps

创建安装目录

mkdir -p /usr/lib/jvm/jdk1.8.0_73

安装

tar -xvzf jdk-8u73-linux-x64.tar.gz -C /usr/lib/jvm

在/etc/profile中添加环境变量

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_73
export JRE_HOME=/usr/lib/jvm/jdk1.8.0_73/jre
export CLASSPATH=.:/usr/lib/jvm/jdk1.8.0_73/lib:/usr/lib/jvm/jdk1.8.0_73/jre/lib
export PATH=$PATH:/usr/lib/jvm/jdk1.8.0_73/bin

重读环境变量

source /etc/profile

2.2、安装zk(集群各节点)

解压到安装目录

tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/

创建zkData目录

mkdir -p /opt/zookeeper-3.4.9/data

创建myid文件,在文件中添加与server对应的编号

echo "1" > /opt/zookeeper-3.4.9/data/myid

2.3、修改配置文件(集群各节点)

重命名/opt/zookeeper-3.4.9/conf这个目录下的zoo_sample.cfg为zoo.cfg

mv zoo_sample.cfg zoo.cfg

修改数据存放目录

dataDir=/opt/zookeeper-3.4.9/data
dataLogDir=/opt/zookeeper-3.4.9/logs

增加如下配置

server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888

#此处的1为data目录下myid的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
#node1为zk节点的主机名,前提是已经做好本地解析
#2888是follower与leader交换信息的端口
#3888是用于执行选举leader时相互通信的端口
#ZooKeeper服务器在启动时从一个名为zoo.cfg的配置文件读取所有 选项,多个服务器如果角色相似,同时基本配置信息一样,就可以共享 一个文件。data目录下的myid文件用于区分各个服务器,对每个服务器 来说,data目录必须是唯一的,因此这个目录可以更加方便地保存一些 差异化文件。服务器ID将myid文件作为一个索引引入到配置文件中。

其他配置

tickTime =2000 #通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒
initLimit =10 #LF初始通信时限
syncLimit =5 #LF同步通信时限
clientPort =2181 #客户端连接端口

修改zk日志存放目录:zkEnv.sh

sed -i 's/ZOO_LOG_DIR="."/ZOO_LOG_DIR="\/opt\/zookeeper-3.4.9\/logs"/g' /opt/zookeeper-3.4.9/bin/zkEnv.sh 
sed -i 's/ZOO_LOG4J_PROP="INFO,CONSOLE"/ZOO_LOG4J_PROP="DEBUG,ROLLINGFILE"/g' /opt/zookeeper-3.4.9/bin/zkEnv.sh

修改zk的log4j配置文件:log4j.properties

sed -i 's/zookeeper.root.logger=INFO, CONSOLE/zookeeper.root.logger=INFO, ROLLINGFILE/g' /opt/zookeeper-3.4.9/conf/log4j.properties 
sed -i 's/zookeeper.log.dir=./zookeeper.log.dir=\/opt\/zookeeper-3.4.9\/logs/g' /opt/zookeeper-3.4.9/conf/log4j.properties 
sed -i 's/zookeeper.tracelog.dir=./zookeeper.tracelog.dir=\/opt\/zookeeper-3.4.9\/logs/g' /opt/zookeeper-3.4.9/conf/log4j.properties 

2.4、启动(集群各节点)

/opt/zookeeper-3.4.9/bin/zkServer.sh start-foreground

zkServer.sh脚本参数
start-foreground:查看启动时报的是什么异常,同时也可以查看运行过程中的异常。
print-cmd:查看zookeeper启动的各个参数,包括java路径等

2.5、查看状态

[root@node1 zookeeper-3.4.9]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: leader

三、基于docker的单机部署

3.1、docker与docker-compose安装

解压安装包

tar zxvf docker-18.09.8.tgz

安装

mv docker/* /usr/bin/ 
mkdir /etc/docker 
cp daemon.json /etc/docker/daemon.json 
cp docker.service /usr/lib/systemd/system/docker.service 

安装docker-compose

cp docker-compose/docker-compose /usr/local/bin/ 
chmod +x /usr/local/bin/docker-compose 

启动并设置开机启动

systemctl daemon-reload 
systemctl start docker 
systemctl enable docker
systemctl restart docker

3.2、导入zookeeper镜像

docker load -i zookeeper-3.4.9_20191008.tar

3.3、准备docker-compose.yml文件

version: '2'

services:
   zookeeper:
    image: zookeeper:3.4.9
    restart: always
    container_name: zookeeper
    ports:
    - 2181:2181
    environment:
      ZOO_IP: 192.168.143.200
      ZOO_MY_ID: 1
    volumes:
    - "/home/data/zookeeper/data:/opt/zookeeper-3.4.9/data"
    - "/home/data/zookeeper/logs:/opt/zookeeper-3.4.9/logs"
    - "/etc/localtime:/etc/localtime:ro"
    - "/etc/timezone:/etc/timezone:ro"
    network_mode: "host"

①容器暴露2181端口到宿主机的2181端口
②将数据和日志目录挂载逻辑卷
③容器的本地时间与时区挂载宿主机的文件
④容器使用宿主机网络

3.4、启动zookeeper镜像

docker-compose -f docker-compose.yml up -d

3.5、检查

容器状态检查

[root@master home]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e4685488115a        zookeeper:3.4.9     "/opt/zookeeper-3.4.…"   12 minutes ago      Up 12 minutes                           zookeeper

容器内zookeeper检查

[root@master home]# docker exec -it e4685488115a /bin/bash
[root@master /]# ps afx
   PID TTY      STAT   TIME COMMAND
   122 pts/0    Ss     0:00 /bin/bash
   135 pts/0    R+     0:00  \_ ps afx
     1 ?        Ssl    0:01 /opt/jdk1.8.0_73/bin/java -Dzookeeper.log.dir=/opt/zookeeper-3.4.9/logs -Dzookeeper.root.logger=DEBUG,ROLLI
[root@master /]# jps
1 QuorumPeerMain
136 Jps

宿主机监听端口检查

[root@master home]# netstat -tanlp | grep java
tcp6       0      0 :::41309                :::*                    LISTEN      5850/java           
tcp6       0      0 :::2181                 :::*                    LISTEN      5850/java  

四、Zookeeper 管理四字命令

4.1、修改配置文件支持四字命令

Zookeeper提供了一些4字命令用来监控自己的运行状态,在zoo.cfg文件最下面加上如下配置开启四字命令白名单
4lw.commands.whitelist=* #所有4字命令都可以用

4.2、四字命令汇总

conf:输出相关服务配置的详细信息。
cons:列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。包括“接受 / 发送”的包数量、会话 id 、操作延迟、最后的操作执行等等信息。
dump:输出所有等待队列中的会话和临时节点的信息,这个命令针对Leader执行。
envi:输出关于服务环境的详细信息(区别于 conf 命令)。
reqs:列出未经处理的请求
ruok:测试服务是否处于正确状态。如果确实如此,那么服务返回“ imok ”,否则不做任何相应。
stat:输出关于性能和连接的客户端的列表。
wchs:列出服务器 watch 的概要信息。
wchc:通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。
wchp:通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。
mntr:输出比stat命令更为详尽的服务器统计信息
crst:功能性命令,重置所有连接的统计信息

示例:输出server的详细配置信息,配合nc
[root@master home]# yum install nc -y
Zookeeper-deploy_第1张图片
示例:输出server统计信息
Zookeeper-deploy_第2张图片

参考文章:
http://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html
《ZooKeeper:分布式过程协同技术详解》