zookeeper

简介:

主要是用来维护和监控一个目录节点树中存储的数据的状态(维护一致性)

Path类型:

PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失;

PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;

EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时,这种节点会被自动删除;

EPHEMERAL_SEQUENTIAL:临时自动编号节点

注:Zookeeper 中的目录节点权限不具有传递性,父目录节点的权限不能传递给子目录节点

访问权限:目录节点 ACL(访问权限)

perms:ALL、READ、WRITE、CREATE、DELETE、ADMIN

id:标识了访问目录节点的身份列表。默认:ANYONE_ID_UNSAFE = new Id("world", "anyone") 和 AUTH_IDS = new Id("auth", "") 分别表示任何人都可以访问和创建者拥有访问权限

基础概念:

Watcher 观察者模式:

可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的 Watcher

KeeperState:

Disconnected

NoSyncConnected

SyncConnected

AuthFailed

ConnectedReadOnly

SaslAuthenticated

Expired

EventType node变更

None

NodeCreated

NodeDeleted

NodeDataChanged,就算设置重复的数据也会有该事件

NodeChildrenChanged

AsyncCallback

DataCallback getData

ACLCallback setACL

ChildrenCallback getChildren

StatCallback exisit

StringCallback

VoidCallback

Children2Callback

Zookeeper一致性协议Zab,保证应用程序的HA和一致性

同类算法:分布式一致性算法(二阶段提交、paxos算法、raft算法)

场景使用

1.存储公共配置信息

1.集群中A机器创建一个PERSISTENT类型的/data目录,如下:zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE,

CreateMode.PERSISTENT);

2.其他机器在getData的时候添加watcher监控,一旦/data节点下的数据发送变化,则zookeeper服务器通知所有注册上来的观察者,回调它们的watcher方法,从而实现配置统一

2.集群管理

1.master创建一个root节点,并且调用getChild("/root",true)方法,设置对root目录子节点的监控

2.datanode create 一个EPHEMERAL节点

3.触发master的Watcher process方法调用,在Globl配置中添加datanode ip或其他信息

3.master选主

由于master可能要做些特别的事情,比如发放任务给task节点,那么如何选出一台master节点(每台机器创建一个EPHEMERAL_SEQUENTIAL节点,然后zookeeper把seq最低的节点选举为master,当节点断开后,再从中选seq最低的节点为master)

4.提供分布式同步支持(分布式锁等功能)

你可能感兴趣的:(zookeeper)