zookeper学习
声明:zookeeper学习可以从从尚硅谷中去学习
本人zk的安装目录:/opt/module
坑:启动ZK的时候记得关闭防火墙,systemctl stop firewalld
, 永久关闭防火墙systemctl disable firewalld
入门
概述
Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。
特点
- Zookeeper:一个领导者 (Leader),多个跟随者 (Follower) 组成的集群。
- 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。
- 全局数据一致:每个Server保存一份相同的数据副本,Clent无论连接到哪个Server,数据都是一致的。
- 更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行。
- 数据更新原子性,一次数据更新要么成功,要么失败。
- 实时性,在一定时间范围内,Client能读到最新数据。
数据结构
ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识个ZNode。
应用场景
提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
统一命名服务
在分布式环境下,经常需要对应用/服务进行统一命名,便于识别例如: P不容易记住,而域名容易记住。
统一配置管理
- 分布式环境下,配置文件同步非常常见。
(1)一般要求一个集群中,所有节点的配置信息是一致的,比如如 Kafka 集群
(2)对配置文件修改后,希望能够快速同步到各个节点上。 - 配置管理可交由ZooKeeper实现
(1)可将配置信息写入ZooKeeper上的一个Znode。
(2)各个客户端服务器监听这个Znode。
(3)一旦Znode中的数据被修改,ZooKeeper将通知各个客户端服务器
统一集群管理
- 分布式环境中,实时掌握每个节点的状态是必要的,可根据节点实时状态做出一些调整
- ZooKeeper可以实现实时监控节点状态变化
(1)可将节点信息写入ZooKeeper上的一个ZNode
(2)监听这个ZNode可获取它的实时状态变化
服务器节点动态上下线
客户端能实时洞察到服务器上下线的变化。
软负载均衡
在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。
下载地址
1.官网首页:
https://zookeeper.apache.org/
基本命令
- 启动zookeeper服务
[atguigu@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start - 关闭
bin/zkServer.sh stop - 查看状态
bin/zkServer.sh status - 查看进程
jps - 启动客户端
[atguigu@hadoop102 zookeeper-3.4.10]$ bin/zkCli.sh - 退出客户端
[zk: localhost:2181(CONNECTED) 0] quit
配置参数解读
Zookeeper中的配置文件zoo.cfg中参数含义解读如下:
1.tickTime =2000:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒
Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)
2.initLimit =10:LF初始通信时限
集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
3.syncLimit =5:LF同步通信时限
集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。
4.dataDir:数据文件目录+数据持久化路径
主要用于保存Zookeeper中的数据。
5.clientPort =2181:客户端连接端口
监听客户端连接的端口。
集群配置
配置服务器编号
(1)在/opt/module/zookeeper-3.4.10/这个目录下创建zkData
[atguigu@hadoop102 zookeeper-3.4.10]$ mkdir -p zkData
(2)在/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件
[atguigu@hadoop102 zkData]$ touch myid
添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码
(3)编辑myid文件
[atguigu@hadoop102 zkData]$ vi myid
在文件中添加与server对应的编号:
1
(4)拷贝配置好的zookeeper到其他机器上
[atguigu@hadoop102 zkData]$ xsync myid
并分别在hadoop102、hadoop103上修改myid文件中内容为2、3
配置zoo.cfg文件
(1)重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg
[atguigu@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg
(2)打开zoo.cfg文件
[atguigu@hadoop102 conf]$ vim zoo.cfg
修改数据存储路径配置
dataDir=/opt/module/zookeeper-3.4.10/zkData
增加如下配置
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
(3)同步zoo.cfg配置文件
[atguigu@hadoop102 conf]$ xsync zoo.cfg
(4)配置参数解读
server.A=B:C:D。
A是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
B是这个服务器的ip地址;
C是这个服务器与集群中的Leader服务器交换信息的端口;
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
选举机制
第一次选举
(1)服务器1启动,此时只有它一台服务器启动了,它发出去的报文没有任何响应,所以它的选举状态一直是LOOKING状态。
(2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。
(3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader。
(4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了。
(5)服务器5启动,同4一样当小弟。
其他概念
SID:服务器ID。 用来唯一标识一胎ZooKeeper集群中的机器,每台机器不能重复,和myid一致。
ZXID:事务ID。 用来标识一次服务器状态的变更。ZXID与ZK中的服务器对于客户端“更新请求”的处理逻辑有关。
Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加。
非第一次选举
- 当一台机器运行期间没有与leader保持连接,如果有leader,直接同步。
- 如果不存在leader,或者leader挂了。
脚本
jpsall
#! /bin/bash
echo ======================集群节点状态====================
for host in hadoop101 hadoop102 hadoop103
do
echo ====================== $host ====================
ssh $host "/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/bin/jps"
done
echo ======================执行完毕====================
zk.sh 参数
#!/bin/bash
case $1 in
"start"){
for i in hadoop101 hadoop102 hadoop103
do
echo ----------zookeeper $i 启动----------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
echo
done
}
;;
"stop"){
for i in hadoop101 hadoop102 hadoop103
do
echo ----------zookeeper $i 停止----------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
echo
done
}
;;
"status"){
for i in hadoop101 hadoop102 hadoop103
do
echo ----------zookeper $i 状态----------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
echo
done
}
;;
esac
客户端命令
本文来自博客园,作者:NeverLateThanBetter,转载请注明原文链接:https://www.cnblogs.com/do-it-520/p/zookeeper.html
韶华易逝,不能虚度年华。