zookeeper详解

回顾:

任务

1.结合实际需求场景详细讲解zookeeper的概念
2.完成zookeeper集群的搭建
3.简单使用zookeeper shell操作zookeeper
4.详细讲解zookeeper的java api的使用及典型的需求场景的案例代码

目标

1.深入理解zookeeper的使用场景及概念
2.熟练使用zookeeper的java api
3.理解监听集群主机上下线案例代码

第一节:zookeeper概述

1.1 什么是zookeeper
1.2 zookeeper服务的应用场景
1.3 zookeeper集群特性
1.4 zookeeper数据结构
1.5节点类型
1.6 Zookeeper 数据结构特点
  1. 每个子目录项如 NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个 znode 的标识为 /NameService/Server1
  2. znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL类型的目录节点不能有子节点目录
  3. znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
  4. znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了
  5. znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2
  6. znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的,后面在典型的应用场景中会有实例介绍
1.7 如何使用

Zookeeper作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,后面将会详细介绍 Zookeeper能够解决的一些典型问题,这里先介绍一下,Zookeeper 的操作接口和简单使用示例。

第二节 zookeeper集群的配置

2.1 集群安装

Zookeeper使用java编写,运行在jvm上,所以需要提前安装并配置好好java环境,推荐Oracle jdk1.7及以上版本。

2.2 集群的启动
2.3 集群的测试使用

在任何一台机器上执行如下命令进入zk客户端的shell

 

执行完zkcli.sh命令后进入的界面效果如下:

zk-shell

第三节 Zookeeper java API的使用

3.1 eclipse环境配置
  1. 创建一个java项目

  2. 依赖的jar包

     
3.2 基本操作
 
3.3 监听集群中主机的上下线

案例说明:

1.DistributedServer程序一运行起来就向zookeeper的/servers路径下创建一个临时节点

如该类启动三个实例时,分别为传入三个字符串,分别为   server1,server2,server3
	根据代码逻辑,会在zookeeper的/servers下创建三个EPHEMERAL_SEQUENTIAL类型的节点,节点名为
		/servers/server000001    此节点对应的value是server1   
		/servers/server000002    此节点对应的value是server2
		/servers/server000003    此节点对应的value是server3 

2.DistributedClient代码实时夺取/servers下的节点集合内容

	如 [/servers/server000001,/servers/server000002,/servers/server000003]
	说明这个客户端所在的机器,可用的集群有三台机器
DistributedClient代码监听了/servers目录的子节点,当有机器掉线时,/servers下的节点集合内容会变化的
	如 [/servers/server000001,,/servers/server000003]
	   [/servers/server000003]
	   这样也就实时感知了三台集群中机器的状态

总结:有四台机器组成的集群,如a1,a2,a3,a4其中a1是主节点;a2,a3,a4是从节点

DistributedServer代码分别运行在a2,a3,a4从节点上
DistributedClient代码运行在a1主节点上

代码如下: