先看一张hadoop的HA工作机制示意图
可以看到zookeeper(基础组件)在HA的集群中,帮助管理日志系统,解决单点故障问题。
zookeeper的基本功能和应用场景
zookeeper的功能:
1.可以为客户端管理少量数据(k,v)
2.可以为客户端监听指定数据节点的状态并在数据节点发生变化时通知客户端。
应用场景:
服务器上下线的动态感知
zookeeper的整体运行机制
zookeeper的数据存储机制
数据存储形式
zookeeper中对用户的数据采用kv形式存储,只是zk有点特别:
key:是以路径的形式表示的,意味着各key之间有父子关系,比如
/ 是顶层key
用户建的key只能在 / 下作为子节点,比如建一个key: /aa 这个key可以带value数据
也可以建key: /aa/xx
zookeeper中,对每一个数据key,称作一个znode
综上所述,zk中的数据存储形式如下:
znode类型
zookeeper中的znode有多种类型:
PERSISTENT 持久的:创建者就算跟集群断开联系,该类节点也会持久存在与zk集群中
EPHEMERAL 短暂的:创建者一旦跟集群断开联系,zk就会将这个节点删除
SEQUENTIAL 带序号的:这类节点,zk会自动拼接上一个序号,而且序号是递增的
组合类型:
PERSISTENT :持久不带序号
EPHEMERAL :短暂不带序号
PERSISTENT 且 SEQUENTIAL :持久且带序号
EPHEMERAL 且 SEQUENTIAL :短暂且带序号
zookeeper的集群部署
1.上传安装包到集群服务器
2.解压
3.修改配置文件
进入zookeeper的安装目录的conf目录
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
# The number of milliseconds of each tick tickTime=2000 initLimit=10 syncLimit=5 dataDir=/root/zkdata #改目录 clientPort=2181 #autopurge.purgeInterval=1 #加zookeeper集群节点 server.1=hdp20-01:2888:3888 server.2=hdp20-02:2888:3888 server.3=hdp20-03:2888:3888
对3台节点,都创建目录 mkdir /root/zkdata
对3台节点,在工作目录中生成myid文件,但内容要分别为各自的id: 1,2,3
hdp20-01上: echo 1 > /root/zkdata/myid
hdp20-02上: echo 2 > /root/zkdata/myid
hdp20-03上: echo 3 > /root/zkdata/myid
从hdp20-01上scp安装目录到其他两个节点
scp -r zookeeper-3.4.6/ hdp20-02$PWD scp -r zookeeper-3.4.6/ hdp20-03:$PWD
启动zookeeper集群
zookeeper没有提供自动批量启动脚本,需要手动一台一台地起zookeeper进程
在每一台节点上,运行命令:
bin/zkServer.sh start
自动启动批量脚本:vi zkmanage.sh
#!/bin/bash for host in hdp1 hdp2 hdp3 do echo "${host}:$1ing..." ssh $host "source /etc/profile; /root/apps/zookeeper-3.4.10/bin/zkServer.sh $1" done sleep 2 for host in hdp1 hdp2 hdp3 do echo "${host}:status" ssh $host "source /etc/profile;/root/apps/zookeeper-3.4.10/bin/zkServer.sh status" done
启动:./zkmanage.sh start
启动后,用jps应该能看到一个进程:QuorumPeerMain,但是,光有进程不代表zk已经正常服务,需要用命令检查状态:
bin/zkServer.sh status
能看到角色模式:为leader或follower,即正常了:
zookeeper的命令行客户端操作
连接客户端
#指定某个节点连接 bin/zkCli.sh -server hdp1:2128 #或localhost连接 bin/zkCli.sh
数据管理功能:
创建节点: create /aaa 'ppppp'
查看节点下的子节点: ls /aaa
获取节点的value: get /aaa
修改节点的value: set /aaa 'mmmmm'
删除节点:rmr /aaa
数据监听功能:
ls /aaa watch
查看/aaa的子节点的同时,注册了一个监听“节点的子节点变化事件”的监听器
get /aaa watch
获取/aaa的value的同时,注册了一个监听“节点value变化事件”的监听器
再连接一个客户端,修改value,监听的节点就会有变化
注意: 注册的监听器在正常收到一次所监听的事件后,就失效