大数据之ZooKeeper基础介绍及安装部署

1.什么是 ZooKeeper

是一个底层的分布式协调服务工具,它是hadoop生态体系中很多分布式系统(HDFS、YARN、HBASE、KAFKA…)的基础组件

2.ZooKeeper的基本功能

为客户提供写数据的功能,要求数据信息不大,属于状态信息数据
为客户提供读取数据的功能
为用户提供数据变化时的监控功能

3.ZooKeeper的作用

分布式系统中进行主节点选举
分布式系统中主从节点的感知
分布式系统中配置文件的同步
分布式系统中动态上下线的感知

分布式系统中分布式锁的实现,分布式中的同一个对象,类似于mysql中的事务
分布式系统中的名称服务
分布式系统中的负载均衡
Zookeeper的功能其实很简单:就是提供协调服务!
协调服务具体来说有三方面:
1.帮使用者存储一些状态信息
2.帮使用者读取一些信息
3.帮使用者监视一些信息的变化,并将变化作为事件通知给使用者

4.ZooKeeper核心概念

1.Zookeeper的高度可靠性
Zookeeper是一个分布式的系统,多个节点 并且节点中记录的数据是完全一致(一致性) , 当某个zk的节点宕机之后不会影响工作 .
Zookeeper的主节点不存在单点故障!Zookeeper的主节点是可以动态选举出来的!

2.Zookeeper的选举机制(奇数台)

Zookeeper的主节点叫做 leader (1个)
从节点叫做 follower(多个)

Leader选举过程(以3个节点的集群为例):
注:每个节点的配置文件中都有一个自己的独一无二的id
zookeeper的进程在不同的工作模式下,有不同的通信端口(比如选举时,通过端口3888通信;作为leader或者follower接收客户端请求时通过端口2181;leader和follower之间通信用2888)
注意在zk集群安装的时候 会人为的为每台机器分配一个唯一的id
(1)集群初次启动时的选举流程
A、第一台机器(id=1)启动,发现没有leader,进入投票模式,投自己,并收到自己投这一票,得1票,不能当选leader(当leader的条件是,集群机器数量过半的票数)
B、第2台机器(id=2)启动,发现没有leader,进入投票模式,投自己(因为自己的id>1 收到的另一台机器的票的id)
C、第1台机器收到2的票,发现集群中有一个比自己id大的机器上线了,重新投票,投id=2
D、第2台收到的得票数为2票,过半数,自己当选,切换模式:Leader模式
E、第1台就发现有Leader存在了,自己切换模式:Follower
F、第3台启动,发现有Leader,自动进入Follower状态
如果每个节点是同时启动的zk 同时选举自己 ,同时广播 , 同时获取别人的广播,3机器会当选
(2)集群在运行过程中的选举流程
a.在某个时间点上,id=2机器挂了(leader),别的机器发现没有leader了,全体进入投票模式
b.先投自己,票中会携带(自己的id,自己的数据的版本号)
c.大家都投数据版本最新的节点做leader,如果有多个节点数据版本一样,则从中选id最大的那个作为投票目标!
从上述投票机制可以看出:
Zookeeper集群的节点数最好配置为奇数!
Zookeeper集群的节点规模一般在3~5台就够!

3.Zookeeper的数据存储模型
znode类似于Linux的目录结构(TREE) , 维护了节点的层级关系 ,
真正的数据存储是以key:value的形式存储的!

zookeeper中对数据的存储采用key-value的形式
然后,它的key有特别的格式——路径的形式!( /service/dn1 doit01 /service/dn2 doit02 )
之所以采取这种形式,是因为zookeeper中的数据节点(znode)之间可以存在父子关系;
zookeeper的数据节点分为以下类型:
永久的znode:客户一旦创建这个znode,它就会被zookeeper一直保存,除非人为删除;
短暂的znode:客户创建完这个znode后,如果客户断开与zookeeper的连接,则该数据马上会被zookeeper删除;
带序号的znode:客户创建一个key,zookeeper会为客户的key自动拼接一个递增的序号!
(客户创建的是/aaa/x ,那么zookeeper真实生成的key为: /aaa/x0000000000001
如果客户继续创建 /aaa/y,那么zookeeper真实生成的key为:/aaa/y000000000002)
另外: 永久的和短暂的,都可以跟“带序号的”特性进行组合!组合下来之后共有4种:
永久不带序号
永久且带序号的
短暂不带序号
短暂且带序号的

5.zookeeper安装部署

1上传安装包并解压
tar -zxf zookeeper-3.4.6.tar.gz -C /opt/apps/
2 在zookeeper-3.4.6目录下创建的zkData文件夹
mkdir zkData
3 修改conf文件下的配置文件zoo_sample.cfg的文件名
mv zoo_sample.cfg zoo.cfg
4. 修改zoo.cfg文件中的dataDir路径
vi zoo.cfg 设置成我们在zookeeper-3.4.6目录下创建的zkData文件夹路径
dataDir=/usr/apps/zookeeper-3.4.6/zkData
5.将以下配置信息加到zoo.cfg中的最后一行
server.1=linux01:2888:3888
server.2=linux02:2888:3888
server.3=linux03:2888:3888
6. 在各个节点的数据存储目录中,生成一个myid文件,内容为它的id
[root@doit001~]# echo 1 > /usr/apps/zookeeper-3.4.6/zkData/myid
[root@doit002~]# echo 2 > /usr/apps/zookeeper-3.4.6/zkData/myid
[root@doit003~]# echo 3 > /usr/apps/zookeeper-3.4.6/zkData/myid
7 分发安装包
[root@spark01 apps]# scp -r zookeeper-3.4.6/ spark02:/opt/apps
[root@spark01 apps]# scp -r zookeeper-3.4.6/ spark03:/opt/apps
8 启动集群
zookeeper没有自带一个批启脚本,只能手动在每一台节点上一个一个地启动
每台机器都执行
bin/zkServer.sh start zk服务启动
bin/zkServer.sh status zk 查看服务状态
bin/zkServer.sh stop zk停止服务
[root@doit01 bin]# ./zkServer.sh status
JMX enabled by default
Using config: /usr/apps/zookeeper-3.4.6/bin/…/conf/zoo.cfg
Mode: follower
也可以自己开发一个批启动脚本:
sh zk.sh start
zk.sh
#!/bin/bash
for i in 1 2 3
do
ssh linux0${i} “source /etc/profile;/opt/apps/zookeeper-3.4.6/bin/zkServer.sh $1”
done

sleep 2

if [ 1 = = s t a r t ] t h e n f o r i i n 1..3 d o s s h d o i t 0 1 == start ] then for i in {1..3} do ssh doit0 1==start]thenforiin1..3dosshdoit0{i} "source /etc/profile;/opt/apps/zookeeper-3.4.6/bin/zkServer.sh status "
done
fi

6 . zookeeper命令行客户端操作

bin/zkCli.sh 本地连接
bin/zkCli.sh -server linux02:2181 连接到指定的服务节点
(同一个集群中的zk数据信息是共享的,无论你连接到哪个节点,都可以查看到相同的数据信息)

连接后输入help获取命令帮助信息
大数据之ZooKeeper基础介绍及安装部署_第1张图片
quit 退出zk集群
查看某个路径下的key
[zk: localhost:2181(CONNECTED) 5] ls / 查看key节点名
[taoge, zookeeper]

ls2 / 查看key节点详细信息
[zookeeper]
cZxid = 0x0
ctime = Wed Dec 31 19:00:00 EST 1969
mZxid = 0x0
mtime = Wed Dec 31 19:00:00 EST 1969
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

创建一个znode create /aaa ddd 创建一个节点key为aaa,value为ddd
[zk: localhost:2181(CONNECTED) 1] create /taoge the_greatest_coder
Created /taoge
参数 -s 创建的节点有一个唯一的序号
参数 -e 临时节点 , 客户端断开以后 , 这个节点会被删除

创建一个znode的子节点 reate /aaa/bb bb
[zk: localhost:2181(CONNECTED) 4] create /taoge/hadoop 98
Created /taoge/hadoop

查看一个key的value
[zk: localhost:2181(CONNECTED) 8] get /taoge/hadoop
98
cZxid = 0x400000003
ctime = Sun Jul 07 22:59:27 EDT 2019
mZxid = 0x400000003
mtime = Sun Jul 07 22:59:27 EDT 2019
pZxid = 0x400000003
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0

删除一个znode节点
[zk: localhost:2181(CONNECTED) 11] rmr /taoge

4.2事件监听
zookeeper中对znode的变化描述有3中事件类型:
节点value变化事件
节点的子节点变化事件
节点被创建、被删除事件

对应的,客户端向zk注册监听的命令为:
get /abc watch
ls /abc watch
ls2 /abc watch
stat /abc watch

监控节点数据的变化
1)第一个客户端get /teacher watch 获取节点数据的时候监控(监控当前节点数据的变化)
2)克隆一个会话 再客户端修改节点数据的值
3)第一个客户端会出现如下信息:
WatchedEvent state:SyncConnected type:NodeDataChanged path:/teacher
监控子节点个数发生变化
第一个客户端ls /teache watch
克隆一个会话 创建一个客户端 , 在/teacher节点下创建一个新的节点/删除节点下的子节点
第一个客户端会出现如下信息:
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/teacher
注意:客户端向zk注册的事件监听,只会被通知1次!如果需要持续监听,则需要反复注册

你可能感兴趣的:(hadoop,hadoop,zookeeper)