zookeeper
分布式的、开源的分布式应用程序协调服务,原本是Hadoop、HBase的一个重要组件
1)文件系统:znode
2)通知机制:watch
节点类型:持久化、持久化顺序、临时、临时顺序
Zookeeper通知机制:服务端节点发生变化,客户端收到通知(客户端在znode上添加watch,watch触发一次,watch将会被删除)
1.命名服务 2.配置管理 3.集群管理 4.分布式锁 5.队列管理
Paxos算法是分布式选举算法,Zookeeper使用的 ZAB协议(Zookeeper原子广播)
相同点:
都有Leader,多个Follower,Leader要等待超半数的Follower做出正确反馈之后才进行提案;二者都有一个值来代表Leader的周期。
不同点:
ZAB用来构建高可用的分布式数据主备系统(Zookeeper),Paxos是用来构建分布式一致性状态机系统。分布式Zookeeper选举Leader服务器的算法与Paxos有很深的关系。
水平动态扩展:因此新版本加入了Observer
客户端对ServerList的轮询机制是什么
随机,客户端在初始化( new ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) )的过程中,将所有Server保存在一个List中,然后随机打散,形成一个环。之后从0号位开始一个一个使用。
两个注意点:
Server地址能够重复配置,这样能够弥补客户端无法设置Server权重的缺陷,但是也会加大风险。(比如: 192.168.1.1:2181,192.168.1.1:2181,192.168.1.2:2181).
如果客户端在进行Server切换过程中耗时过长,那么将会收到SESSION_EXPIRED. 这也是上面第1点中的加大风险之处。
master/slave之间通信
Storm:定期扫描
PtBalancer:节点监听
ZooKeeper集群中服务器之间是怎样通信的?
Leader服务器会和每一个Follower/Observer服务器都建立TCP连接,同时为每个F/O都创建一个叫做LearnerHandler的实体。LearnerHandler主要负责Leader和F/O之间的网络通讯,包括数据同步,请求转发和Proposal提议的投票等。Leader服务器保存了所有F/O的LearnerHandler。
创建的临时节点什么时候会被删除,是连接一断就删除吗?延时是多少?
连接断了之后,ZK不会马上移除临时数据,只有当SESSIONEXPIRED之后,才会把这个会话建立的临时数据移除。因此,用户需要谨慎设置Session_TimeOut
在getChildren(String path, boolean watch)是注册了对节点子节点的变化,那么子节点的子节点变化能通知吗
不能
zookeeper是否会自动进行日志清理?如何进行日志清理?
zk自己不会进行日志清理,需要运维人员进行日志清理
是否可以拒绝单个IP对ZK的访问,操作
ZK本身不提供这样的功能,它仅仅提供了对单个IP的连接数的限制。你可以通过修改iptables来实现对单个ip的限制
ZK为什么不提供一个永久性的Watcher注册机制
不支持用持久Watcher的原因很简单,ZK无法保证性能。
使用watch需要注意的几点,Watches通知是一次性的,必须重复注册。
发生CONNECTIONLOSS之后,只要在session_timeout之内再次连接上(即不发生SESSIONEXPIRED),那么这个连接注册的watches依然在。
节点数据的版本变化会触发NodeDataChanged,注意,这里特意说明了是版本变化。存在这样的情况,只要成功执行了setData()方法,无论内容是否和之前一致,都会触发NodeDataChanged。
对某个节点注册了watch,但是节点被删除了,那么注册在这个节点上的watches都会被移除。
同一个zk客户端对某一个节点注册相同的watch,只会收到一次通知。
Watcher对象只会保存在客户端,不会传递到服务端。
开源客户端---ZkClient介绍
Github上一个开源的zk客户端,由datameer的工程师Stefan Groschupf和Peter Voss一起开发
– 解决session会话超时重连 – Watcher反复注册 – 简化开发api – 还有..... – https://github.com/sgroschupf/zkclient
开源客户端---Curator介绍
1. 使用CuratorFrameworkFactory工厂的两个静态方法创建客户端 newClient()
2. Start()方法启动
connectString 分开的ip:port对
retryPolicy 重试策略,默认四种:Exponential BackoffRetry,RetryNTimes ,RetryOneTime,
RetryUntilElapsed
sessionTimeoutMs 会话超时时间,单位为毫秒,默认60000ms
connectionTimeoutMs 连接创建超时时间,单位为毫秒,默认是15000ms