1.zookeeper概述
zookeeper字面意思就是动物园管理者,在hadoop大数据生态圈,使用到的功能组件大多是以动物作为图标,因此顾名思义。zookeeper就是在众多组件当中起到一个核心的调度管理功能。使用到的场合如下:
- 高可用集群的主备切换
- 统一资源配置管理
- 分布式锁
2.zookeeper集群搭建
1.下载解压zookeeper-3.4.14.tar到/opt目录下
2.修改配置文件
- 将解压目录下的/opt/zookeeper-3.4.14/conf/下的zoo_sample.cfg文件另外保存一份在相同的文件夹下并且改名为zoo.cfg并修改其中的配置文件
# 设置zk保存数据的路径
dataDir=/opt/zookeeper-3.4.14/data
# 设置集群的连接信息
#server.A=B:C:D
#A 每个zk服务 设置一个唯一的id号,整数
#B id对应的主机名或者ip方便识别
#C 集群内数据同步通信端口
#D 集群内选举使用的通信端口
server.100=L00:2888:3888
server.101=L01:2888:3888
server.102=L02:2888:3888
- 分发安装包到其他两台机器
scp -r /opt/zookeeper-3.4.14 L01:/opt/
scp -r /opt/zookeeper-3.4.14 L02:/opt/
-
修改个性化配置
在每台zzookeeper服务器的/opt/zookeeper-3.4.14/data目录中添加一个myid文件
创建名为myid的文件,文件中填入当前机器对应的id,必须为整数 -
配置环境变量
echo 'export ZOOKEEPER_HOME=/opt/zookeeper-3.4.14' >> /etc/profile echo 'export PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile source /etc/profile
-
启动zookeeper服务
zkServer.sh start
3.操作指令
#启动命令行客户端操作
zkCli.sh [-server host:port]
#查看znode结构zookeeper中没有相对路径
ls 绝对路径
#创建znode
# -s创建有序号的znode
# -e创建临时znode
create [-s] [-e] 路径 数据
# 查看数据
get 路径
# 修改数据
set 路径 数据
# 退出
quit
4.核心原理
1.解决高可用集群的主备切换
在高可用架构中,通常会存在多个NameNode,他们之间处于相互热备状态,但实际意义上只有一台NameNode管理众多的DataNode,当管理DataNode的NameNode出现问题或发生宕机时,为了集群正常工作,会自动切换到另一台处于热备状态中的NameNode来继续管理集群,在服务启动时多个NameNode中谁正真意义上来管理DataNode,此时就需要zookeeper来进行进一步管理。
在集群启动时,多个NameNode会去zookeeper中注册自己的状态,其中一台处于Active来管理所有的DataNode,其余的NameNode处于Standy热备状态,当处于Active的NameNode挂掉时,zookeeper会检测到,并且发送指令彻底杀死此NameNode,切换另一台处于热备状态中的NameNode来管理集群并调整状态为Active,当发生故障的NameNode修复完成以后从新启动加入到集群中,并向zookeeper注册一个Standy处于热备状态。
2.解决统一资源配置管理
在集群中通常会配置许多的配置文件,进行修改以后,要分发给集群中的所有机器,这样操作起来就显得尤为麻烦。
zookeeper提供了一种观察者模式,将配置文件写在zookeeper中,集群中的机器都同一读取zookeeper中的配置文件,并且注册一个守护线程来监听该配置文件,当配置文件进行修改时,触发守护线程,回调配置文件中的内容返回给机器。这样就方便了统一资源的修改与配置。
3.zookeeper的数据模型
4.分布式锁
分布式锁其实是利用了zookeeper数据模型的里面的有序号原理,当多个线程同时操作同一个文件时,会在zookeeper当中注册一个有序号znode,根据这个序号大小优先选择序号较小的线程进行工作,此时其他线程处在一个等待状态,当此线程工作完成释放资源,并且删除掉当前znode,从新注册一个线程添加到zookeeper当中。
5.zookeeper的选举机制
- 首次启动 半数以上选id最大
集群启动的节点数量超过半数后,id号最大的节点当选为leader,其他节点作为follower - 主从切换 leader宕机后,随机选举一个节点作为新leader
6.javaAPI操作zookeeper
引入相关依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
编写实现类
public class Zookeeper {
public static void main(String[] args) throws Exception {
String conn = "192.168.1.100:2181,192.168.1.101:2181,192.168.1.102:2181" ;
ZooKeeper zk = new ZooKeeper(conn, 3000, null);
}
}