一、概述
Zookeeper是一个开源的分布式和谐服务中间件,它供给了一种分布式数据办理服务,能够完成分布式锁、命名服务、装备办理、集群办理等功用,然后协助用户构建高可用、高性能的分布式体系。以下是Zookeeper的一些主要特点和功用:
-
分布式和谐服务:Zookeeper具有完备的分布式和谐服务,如分布式锁、leader推举、命名服务、装备办理等,能够协助用户构建高可用、高性能的分布式体系。
-
高可用性:Zookeeper采用了多种机制确保服务的高可用性,其中包括主从复制、数据版别控制、环路日志等,然后构建了一个高度牢靠、高度可用的分布式服务。
-
快速呼应:Zookeeper具有十分快速的呼应能力,能够快速处理大量的恳求并供给高效的数据存取服务。
-
数据一致性:Zookeeper确保一切客户端看到服务端数据的一致性。它运用了一系列协议和算法,如ZAB协议、Paxos算法等,确保一切节点上的数据同步和和谐。
-
开放API:Zookeeper供给了很多的API,包括Java、C、C++等多种编程语言,能够便利地与其他软件体系进行集成和交互。
总归,Zookeeper是一个牢靠、高效、易用的分布式和谐服务中间件。它具有强壮的分布式和谐和办理功用,能够协助用户轻松构建高可用、高性能的分布式体系。
想了解更多关于zookeeper的知识点能够参阅我之前的文章:分布式开源和谐服务——Zookeeper
二、前期预备
1)布置 docker
# 装置yum-config-manager装备东西
yum -y install yum-utils
# 主张运用阿里云yum源:(引荐)
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 装置docker-ce版别
yum install -y docker-ce
# 发动并开机发动
systemctl enable --now docker
docker --version
2)布置 docker-compose
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
三、创立网络
# 创立,注意不能运用hadoop_network,要不然发动hs2服务的时候会有问题!!!
docker network create hadoop-network
# 检查
docker network ls
四、Zookeeper 编列布置
1)下载 Zookeeper
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz --no-check-certificate
注意还需求java环境,能够去官网下载,也能够在我下面供给的地址下载:
链接: pan.baidu.com/s/1o_z3t16v… 提取码:
kuac
复制这段内容后打开百度网盘手机App,操作更便利哦
2)装备
mkdir conf data/{zookeeper-node1,zookeeper-node2,zookeeper-node3}/data -p
# zookeeper 主装备文件
cat >conf/zoo.cfg<<EOF
# tickTime:Zookeeper 服务器之间或客户端与服务器之间保持心跳的时间间隔,也便是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。session最小有效时间为tickTime*2
tickTime=2000
# Zookeeper保存数据的目录,默许情况下,Zookeeper将写数据的日志文件也保存在这个目录里。不要运用/tmp目录
dataDir=/opt/apache/zookeeper/data
# 端口,默许便是2181
clientPort=2181
# 集群中的follower服务器(F)与leader服务器(L)之间初始衔接时能容忍的最多心跳数(tickTime的数量),超过此数量没有回复会断开链接
initLimit=10
# 集群中的follower服务器与leader服务器之间恳求和应对之间能容忍的最多心跳数(tickTime的数量)
syncLimit=5
# 最大客户端链接数量,0不约束,默许是0
maxClientCnxns=60
# zookeeper集群装备项,server.1,server.2,server.3是zk集群节点;zookeeper-node1,zookeeper-node2,zookeeper-node3是主机称号;2888是主从通讯端口;3888用来推举leader
server.1=zookeeper-node1:2888:3888
server.2=zookeeper-node2:2888:3888
server.3=zookeeper-node3:2888:3888
EOF
# 在刚创立好的zk data数据目录下面创立一个文件 myid
# 里边内容是server.N中的N,会经过挂载的方法增加
echo 1 > ./data/zookeeper-node1/data/myid
echo 2 > ./data/zookeeper-node2/data/myid
echo 3 > ./data/zookeeper-node3/data/myid
3)发动脚本 bootstrap.sh
#!/usr/bin/env sh
${ZOOKEEPER_HOME}/bin/zkServer.sh start
tail -f ${ZOOKEEPER_HOME}/logs/*.out
4)构建镜像 Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/centos:7.7.1908
RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
RUN export LANG=zh_CN.UTF-8
# 创立用户和用户组,跟yaml编列里的user: 10000:10000
RUN groupadd --system --gid=10000 hadoop && useradd --system --home-dir /home/hadoop --uid=10000 --gid=hadoop hadoop -m
# 装置sudo
RUN yum -y install sudo ; chmod 640 /etc/sudoers
# 给hadoop增加sudo权限
RUN echo "hadoop ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
RUN yum -y install install net-tools telnet wget nc less
RUN mkdir /opt/apache/
# 增加装备 JDK
ADD jdk-8u212-linux-x64.tar.gz /opt/apache/
ENV JAVA_HOME /opt/apache/jdk1.8.0_212
ENV PATH $JAVA_HOME/bin:$PATH
# 增加装备 trino server
ENV ZOOKEEPER_VERSION 3.8.1
ADD apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz /opt/apache/
ENV ZOOKEEPER_HOME /opt/apache/zookeeper
RUN ln -s /opt/apache/apache-zookeeper-${ZOOKEEPER_VERSION}-bin $ZOOKEEPER_HOME
# 创立数据存储目录
RUN mkdir ${ZOOKEEPER_HOME}/data
# copy 装备文件
RUN cp ${ZOOKEEPER_HOME}/conf/zoo_sample.cfg ${ZOOKEEPER_HOME}/conf/zoo.cfg
# 这里的值会根据挂载的而修正
RUN echo 1 >${ZOOKEEPER_HOME}/data/myid
# copy bootstrap.sh
COPY bootstrap.sh /opt/apache/
RUN chmod +x /opt/apache/bootstrap.sh
RUN chown -R hadoop:hadoop /opt/apache
WORKDIR $ZOOKEEPER_HOME
开端构建镜像
docker build -t registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/zookeeper:3.8.1 . --no-cache
# 为了便利小伙伴下载即可运用,我这里将镜像文件推送到阿里云的镜像库房
docker push registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/zookeeper:3.8.1
### 参数解释
# -t:指定镜像称号
# . :当前目录Dockerfile
# -f:指定Dockerfile途径
# --no-cache:不缓存
5)编列 docker-compose.yaml
version: '3'
services:
zookeeper-node1:
image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/zookeeper:3.8.1
user: "hadoop:hadoop"
container_name: zookeeper-node1
hostname: zookeeper-node1
restart: always
environment:
- TZ=Asia/Shanghai
- privileged=true
env_file:
- .env
volumes:
- ./conf/zoo.cfg:${ZOOKEEPER_HOME}/conf/zoo.cfg
- ./data/zookeeper-node1/data/myid:${ZOOKEEPER_HOME}/data/myid
ports:
- "${ZOOKEEPER_NODE1_SERVER_PORT}:2181"
expose:
- 2888
- 3888
command: ["sh","-c","/opt/apache/bootstrap.sh"]
networks:
- hadoop-network
healthcheck:
test: ["CMD-SHELL", "netstat -tnlp|grep :2181 || exit 1"]
interval: 10s
timeout: 10s
retries: 5
zookeeper-node2:
image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/zookeeper:3.8.1
user: "hadoop:hadoop"
container_name: zookeeper-node2
hostname: zookeeper-node2
restart: always
environment:
- TZ=Asia/Shanghai
- privileged=true
env_file:
- .env
volumes:
- ./conf/zoo.cfg:${ZOOKEEPER_HOME}/conf/zoo.cfg
- ./data/zookeeper-node2/data/myid:${ZOOKEEPER_HOME}/data/myid
ports:
- "${ZOOKEEPER_NODE2_SERVER_PORT}:2181"
expose:
- 2888
- 3888
command: ["sh","-c","/opt/apache/bootstrap.sh"]
networks:
- hadoop-network
healthcheck:
test: ["CMD-SHELL", "netstat -tnlp|grep :2181 || exit 1"]
interval: 10s
timeout: 10s
retries: 5
zookeeper-node3:
image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/zookeeper:3.8.1
user: "hadoop:hadoop"
container_name: zookeeper-node3
hostname: zookeeper-node3
restart: always
environment:
- TZ=Asia/Shanghai
- privileged=true
env_file:
- .env
volumes:
- ./conf/zoo.cfg:${ZOOKEEPER_HOME}/conf/zoo.cfg
- ./data/zookeeper-node3/data/myid:${ZOOKEEPER_HOME}/data/myid
ports:
- "${ZOOKEEPER_NODE3_SERVER_PORT}:2181"
expose:
- 2888
- 3888
command: ["sh","-c","/opt/apache/bootstrap.sh"]
networks:
- hadoop-network
healthcheck:
test: ["CMD-SHELL", "netstat -tnlp|grep :2181 || exit 1"]
interval: 10s
timeout: 10s
retries: 5
# 衔接外部网络
networks:
hadoop-network:
external: true
.env
环境变量文件内容如下:
# 对外暴露的端口
cat << EOF > .env
ZOOKEEPER_HOME=/opt/apache/zookeeper
ZOOKEEPER_NODE1_SERVER_PORT=31181
ZOOKEEPER_NODE2_SERVER_PORT=32181
ZOOKEEPER_NODE3_SERVER_PORT=33181
EOF
6)开端布置
docker-compose -f docker-compose.yaml up -d
# 检查
docker-compose -f docker-compose.yaml ps
五、简略测验验证
# 检查节点
docker exec -it zookeeper-node1 bash
${ZOOKEEPER_HOME}/bin/zkServer.sh status
exit
docker exec -it zookeeper-node2 bash
${ZOOKEEPER_HOME}/bin/zkServer.sh status
exit
docker exec -it zookeeper-node3 bash
${ZOOKEEPER_HOME}/bin/zkServer.sh status
六、常用的 zookeeper 客户端指令
在Zookeeper中,节点类型分为四种:耐久节点、暂时节点、有序节点和有序暂时节点。
-
耐久节点:耐久节点是指一旦创立,就一向存在于Zookeeper中,直到主动删去。它能够存储恣意类型的数据,而且在节点的途径中,数据的途径是必须存在的。
-
暂时节点:暂时节点是指一旦客户端与Zookeeper会话失效或封闭后,节点将会从Zookeeper中删去。它的创立和删去都由客户端来保护。客户端下线或会话失效时,与该客户端相关的一切暂时节点都会被删去。
-
有序节点:有序节点是指创立的节点途径后增加一个自然数序列,每个数值表明一个节点的次第。它是依照节点创立的次序进行编号的,能够协助节点在Zookeeper中排序并查询。有序节点需求经过自增序列来完成,而且能够一起保护完好途径信息。
-
有序暂时节点:有序暂时节点是指一起具有暂时节点和有序节点两个特性的节点。它一旦被创立,就会在Zookeeper中保存一段时间,直到客户端衔接断开或许会话过期。 它的序列号将会依照节点的创立次序,由小到大进行排序,而且同样会在节点被删去时删去。
总归,不同类型的Zookeeper节点具有不同的生命周期和功用。合理地使用这些节点类型,能够协助用户构建出更加高效、牢靠的分布式应用体系。
1)创立节点
# 随意登录一个容器节点
docker exec -it zookeeper-node1 bash
# 登录
${ZOOKEEPER_HOME}/bin/zkCli.sh -server zookeeper-node1:2181
# 【耐久节点】数据节点创立后,一向存在,直到有删去操作主动铲除,示例如下:
create /zk-node data
# 【耐久次序节点】节点一向存在,zk主动追加数字后缀做节点名,后缀上限 MAX(int),示例如下:
create -s /zk-node data
# 【暂时节点】生命周期和会话相同,客户端会话失效,则暂时节点被铲除,示例如下:
create -e /zk-node-temp data
# 【暂时次序节点】暂时节点+次序节点后缀,示例如下:
create -s -e /zk-node-temp data
2)检查节点
# 随意登录一个容器节点
docker exec -it zookeeper-node1 bash
# 登录
${ZOOKEEPER_HOME}/bin/zkCli.sh -server zookeeper-node1:2181
# 列出zk履行节点的一切子节点,只能看到榜首级子节点
ls /
# 获取zk指定节点数据内容和特点
get /zk-node
3)更新节点
# 表达式:set ${path} ${data} [version]
set /zk-node hello
get /zk-node
4)删去节点
# 关于包括子节点的节点,该指令无法成功删去,运用deleteall /zk-node
delete /zk-node
# 删去非空目录
deleteall /zk-node
5)退出交互式
#协助
help
# 退出
quit
6)非交互式指令
# 直接后面接上指令履行即可
${ZOOKEEPER_HOME}/bin/zkCli.sh -server zookeeper-node1:2181 ls /
经过 docker-compose 快速布置 Zookeeper 教程就先到这里了,有任何疑问欢迎给我留言或私信,可关注我公众号【大数据与云原生技能分享】加群交流或私信沟通~