#Zookeeper
Zookeeper是一个分布式协调服务的开源框架,主要用来解决分布式集群中应用系统的一致性问题。
#Zookeeper本质
是一个分布式的小文件存储系统,提供基于类似文件系统的目录树方式的数据存储,且可以对树中的节点进行有效管理。
集群管理的功能:统一命名服务、分布式配置管理、分布式消息队列、分布式锁、分布式协调等。
#Zookeeper特性
全局数据一致性(每个服务器都保存一份相同的数据副本,客户端连接到任意节点,数据都是一致的)
可靠性(对目录结构的增删改查等消息,只要有一台服务器接收了,那么其他台,也就是所有服务器也接收到了)
顺序性:
全局有序(全局有序指如果在一台服务器上消息A在消息B前发布,则在所有服务器上消息A都将在消息B前被发布;)
全局偏序(偏序是指如果一个消息B在消息A后被同一个发送者发布,A必将排在B前面,无论全局有序还是偏序,其目的都是为了保证Zookeeper全局数据一致。)
原子性(一次数据更新要么成功,要么失败)
实时性(在一个时间间隔范围内,获得服务器的更新信息或者服务器失效信息)
#Zookeeper集群角色
Leader(领导者):是Zookeeper集群工作的核心,也是事务性(写操作)的唯一调度和处理者。
Follower(跟随者):负责处理客户端的请求,但是不负责处理,是Leader来处理。
Observer(观察者):事务性请求转交Leader处理,不过非事务性请求可以处理。通常用于在不影响集群事务处理能力的前提下,提升集群的非事物处理能力(提高集群读的能力,也降低了集群选主的复杂程度)
Zookeeper是由节点组成的树(采用的是树状层次结构),每个节点被称为Znode。每个Znoed默认能存储1MB的数据,每个Znode都是由3部分组成,分别是stat(状态信息,描述该Znode的版本,权限信息等组成)、date(与该Znode关联的数据)和children(该Znode下的子节点)。
#Znode类型
临时节点:一旦会话结束,临时节点将会被自动删除,当然也可以手动删除。
永久节点:只有在客户端显示执行删除操作的时候,它们才能被删除。
#Znode的属性
czxid 节点被创建的Zxid 值
ctime 节点被创建的时间
mzxid 节点最后一次修改的Zxid值
mtime 节点最后一次的修改时间
pZxid 与该节点的子节点最后一次修改的Zxid值
cversion 子节点被修改的版本号
dataVersion 数据版本号
aclVersion ACL 版本号
ephermeralOwner 如果此节点为临时节点,那么该值代表这个节点拥有者的会话ID;否则值为0
dataLength 节点数据域长度
numChildren 节点拥有的子节点个数
#Zookeeper的Watch机制
Watch机制的简介:
Zookeeper提供了分布式数据发布/订阅功能,典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一主题对象。
Watch机制的特点:
一次性触发(当Watch的对象发生改变时,会触发此对象上的Watch所对应的事件,但只有一次。)
事件封装(Zookeeper 使用WatchedEvent 对象来封装服务端事件并传递 包含了 3个基本属性 即通知状态(keeperState)、事件类型(EventType)和节点路径(path) 。)
异步发送(Watch的通知事件是从服务端异步发送到客户端的)
先注册再触发(必须由客户端先去服务端注册监听,这样才会触发事件的监听,并通知给客户端。)
Watch机制的通知状态和事件类型
Zookeeper连接状态和事件类型:
Disconnected 连接失败
NodeCreated 节点被创建
SyncConnected 连接成功
NodeDataChanged 节点数据变更
AuthFailed 认证失败
NodeChildrenChanged 子节点数据变更
Expired 会话过期
NodeDeleted 节点被删除
当客户端与服务器的某一节点建立连接,要再完成一次version、zxid的同步,此时显示SyncConnected才是连接成功。
#Zookeeper环境配置
zookeeper环境配置(在etc的profile下,vim profile打开即可)
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.5/
export PATH=$PATH:$ZOOKEEPER_HOME/bin
Zookeeper安装目录复制到另外两台上去;
scp -r /opt/module/zookeeper-3.4.5/hadoop102:/opt/module/
scp -r /opt/module/zookeeper-3.4.5/hadoop103:/opt/module/
将myid分发到另外两台上去:
scp -r /opt/module/zookeeper-3.4.5/zkData/hadoop102:/opt/module/
scp -r /opt/module/zookeeper-3.4.5/zkData/hadoop103:/opt/module/
将profile文件也分发到另外两台服务器:
scp /etc/profile hadoop102:/etc/profile
scp /etc/profile hadoop103:/etc/profile
环境变量生效:
source /etc/profile
启动Zookeeper服务:
zkServer.sh start
启动需要三台虚拟机一起启动起来,并且要在30秒以内启动好,超过30秒则过期!!!
查看是否启动成功:
zkServer.sh status
关闭Zookeeper服务:
zkServer.sh stop
#Shell的相关操作
ls /(查看Zookeeper中所包含的内容)
ls2 /(查看当前节点数据,且能看到更新次数等数据)
ls -s / (查看当前节点)
help(帮助看到其他命令)
ceate /节点 "子节点"(在当前目录下创造一个节点(Znode)以及它的子节点)
eg:
create -s /testnode test(创建序列化永久节点)
create -e /testnode-temp testtemp(创建临时节点)
get /节点(获取节点包含的信息)
set /节点 "子节点"(对节点关联的子节点进行设置)
delete /节点(将节点删除)
rmr 子节点(将节点递归删除)
eg:
delete path [version] (普通删除的命令)
rmr path [version](递归删除的命令)
zkCli.sh -server localhost:2181 (连接客户端)
set /节点名-子节点 被改成的子节点(修改节点)
eg:
ls -s /
get -s /testnode-temp
set /testnode-temp 123
get -s /testnode-temp
(将temp修改为123)
get 节点名(获取节点名)
eg:
ls path [watch]
get path [watch]
ls -s path [watch]