zookeeper
1.zookeeper是一个分布式协调的服务框架,基于ZAB(原子广播协议,分布式锁),,主从选举(paxos)的实现,总节点数一般为奇数个(一般3-5个)
2.特点:
a.顺序一致性:客户端发起的事务请求(zk会分配一个全局的递增编号),最终将严格按照其发起的顺序被应用到zookeeper中
b.原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,即全执行或者全不执行
c.单一视图:无论客户端连接的是哪一个zookeeper服务器,其看到的服务器数据模型是一致的
d.可靠性:一旦服务器成功应用了一个事务,并对客户端响应,则该事务引起的服务器状态将会被一致保留下来,除非有另一个事务对其修改(分布式常用)
e.实时性:一旦事务被成功应用,则客户端就能立刻从服务器获取变更后的新数据,全量数据在内存中,读性能突出(12-13wQps)
3.zookeeper的CreateMode:两类,同步方式和异步方式
创建节点(znode):create:不允许递归创建节点
同步方式:zk.create("/MyRoot", "/MyRoot".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
参数1:节点路径(名称):/nodeName(不允许递归创建节点)
参数2:节点内容:要求类型是字节数组(不支持序列化方式,如需实现序列化,使用Hession、Kryo框架即可)
参数3:界定啊权限:使用Ids.OPEN_ACL_UNSAFE,一般没有太高要求的场景下
参数4:节点类型:
a. PERSISTENT:持久化节点,存储的数据不会丢失
b.PERSISTENT_SEQUENTIAL:持久化顺序节点
c.EPHEMERAL:临时节点
本次会话有效,下次则无效,可用于分布式锁 d.EPHEMERAL_SEQUENTIAL:临时顺序节点,一旦创建这个节点的客户端与服务器端口(session)超时,则会被自动删除
异步方式:同步方式上,增加两个参数
processResult(int rc, String path, Object ctx)
rc:服务端响应码 0表示调用成功 -4端口连接 -110指定节点存在 -112会话已经过期
4.zk三种角色:
a.Leader:负责客户端的writer类型请求
b.Follower:负责客户端reader类型请求,参与leader选举等
c.Observer:特殊的Follower,可接受客户端reader请求,但不参与选举(java端请求)
5.常见应用场景:
a.配置管理(机器的配置列表、运行时的开关配置、数据库配置等)
a1:数据量比较小
a2:数据内容在运行时动态发生变化
a3:集群中各个节点共享信息,配置一致
b.集群管理:
b1.当前集群中机器数量
b2.收集每天集群的运行时状态
b3.对集群中的机器进行上下线操作
c.发布与订阅:zk是一个典型的发布/订阅模式的分布式数控管理与协调框架,适合于与分布式数据的
发布与订阅
d.数据库切换
e.分部署日志收集
f.原生api不好调用,可通过Curator框架来实现
6.watch机制:watch事件是一次性触发的,当watch监视的数据发生变化时,通知设置了
该watch的client(即watcher),zookeeper的监控都是一次性,因此必须每次都设置监控
客户端串行执行:客户端Watcher回调的过程是一个串行同步的过程(不要因为一个Watcher的处理
逻辑影响了整个客户端的Watcher回调)
轻量:WatchEvent是Zookeeper整个Watcher通知机制的最小通知单元(通知状态、通知类型和节点路径)
事件类型:(znode节点操作相关)
EventType.NodeCreated
EventType.NodeDataChanged
EventType.NodeChildrenChanged
EventType.NodeDeleted
状态类型:(跟客户端实例相关)
KeeperState.Disconnected
KeeperState.SyncConnected
KeeperState.AuthFailed
KeeperState.Expired
实现Watcher,重写process方法,通过exist(path,true)或者getData(path,true)来进行watch监听
7.ZkClient和Curator基于zk原生api封装
dubbo基于ZkClient dubbox基于curator
getChildren和writeData等都不再是否进行watch的标记
zkc.subscribeDataChanges("/super", new IZkDataListener())对数据监听,对节点增删不监听
zkc.subscribeChildChanges("/super", new IZkChildListener())对增删子节点监听,对数据修改不监听
posted on 2018-03-06 18:18 xiaojiayu0011 阅读(135) 评论(0) 收藏 举报
浙公网安备 33010602011771号