zookeeper教程

Zookeeper 它作为Hadoop项目中的一个开源子项目,是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务

1、zookeeper能够实现哪些场景:

订阅发布、分布式锁、负载均衡、id生成器、分布式队列、统一命名服务器、master选举。

订阅发布:watcher机制

分布式锁:redis,zookeeper,数据库

ZooKeeper提供的常见服务如下 :

  • 命名服务 - 按名称标识集群中的节点。它类似于DNS,但仅对于节点。

  • 配置管理 - 加入节点的最近的和最新的系统配置信息。

  • 集群管理 - 实时地在集群和节点状态中加入/离开节点。

  • 选举算法 - 选举一个节点作为协调目的的leader。

  • 锁定和同步服务 - 在修改数据的同时锁定数据。此机制可帮助你在连接其他分布式应用程序(如Apache HBase)时进行自动故障恢复。

  • 高度可靠的数据注册表 - 即使在一个或几个节点关闭时也可以获得数据。

2、Znode被分为持久(persistent)节点,顺序(sequential)节点和临时(ephemeral)节点。

  • 持久节点  - 即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。

  • 临时节点 - 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。(-e)

  • 顺序节点 - 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路径更改为 /myapp0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。 (-s)

3、Watches(监视)

监视是一种简单的机制,使客户端收到关于ZooKeeper集合中的更改的通知。客户端可以在读取特定znode时设置Watches。Watches会向注册的客户端发送任何znode(客户端注册表)更改的通知。

Znode更改是与znode相关的数据的修改或znode的子项中的更改。只触发一次watches。如果客户端想要再次通知,则必须通过另一个读取操作来完成。当连接会话过期时,客户端将与服务器断开连接,相关的watches也将被删除。

客户端在向zookeeper服务器注册Watcher的同时,会将watcher对象存储在客户端的WatchManager中。当zookeeper服务器端触发watcher事件后,会向客户端发送通知,客户端线程会从watcherManager中取出对应的Watcher对象来执行回调逻辑。

zk=new Zookeeper("xxx:2181",5000,new GetChildren_Usage());

zk.getchildren(path,true);

GetChildren_Usage 实现watcher接口,实现public void process(WatchedEvent event);

process方法是watcher接口的一个回调方法,当zookeeper向客户端发送一个watcher事件通知时,客户端会对相应的process方法进行回调,从而实现对事件的处理。WatchedEvent包含了一个事件的三个基本属性,通知状态(keeprstate)、事件类型(eventType)和节点路径(path)。

4、数据节点的数据结构

@InterfaceAudience.Public
public class Stat implements Record {
  private long czxid; // 该数据节点被创建时的事务id
  private long mzxid; // 该数据节点被修改时最新的事物id
  private long ctime; // 该数据节点创建时间
  private long mtime; // 该数据节点最后修改时间
  private int version; // 当前节点版本号(可以理解为修改次数,每修改一次值+1)
  private int cversion;// 子节点版本号(子节点修改次数,每修改一次值+1)
  private int aversion; // 当前节点acl版本号(acl节点被修改次数,每修改一次值+1)
  private long ephemeralOwner; // 临时节点标示,当前节点如果是临时节点,则存储的创建者的会话id(sessionId),如果不是,那么值=0
  private int dataLength;// 当前节点数据长度
  private int numChildren; // 当前节点子节点个数
  private long pzxid; // 当前节点的父级节点事务ID
  public Stat() {
  }
}

 5、znode被用来存储 byte级 或 kb级 的数据,可存储的最大数据量是1MB

6、权限:

 zookeeper中设置ACL权限的格式由<schema>:<id>:<acl>三段组成。

 schema:      word:表示任何人都可以访问 auth:只有认证的用户可以访问 digest:使用username :password用户密码生成MD5哈希值作为认证ID host/ip:使用客户端主机IP地址来进行认证。

 acl:给一个节点赋予哪些权限,节点的权限有create,、delete、write、read、admin 统称 cdrwa

 7、基本概念

客户端会话:在zookeeper中,一个客户端连接是指客户端和服务器之间的TCP长连接,从客户端第一次连接开始,会话的生命周期也开始了,通过这个连接,客户端可以通过心跳检测与服务器保持有效的会话,发送请求与接收响应,接收watch事件通知,在sessionTimeOut期间,重新连接集群中的任意一台服务器,会话仍然有效。

 8、ZAB协议

应用:

注册中心(监听+temp结点)

分布式锁(创建顺序结点,后面的结点监听前面的结点,最小的结点获取锁)(zookeeper分布式锁和redis分布式锁相比,因为大量的创建、删除节点性能上比较差,并不是很推荐。)

分布式队列(顺序结点)

配置结点(监听)

原文地址:https://www.cnblogs.com/yaohuiqin/p/11308592.html