大数据知识点全讲解之Zookeeper
大数据知识点全讲解之Zookeeper
Zookeeper概述
zookeeper是一个开源的分布式协调服务框架,主要用来解决分布式集群中应用系统的一致性问题和数据管理问题
Zookeeper由文件系统和通知机制构成
- Zookeeper从设计模式上来看是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册
- 一旦数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式
另外,Zookeeper支持Java和C语音,是Hadoop和Hbase的重要组件
Zookeeper特点
Zookeeper本质上是一个分布式文件系统,适合存放小文件,也可以理解为一个数据库;Zookeeper中存储的是一个又一个 Znode ,Znode是Zookeeper中的节点
Znode
-
ZooKeeper数据模型的结构与Linux文件系统很像,整体上可以看作是一棵树,树的每个节点称做一个Znode
-
Znode是有路径的,例如
/data/host1
,这个路径可以理解为是Znode的Name -
Znode也可以携带数据,每一个znode默认能够存储1MB的数据,每个znode都可以通过其路径唯一标识
-
每个Znode由3个部分组成:
stat(状态信息)
data(与该Znode关联的数据)
children(该Znode下的子节点)
Zookeeper数据结构
上文已经介绍过Znode及其特性,而正是因为Znode的特性,所以Zookeeper可以对外提供一个类似于文件系统的视图,可以通过操作文件系统的方式操作Zookeeper
- 使用路径获取Znode
- 获取Znode携带的数据
- 修改Znode携带的数据
- 删除Znode
- 添加Znode
节点类型:
临时节点:该节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,也可手动删除。临时节点不允许拥有子节点
永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作时,它们才能被删除
除此之外Znode还有序列化特性,在创建时指定的话,会在Znode名字后面自动追加%10d
(10位数字,没有数值的用0补充)
这样变回存在4种类型的Znode节点:
- PERSISTENT:持久化节点,默认类型
- PERSISTENT_SEQUENTIAL:持久化顺序编号节点
- EPHEMERAL:临时节点
- EPHEMERAL_SEQUENTIAL:临时顺序编号节点
Zookeeper角色
Leader(领导者)
- Leader是集群工作的核心,集群内部各个服务器的调度者
- 负责进行投票的发起和决议,更新系统状态
- 处理事务性(写操作)请求
- 参与集群投票
Follower(跟随者)
- Follower用于接收客户端请求并向客户端返回结果
- 处理客户端非事务(读操作)请求
- 转发事务请求给Leader
- 在选主过程中参与投票
Observer(观察者)
- Observer用于接收客户端请求,并想客户端返回结果
- 处理客户端非事务(读操作)请求
- 转发事务请求给Leader
- 不参与投票
Observer的目的是为了扩展系统,提高读取速度
其中Leader被称为领导者,Follower和Observer被称为学习者
Client(客户端)
请求发起方
Zookeeper应用场景
- 数据发布/订阅
- 命名服务
- 分布式协调/通知(心跳检测、工作进度汇报和系统调度)
- 分布式锁
- 分布式队列
现阶段无法展开细说,日后会在文章末位更新Zookeeper在这些场景中具体起到的作用和工作流程
Zookeeper选举
Zookeeper选举流程大致如下:
1.每个Server发出一个投票(包括了nyid和ZXID)
2.接受来自各个服务器的投票(互相发送)
3.处理投票:(这里有一个半数机制)
优先检查ZXID
如果ZXID相同,那么就比较myid
4.统计投票
5.改变服务器状态
半数机制:
集群中半数以上机器存活,集群可用
具体举例:
假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的
1启动,选自己
2启动,选自己(比1大,12选2)
3启动,选自己(123都选3,超过半数)当选leader
4启动,已有leader3
5启动,已有leader3
Leader选举触发时机:
- 服务器初始化启动
- 服务器运行期间无法和Leader保持连接
Leader选举是保证分布式数据一致性的关键所在!!!
Zookeeper搭建
具体步骤可以参考我的博文,很详细:
于Hadoop集群上进行的zookeeper配置、时间同步
Zookeeper的Shell客户端操作
登录Zookeeper客户端(在zookeeper所在的路径下)
bin/zkCli.sh -server 主机名:2181
常用命令:
操作实例
列出Path下的所有Znode
ls /
创建永久节点
create /hello
创建临时节点
create -e /abc
修改节点数据
set /hello zookeeper
删除节点
delete /hello #如果要删除的节点有子Znode则无法删除
rmr /hello #如果有子Znode则递归删除
列出历史记录
history
Znode属性
每个Znode都包含了一系列属性,通过命令get,可以获得节点的属性
dataVersion:数据版本号
cversion:子节点的版本号
aclVersion:ACL的版本号
cZxid:Znode创建的事务id
mZxid:ZNode被修改的事务id,Zxid越大,说明操作越新
ctime:节点创建时的时间戳
mtine:节点最新一次更新发生时的时间戳
ephemeralOwner:如果该节点为临时节点,ephemeralOwner值表示与该节点绑定的session id;如果不是,ephemeralOwner值为0