一、概述
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
示例:输出server统计信息
参考文章:
http://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html
《ZooKeeper:分布式过程协同技术详解》