zookeeper机制原理
来源:互联网 发布:淘宝店面装修多少钱 编辑:程序博客网 时间:2024/06/14 10:19
client在一个节点上设置watch,随后节点内容改变,client将获取事件。当节点内容再次改变,client不会获取这个事件,除非它又执行了一次读操作并设置watch
watch事件异步发送至观察者。比如说client执行一次写操作,节点数据内容发生变化,操作返回后,而watch事件可能还在发往client的路上。这种情况下,zookeeper提供有序保证:client不会得知数据变化,直到它获取watch事件。网络延迟或其他因素可能导致不同client在不同时刻获取watch事件和操作返回值。
Watch事件类型
ZOO_DELETED_EVENT:节点删除事件,此watch通过zoo_exists()或zoo_get()设置
ZOO_CHANGED_EVENT:节点数据改变事件,此watch通过zoo_exists()或zoo_get()设置
ZOO_CHILD_EVENT:子节点列表改变事件,此watch通过zoo_get_children()或zoo_get_children2()设置
ZOO_SESSION_EVENT:会话失效事件,客户端与服务端断开或重连时触发
ZOO_NOTWATCHING_EVENT:watch移除事件,服务端出于某些原因不再为客户端watch节点时触发
它们的实现方式都是在 Zookeeper 上创建一个 EPHEMERAL 类型的目录节点,然后每个 Server 在它们创建目录节点的父目录节点上调用 getChildren(String path, boolean watch) 方法并设置 watch 为 true,由于是 EPHEMERAL 目录节点,当创建它的 Server 死去,这个目录节点也随之被删除,所以 Children 将会变化,这时 getChildren上的 Watch 将会被调用,所以其它 Server 就知道已经有某台 Server 死去了。新增 Server 也是同样的原理。
2 Master选举
Zookeeper 如何实现 Leader Election,也就是选出一个 Master Server。和前面的一样每台 Server 创建一个 EPHEMERAL 目录节点,不同的是它还是一个 SEQUENTIAL 目录节点,所以它是个 EPHEMERAL_SEQUENTIAL 目录节点。之所以它是 EPHEMERAL_SEQUENTIAL 目录节点,是因为我们可以给每台 Server 编号,我们可以选择当前是最小编号的 Server 为 Master,假如这个最小编号的 Server 死去,由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题。
二:分布式锁
在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了 n lang=EN-US> Server 也是同样的原理。
http://blog.csdn.net/paul_wei2008/article/details/19355393
- zookeeper机制原理
- zookeeper机制原理
- 【zookeeper】事件 watch 机制 原理
- Zookeeper-Watcher机制与异步调用原理
- Zookeeper-Watcher机制与异步调用原理
- zookeeper的工作原理与选举机制
- Zookeeper的关键机制的实现原理
- zookeeper 原理
- zookeeper 原理
- zookeeper原理
- Zookeeper原理
- zookeeper原理
- zookeeper原理
- zookeeper原理
- zookeeper原理
- zookeeper原理
- zookeeper原理
- Zookeeper原理
- android应用程序如何调用支付宝接口
- MyEclipse安装插件的几种方法
- 求二叉树第k层节点个数
- Spring Security使用总结(高级
- PowerDesigner导出oracle数据库表SQL文时带双引号
- zookeeper机制原理
- C语言字符串操作总结大全(超详细)
- Android Studio 小知识 文件无法读写解决
- Distinct Subsequences
- [原]nginx折腾记(HTTP性能能测试,与Apache对比)
- IOS SDK详解之UIAlertController(IOS8之后替代AlertView和ActionSheet)
- 通过命令行执行adb shell am broadcast发送广播通知。
- javaee学习之路(二十二)JavaMail
- Mark一下