Zookeeper通知机制

Zookeeper通知机制

客户端注册监听(watch)它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

Zookeeper做了什么?

1.命名服务 2.配置管理 3.集群管理 4.分布式锁 5.队列管理

命名服务

在zookeeper的文件系统里创建一个目录,即有唯一的path。在我们使用tborg无法确定上游程序的部署机器时即可与下游程序约定好path,通过path即能互相探索发现。

命名服务是分布式系统中比较常见的一类场景。在分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等——这些我们都可以统称它们为名字(Name),
其中较为常见的就是一些分布式服务框架(如RPC、RMI)中的服务地址列表,通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者的信息等。

Java中的JNDI便是一种典型的命名服务。JNDI是Java命名与目录接口(Java Naming and Directory Interface)的缩写,是J2EE体系中重要的规范之一,标准的J2EE容器都提供了对JNDI规范的实现。
因此,在实际开发中,开发人员常常使用应用服务窗口自带的JNDI实现来完成数据源的配置与管理。
使用JNDI方式后,开发人员可以完全不需要关心数据库相关的任何信息,包括数据库类型、JDBC驱动类型及数据库账户等。

ZooKeeper的命名服务有两个应用方向:

  1. ZooKeeper提供类似JNDI服务,都能够帮助应用系统通过一个资源引用的方式来实现对资源的定位与实用。
  2. 利用ZooKeeper顺序节点的特性,制作分布式的ID生成器。

配置管理

程序总是需要配置的,如果程序分散部署在多台机器上,要逐个改变配置就变得困难。现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中,
然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好。

集群管理

所谓集群管理无在乎两点:是否有机器退出和加入、选举master。

对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。
新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了。

对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。

Zookeeper分布式锁

有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。

对于第一类,我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock 节点就释放出锁。

对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。

队列管理

两种类型的队列:

1、同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。

2、队列按照 FIFO 方式进行入队和出队操作。

第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。

第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。

Zookeeper分布式协调服务

Zookeeper分布式协调服务

分布式特点:

  • 凡是分布式就有路由
  • 凡是路由就有负载
  • 凡是有负载就一定会有宕机
  • 凡是分布式就有链接
  • 凡是链接就有安全

分布式、开源、分布式应用程序协调服务。包括配置维护、域名服务、分布式同步、组服务等。

单机模式:

Mode: standalone
C/S架构
Znode 称为zk节点数据

对节点基本操作

create /monkey xxx 创建节点
set /monkey xxxxa 更新节点
get /zk_test 获取节点
delete /zk_test 一般删除(若里面不为空,无法删除)
rmr /zk_test 递归删除

节点类型:

  • 持久节点
  • 持久有序
  • 临时节点
  • 临时有序

watcher(监听作用)

get /zk_test watch 监听节点数据,一旦发生改变,可以通知

源码分析

jps 查看进程号 ===》 查看方法名

1
2
3
4
5
C:\Users\Administrator>jps
1748 Bootstrap
4788 QuorumPeerMain
2424 ZooKeeperMain
3116 Jps

ZooKeeperMain客户端入口
QuorumPeerMain服务端源码

通过源码发现:
help 帮助
history 历史

create -s /monkey xxxxx

  • 持久: 当客户端断开时,znode节点不会被删除
  • 临时: 当客户端断开时,znode节点自动删除

利用Watch机制实现 》》》 分布式配置中心

利用临时有序节点(失效删除,自增等特点) 》》》分布式任务调度

》》》分布式服务注册与订阅

znode节点属性:
cZxid = 0x2
ctime = Tue Jun 04 23:21:32 CST 2019
mZxid = 0x2
mtime = Tue Jun 04 23:21:32 CST 2019
pZxid = 0xa
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

集群模式 (选举)

zk一般部署奇数个

zoo.cfg文件修改,2888端口,添加集群机器
server.1=196.128.3.1:2888:3888
server.2=196.128.3.2:2888:3888
server.3=196.128.3.3:2888:3888

选举模式 ==> 过半选举(过半原则)
Mode: leader
Mode: follower

查看状态:
sh zkServer.sh status