zookeeper字面意思就是动物园管理者,在hadoop大数据生态圈,使用到的功能组件大多是以动物作为图标,因此顾名思义。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 /opt/zookeeper-3.4.14 L01:/opt/ scp /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
#启动命令行客户端操作 zkCli.sh [-server host:port] #查看znode结构zookeeper中没有相对路径 ls 绝对路径 #创建znode # -s创建有序号的znode # -e创建临时znode create [-s] [-e] 路径 数据 # 查看数据 get 路径 # 修改数据 set 路径 数据 # 退出 quit4.核心原理 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
引入相关依赖
org.apache.zookeeper zookeeper 3.4.14
编写实现类
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);
}
}



