zookeeper介绍、数据模型、原理、应用场景
来源:互联网 发布:wifi网络测试 编辑:程序博客网 时间:2024/06/06 04:23
Zookeeper
• Zookerper是高性能、可扩展的分布式应用程序协调服务框架。使用java编写,支持java和C两种编程语言。
典型的应用场景:
• 统一命名服务(name service)
• 配置管理(configuration management)•leader election
• 共享锁(Locks)
• 队列管理
• 组成员关系(group membership)
设计目的
最终一致性:client不论连接那个server,展示给它的都是同一视图。
实时的一致性可以由客户端通过调用sync()方法
原子性:更新操作要么成功要么失败
可靠性:一旦一个更新操作被应用,那么在client再次更新它之前,它的值将不会改变
顺序一致性:全局有序,client的更新顺序与他们的发送顺序一致。即如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布
数据模型
类似于文件系统,像树一样的层级结构,树中的节点称为Znode,
可存储数据,并关联一个ACL
• Znodes可以是文件也可以是目录(允许有子节点)•存数的数据有限,不能超过1M
• 路径只能是绝对路径,
• 必须以『/』开头,
• 不能包含.或..
Zookeeper Znode
所在路径唯一标识;可以有子目录,且可以存储数据;有版本,可以保存多个版本的数据;每次对Zookeeper状态的改变,都生成
唯一的Zid来,其为全局有序,表示事务的顺序,如果zxid1小于zxid2,则zxid1在zxid2之前发生,
Watches:当Znode以某种方式改变时,通知客户端(应用:配置管理)
• Ephemeral Nodes:与session相同的生命周期,session失效,znode也就删除了;不能有子节点(应用:组成员管理服务)
• Sequence Nodes -- Unique Naming,会自动编号,如App1已经存在,再创建,则会自动命名为App2(应用:共享锁)
Znode stat结构
zookeeper的API
功能
描述
create 在本地目录树中创建一个节点
delete 删除一个节点
exists 测试本地是否存在目标节点
get/set data 从目标节点上读取 /写数据
get/set ACL 获取 / 设置目标节点访问控制列表信息
get children 检索一个子节点上的列表
sync 等待要被传送的数据
Zookeeper Session
• Client和Zookeeper集群建立连接,整个session状态变化如下图
• 备注:如果因为网络状态不好,client和Server失去联系,client会停留在当前状态,会尝试主动再次连接Zookeeper Server。client不能宣称自己的session expired,session expired是由ZookeeperServer来决定的,client可以选择自己主动关闭session
Zookeeper Watch
• 用于表示一个标准的事件处理器,其定义了事件通知相关逻辑。包括通知状态和事件类型,
• getData,getChildren(),exists()这三个方法可以针对参数中的path设置watcher,当path对应的Node有相应变化时,server端会给对应的设置了watcher的client发送一个一次性的触发通知事件。客户
端在收到这个触发通知事件后,可以根据自己的业务逻辑进行相 应地处理。
• 注意这个watcher的功能是一次性的,如果还想继续得到watcher通知,在处理完事件后,要重新register
zooKeeper 客户端
创建ZooKeeper对象时,应会创建一个ClientCnxn(代表了客户端连接对象)。与此同时启
动了两个线程:SendThread、EventThread。两个队列:outgoingQueue和pendingQueue。
同步调用,就是客户端成功发送请求后,才继续执行。例如:zk.create(path,data,acl,createMode)。一个线程A执行这个create时,会创建一个表示create动作的packet,放到数据发送队列outgoingQueue。之后当线程A就开始等待,直到SendThread线程从outgoingQueue队列取出该packet,并将其成功发送(已收到服务端的回应为准)。然后线程A才继续执行。
异步调用,就是客户端不会管请求是否发送成功,都会继续执行。例如:zk.create(path,data,acl,createMode,stringCallback)。一个线程A执行这个create时,会创建一个表示create动作的packet,放到数据发送队列outgoingQueue。线程A接着就去执行下一行代码了,而不会去管数据packet是否由SendThread线程发送到服务端了。
SendThread的职责
创建一个长连接,用于会话保持,通过周期性的发送ping packet到当前连接的ZooKeeper服务器实例。这个过程,我们通常称为心跳。每当客户端与服务端的连接断开后,会自动重新连接到下一个服务器。如果断开的是最后与一个服务器的连接,那么会重新连接到第一个服务器。
使用这个长连接与服务器通信:1)发送客户调用,不断的从outgoingQueue取出packet发给服务端。当发送的是Client的同步调用的packet,则在发送packet后,立即通知客户端同步调用线程继续执行。当发送的是Client的异步调用,则会将packet发给服务端,并保存到pendingQueue。当从服务端发回响应后,生成一个packet完成事件交给EventThread,由Event执行CallBack调用。2)处理服务端响应,对服务端响应反序列化后,根据响应分类进行处理如下:Ping的响应:不做处理;认证失败的响应:创建认证失败的WatchedEvent,并将event交给EventThread处理;服务端的数据变更通知:生成相应的数据变更WatchedEvent,并将event交给EventThread处理;服务端对调用的回应:不论是同步调用还是异步调用,服务端都会给出回应。收到此类回应后,先是将watcher放到watcherManager中。然后对同步、异步做后续处理。如果是同步调用,则通知发起调用的线程继续处理。如果是异步调用,则将该packet交由EventThread来处理。例如对create、delete、exists、getData、getChildren方法调用的响应。
EventThread
• 用于对接收到的packet或者event进行处理:
• 如果是event,则从WatcherManager中取出相应的Watcher进行处理。
• 如果是packet,则执行相关联的AsyncCallback
Watched Event
WatchedEvent包含三类信息:KeeperState/EventType/path
KeeperState代表和ZK服务器的连接信息,包含Disconnected\SyncConnected\AuthFailed\ConnectedReadOnly\SaslAuthenticated\Expired等6种状态。
EventType代表发生的事件类型,包含五种状态:None、NodeCreated、NodeDeleted、NodeDataChanged、NodeChildrenChanged
其中后四种用于表示ZNode的状态或者数据变更,而None则用于会话的状态变更。
• path则代表事件发生的ZNode路径。
ACL
身份验证有三种模式
digest:用户名、密码
host:通过客户端主机名来识别客户端
ip:通过客户端的ip来识别客户端
auth:使用sessionID验证
world:无验证,默认是无任何权限。该模式较为特殊,在给zk连接添加ACL中会说到
使用api中预设的ACL
OPEN_ACL_UNSAFE:完全开放。事实上这里是采用了world验证模式,由于每个zk连接都有world验证模式,所以znode在设置了OPEN_ACL_UNSAFE时,是对所有的连接开放。
CREATOR_ALL_ACL:给创建该znode连接所有权限。事实上这里是采用了auth验证模式,使用sessionID做验证。所以设置了
CREATOR_ALL_ACL时,创建该znode的连接可以对该znode做任何修改。
READ_ACL_UNSAFE:所有的客户端都可读。事实上这里是采用了world验证模式,由于每个zk连接都有world验证模式,所以znode在设置了READ_ACL_UNSAFE时,所有的连接都可以读该znode。
ZooKeeper 四字命令
ZooKeeper四字命令
功能
- zookeeper介绍、数据模型、原理、应用场景
- ZooKeeper应用场景介绍
- zookeeper原理及应用场景
- Zookeeper原理及应用场景
- 【ZooKeeper 2】ZooKeeper原理及应用场景
- zookeeper数据模型操作介绍
- ZooKeeper应用场景和原理简介
- ZooKeeper 常用应用场景原理详解
- ZooKeeper的基础原理及应用场景
- Zookeeper 介绍及典型应用场景
- zookeeper原理 使用场景
- zookeeper 使用场景介绍
- ZooKeeper原理及使用(锁,屏障,应用场景)
- ZooKeeper典型应用场景
- ZooKeeper典型应用场景
- ZooKeeper典型应用场景
- zookeeper应用场景
- ZooKeeper典型应用场景
- netstat无法显示PID或进程名
- logstash-input-jdbc插件配置细节
- java获取本机IP,系统随机分配端口号,获取当前线程ID
- jsp页面引入(引入其他jsp页面)三种方式
- JS —— 跨域问题全解与jsonp 原理理解
- zookeeper介绍、数据模型、原理、应用场景
- linux文件完整性校验
- .class反编译工具安装 集成到Eclipse
- win10 64位 安装linux虚拟主机64位
- 大小不固定的图片、多行文字的水平垂直居中
- 妙招更改iTunes备份地址释放C盘空间
- 文件上传和文件压缩下载
- oracle数据库还原步骤
- WE标准B