一. zookeeper简述
作用
zookeeper是一个开源的为分布式框架提供协调服务的Apache项目
工作机制
zookeeper是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据发生变化,zookeeper就将负责通知已经在zookeeper上注册的哪些观察者做出相应的反应。
特点
-
zookeeper:一个领导者,多个跟随者组成的集群
-
集群中只要有半数以上的节点存活,zookeeper集群就可以正常服务,zookeeper适合安装奇数台服务器
-
全局数据一致性:每一个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。
-
更新请求顺序执行,来自同一个client的更新请求按其发送顺序依次执行
-
数据更新原子性,一次更新要么成功,要么失败
-
实时性,在一定时间范围内,client能读到最新数据
数据结构
zookeeper数据模型的结构与unix文件系统很类似,整体上看作一棵树,每个节点称作一个ZNode。每一个ZNode默认能够存储1MB数据,每个ZNode都可以通过其路径唯一标识。
二. 使用场景
统一命名服务
统一配置管理
统一集群管理
服务器动态上下线
软负载均衡
三. 单机环境搭建
我这里使用的是ubuntu非root用户安装的,直接用我写的脚本就可以直接安装单节点zookeeper。
#!/bin/bash
name=zookeeper-3.5.9
home=$(pwd)/${name}
db=${home}/zkData
case $1 in
install)
echo "开始安装单节点zookeeper"
echo "开始下载zookeeper包......"
wget https://downloads.apache.org/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz
echo "安装包正在解压......"
tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz
mv apache-zookeeper-3.5.9-bin ${name}
cp ${home}/conf/zoo_sample.cfg ${home}/conf/zoo.cfg
echo "创建数据目录,并修改配置......"
mkdir ${db}
sed -i "/dataDir=/{s:/tmp/zookeeper:${db}:g;}" ${home}/conf/zoo.cfg
isUse=`netstat -tlpn | grep 8080`
if [ -n "$isUse" ]; then
echo "admin.serverPort使用的端口8080被占用"
sed -i '$a\admin.serverPort=2882' ${home}/conf/zoo.cfg
fi
chown -R ${USER}:${USER} ${home}
echo "安装单节点zookeeper完毕"
;;
start)
echo "开始启动单节点zookeeper"
${home}/bin/zkServer.sh start
;;
status)
echo "查看单节点zookeeper状态"
${home}/bin/zkServer.sh status
;;
stop)
echo "开始停止单节点zookeeper"
${home}/bin/zkServer.sh stop
;;
remove)
rm -rf ${home}
;;
esac
使用方式:
./install.sh install # 启动之前先执行安装
./install.sh start # 启动
./install.sh status # 查看状态
./install.sh stop # 停止
./install.sh remove # 移除(先停止)
四. 常用参数
| 备注名 | 备注 |
| clientPort=2181 | 向外提供服务的端口号 |
| maxClientCnxns=60 | 单个客户端和单台服务器之间的连接数量,默认是60;如果设置0这说明不做任何限制。(这里需要注意这个限制仅仅是单台客户端和单台服务器之间的连接限制) |
| dataDir | 数据目录(数据目录/tmp/zookeeper) |
| dataLogDir | 事务日志存储目录,默认是64M,建议设置单独的磁盘和挂载点,这将提高zk的性能。 |
| tickTime=2000 | zookeeper中最小的时间单位长度(毫秒),zk中所有的时间都是以这个为基础进行整数倍配置的。 |
| initLimit=10 | 从节点从主节点上同步最新数据的时间。 |
| syncLimit=5 | leader节点和follower节点进行心跳检测的最大延时时间 |
| admin.serverPort | 查看zk系统信息的web页面 |
这里需要注意admin.serverPort的配置默认端口是8080,这个是zk携带的一个web的系统接口页面,
启动zk之后我们在浏览器中输入:IP:8080/commands
其他的一些配置可以在官网看到:
zookeeper.apache.org/doc/r3.7.0/…
五. 集群安装
集群安装需要在数据目录(dataDir)下面创建一个myid文件,配置文件需要增加节点信息,这里的节点配置信息需要注意一下:
# 集群配置
server.1=0.0.0.0:2889:3889
server.2=0.0.0.0:2890:3890
server.3=0.0.0.0:2891:3891
这里的配置:server.A=B:C:D
A:是一个数字,表示这是个第几号服务器
B:是服务器地址
C:这个从节点(follower)与集群中主节点(leader)服务器交换信息的端口
D:是集群中主节点(leader)服务器挂了之后,需要一个端口来重新进行选举,选出一个新的主节点(leader),而这个端口是用来执行选举时对服务器相互通信的端口。
安装脚本:
#!/bin/bash
home=$(pwd)/zookeeper/node-
case $1 in
install)
echo "开始安装单节点zookeeper"
echo "开始下载zookeeper包......"
wget https://downloads.apache.org/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz
echo "安装包正在解压......"
for ((i=1; i<=3; i++))
do
itemPath=${home}$i
dbPath=${itemPath}/zkData
logPath=${itemPath}/logData
mkdir -p ${itemPath}/{zkData,logData}
echo $i > ${dbPath}/myid
tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz --strip-components 1 -C ${itemPath}
cp ${itemPath}/conf/zoo_sample.cfg ${itemPath}/conf/zoo.cfg
sed -i "/clientPort=/{s:2181:218$i:g;}" ${itemPath}/conf/zoo.cfg
sed -i "/dataDir=/{s:/tmp/zookeeper:${dbPath}:g;}" ${itemPath}/conf/zoo.cfg
echo 'admin.serverPort=808'$i >> ${itemPath}/conf/zoo.cfg
echo "dataLogDir=${logPath}" >> ${itemPath}/conf/zoo.cfg
echo '# cluster config' >> ${itemPath}/conf/zoo.cfg
echo 'server.1=0.0.0.0:2889:3889' >> ${itemPath}/conf/zoo.cfg
echo 'server.1=0.0.0.0:2890:3890' >> ${itemPath}/conf/zoo.cfg
echo 'server.1=0.0.0.0:2891:3891' >> ${itemPath}/conf/zoo.cfg
chown -R ${USER}:${USER} ${itemPath}
done
echo "安装单节点zookeeper完毕"
;;
start)
echo "开始启动单节点zookeeper"
for ((i=1; i<=3; i++))
do
cd ${home}${i} && ./bin/zkServer.sh start
done
;;
status)
echo "查看单节点zookeeper状态"
for ((i=1; i<=3; i++))
do
cd ${home}${i} && ./bin/zkServer.sh status
done
;;
stop)
echo "开始停止单节点zookeeper"
for ((i=1; i<=3; i++))
do
cd ${home}${i} && ./bin/zkServer.sh stop
done
;;
remove)
rm -rf ${home}*
;;
esac
如果需要多台的话,修改一下参数很容易实现多台zk集群,相对docker-compose来说,简单多了。
六. 容器安装
官方有相关的文章介绍:hub.docker.com/_/zookeeper。
官方的docker-compose文件没有设置data和log目录这样话,数据不安全,所以我们简单修改一下。
version: '3.1'
services:
zoo1:
image: zookeeper
restart: always
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
volumes:
- ./node-1/zkData:/data
- ./node-1/logData:/datalog
zoo2:
image: zookeeper
restart: always
hostname: zoo2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
volumes:
- ./node-2/zkData:/data
- ./node-2/logData:/datalog
zoo3:
image: zookeeper
restart: always
hostname: zoo3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
volumes:
- ./node-3/zkData:/data
- ./node-3/logData:/datalog
启动
docker-compose up -d # 后台启动
docker-compose ps # 查看启动情况
这个如果增加集群数据就比shell脚本麻烦了。