ZooKeeper 基本介绍

Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储, Zookeeper 作用主要是用来维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理。

1  Zookeeper基本框架

Zookeeper集群主要角色有Leader,Learner(Follower,Observer(当服务器增加到一定程度,由于投票的压力增大从而使得吞吐量降低,所以增加了Observer。)以及client:

Leader:领导者,负责投票的发起和决议,以及更新系统状态

Follower:接受客户端的请求并返回结果给客户端,并参与投票

Observer:接受客户端的请求,将写的请求转发给leader,不参与投票。Observer目的是扩展系统,提高读的速度。

Client:客户端,想Zookeeper发起请求。

Zookeeper的基本框架图如下

Leader主要功能:

恢复数据;

维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。PING消息是指Learner的心跳信息;REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;ACK消息是Follower的对提议的回复,超过半数的Follower通过,则commit该提议;REVALIDATE消息是用来延长SESSION有效时间。

Follower基本功能:

向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);

接收Leader消息并进行处理;

接收Client的请求,如果为写请求,发送给Leader进行投票;

Observer主要功能同Follower的唯一不同的地方就是observer不会参加leader发起的投票。

Zookeeper配置介绍:

tickTime :基本事件单元,以毫秒为单位。这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

dataDir :存储内存中数据库快照的位置,顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

clientPort :这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

initLimit:这个配置项是用来配置 Zookeeper 接受客户端初始化连接时最长能忍受多少个心跳时间间隔数,当已经超过 5 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒。

syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒

server.A = B:C:D : A表示这个是第几号服务器,B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader。

Zookeeper集群下的基本操作:

查看各Zookeeper服务角色:

基本命令操作:

./zookeeper/server004/zookeeper/bin/zkCli.sh

2  Zookeeper基本介绍

Zookeeper 的数据结构是一个树形结构 ,非常类似于一个标准的文件系统。每个子节点项都有唯一的路径标识,如 Server1 节点的标识为 /NameService/Server1。

1). Znode

Zookeeper数据结构中每个节点称为Znode,每个Znode都有唯一的路径,znode 可以有子节点目录,并且每个 znode 可以存储数据。znode是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据。

Znode 基本类型 :

PERSISTENT:持久化znode节点,一旦创建这个znode点存储的数据不会主动消失,除非是客户端主动的delete。

PERSISTENT|SEQUENTIAL:顺序自动编号的znode节点,这种znoe节点会根据当前已近存在的znode节点编号自动加 1,而且不会随session断开而消失。

EPHEMERAL:临时znode节点,Client连接到zk service的时候会建立一个session,之后用这个zk连接实例创建该类型的znode,一旦Client关闭了zk的连接,服务器就会清除session,然后这个session建立的znode节点都会从命名空间消失。总结就是,这个类型的znode的生命周期是和Client建立的连接一样的。

PHEMERAL|SEQUENTIAL:临时自动编号节点,znode节点编号会自动增加,但是会随session消失而消失。

Zookeeper它只负责协调数据,一般 Znode上的数据都比较小以Kb为测量单位。Zookeeper的client和server的实现类都会验证znode存储的数据是否小于1M。如果数据比较大时,Server之间进行数据同步会消耗比较长的时间,影响系统性能。

2).Watcher

Zookeeper中znode产生某种行为(事件)时,如何让客户端得到通知,进行相关操作?Zookeeper中使用Watcher机制,可以针对ZooKeeper服务的“操作”来设置观察,该服务的其他操作可以触发观察。

Zookeeper中的watcher机制类型:

Exists:在path上执行NodeCreated ,NodeDeleted ,NodeDataChanged .

getData Watcher: 在path上执行 NodeDataChanged ,NodeDeleted .

getChildrenWatcher:在paht上执行NodeDeleted .或在子path上执行NodeCreated ,NodeDeleted 。

Zookeeper中对于某个节点设置Watcher是一次性的,在Znode上watcher触发后会删除该Watcher,所以如果需要对某个Znode节点进行长期关注,在事件触发后,需要在该Znode上重置Watcher。

3).基本操作

创建节点:

Stringcreate(String path,byte[] data, List<ACL> acl,CreateMode createMode)

创建一个给定的目录节点 path, 并给它设置数据,CreateMode 标识有四种形式的目录节点

删除节点:

void delete(String path,int version)

删除 path 对应的目录节点,version 为 -1 可以匹配任何版本,也就删除了这个目录节点所有数据

查询节点是否存在:

Stat exists(String path,boolean watch/Watcher watcher)

判断某个 path 是否存在,并设置是否监控这个目录节点

获取节点数据:

byte[] getData(String path,boolean watch, Stat stat)

获取这个 path 对应的目录节点存储的数据,数据的版本等信息可以通过 stat 来指定,同时还可以设置是否监控这个目录节点数据的状态

设置节点数据:

Stat setData(String path,byte[] data, int version)

给 path 设置数据,可以指定这个数据的版本号,如果 version 为 -1 怎可以匹配任何版本

获取节点的子节点:

List<String> getChildren(String path,boolean watch)

获取指定 path 下的所有子目录节点,同样 getChildren方法也有一个重载方法可以设置特定的 watcher 监控子节点的状态

3  Zookeeper的基本应用

1.      分布式锁

基本思想:

1)首先创建一个作为锁目录(znode),通常用它来描述锁定的实体,称为:/lock_node

2)希望获得锁的客户端在锁目录下创建znode,作为锁/lock_node的子节点,并且节点类型为有序临时节点(EPHEMERAL_SEQUENTIAL);

3)当前客户端调用getChildren(/lock_node)得到锁目录所有子节点,不设置watch,接着获取小于自己的兄弟节点

4)获取小于自己的节点不存在,说明当前客户端顺序号最小,获得锁,结束。

5)若果存在,客户端监视(watch)相对自己次小的有序临时节点状态

6)如果监视的次小节点状态发生变化,则跳转到步骤3,继续后续操作,直到退出锁竞争。

基本代码:

try{

if(lockName.contains(splitStr)) {

thrownew Exception("lockName can not contains \\u000B");

}

mynode= zookeeper.create(lockRoot + "/" + lockName + splitStr,

newbyte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE,

CreateMode.EPHEMERAL_SEQUENTIAL);

List<String>childrenList = zookeeper.getChildren(lockRoot, true);

List<String>childrenName = new ArrayList<String>();

for(String children : childrenList) {

String node =children.split(splitStr)[0];

if(node.equals(lockName)) {

childrenName.add(children);

}

}

Collections.sort(childrenName);

//查询自己是否为最小节点,为最小节点即可获得锁

if(mynode.equals(lockRoot + "/" + childrenName.get(0))) {

returntrue;

}

StringsubMyNode = mynode.substring(mynode.lastIndexOf("/") + 1);

/***

* 找自己的邻节点

*/

waitnode= childrenName.get(Collections.binarySearch(childrenName,

subMyNode)- 1);

2.     分布式队列:

一种是常规的先进先出队列;

另一种是要等到队列成员聚齐之后的才统一按序执行。

3.     Zookeeper与Hbase

HRegionServer把自己以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况
    Zookeeper避免HMaster单点问题。

4.     tbschedule/codis:配置管理

Zookeeper能够很容易的实现集群管理的功能,如有多台 Server 组成一个服务集群,那么必须要一个“总管”知道当前集群中每台机器的服务状态,一旦有机器不能提供服务,集群中其它集群必须知道,从而做出调整重新分配服 务策略。同样当增加集群的服务能力时,就会增加一台或多台 Server,同样也必须让“总管”知道。

时间: 2024-10-12 20:33:10

ZooKeeper 基本介绍的相关文章

Zookeeper简单介绍

转自:ZooKeeper学习第一期---Zookeeper简单介绍 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术--分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的后果.这时,有人可能会说这个简单,写一个调 度算法就轻松解决了.说这句话的人,可能对分布式系统不是很了解,所以才会出现这种误解.如果这些进程全部是跑在一台机上的

zookeeper(一) 介绍

在过去,每个应用都是单个程序,跑在单一CPU的单一服务器上.现在不一样了.在大数据和云计算的世界里,应用都是由许多独立的程序运行在一组不断变化的机器上. 协调这些独立程序的行为 比起单一程序来困难的多.这样很容易导致开发人员陷入协调的逻辑而没有时间来实现正确的应用逻辑,或者反过来,花很少的时间来简单做主逻辑协调从而导致了脆弱的,不可靠的单点故障. ZooKeeper就是为健壮服务而设计的,这样可以使开发人员能够主要集中在应用程序的逻辑上而不是服务器之间的协调逻辑.它暴露一些简单的API,受文件系

ZooKeeper系列之二:Zookeeper应用介绍与安装部署大神必学

前言最近有很多粉丝反映怎么学好java?Zookeepr是什么? java开发技术不是一两天就能学好的,Zookeepr也是一样的道理,关键还得看你怎么去学,跟谁去学,俗话说的好师傅领进门,修行靠个人,这个不是短时间类所能完成的任务,有想法的上方关注,下方留言"学习"我教你!1 Zookeeper概述#ZooKeeper是一个为分布式应用所设计的分布的.开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务.Zo

ZooKeeper学习第一期---Zookeeper简单介绍

该系列来源 http://www.cnblogs.com/wuxl360/p/5817471.html 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术--分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的后果.这时,有人可能会说这个简单,写一个调 度算法就轻松解决了.说这句话的人,可能对分布式系统不是很了解,所以才会出现这种误

ZooKeeper入门介绍

ZooKeeper提供一个集中式服务,包括配置维护.服务命名.分布式同步.组管理.子服务常用于分布式应用. Zookeeper是什么: ZooKeeper是一个典型的分布式数据一致性的解决方案,分布式程序可以基于它实现诸如数据发布/订阅.负载均衡.命名服务.分布式协调通知.集群管理.master选举.分布式锁.分布式队列等功能.ZooKeeper可以保证如下分布式一致性特性. 顺序一致性:从同一个客户端发起的事务请求,最终将严格按照其发起顺序被应用到ZooKeeper中. 原子性:更新操作要么成

zookeeper 的介绍以及c api的使用

一.zookeeper 的安装与配置: 1.zookeeper安装 下载:https://zookeeper.apache.org/  建议下载zookeeper 3.4.6稳定版的, 3.5版本的在搭建集群时,会出现服务启动失败的错误. 安装: 解压 即可 安装C 语言 api: 进入./zookeeper/src/c目录 ./configure make make install 2.集群配置 Zookeeper 的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和

Zookeeper简单介绍(转载)

转载自:http://www.cnblogs.com/sunddenly/p/4033574.html 1.ZooKeeper概述 ZooKeeper是一种为分布式应用所设计的高可用.高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务.由于ZooKeeper的开源特性,后来我们的开发者在分布式锁的基础上,摸索了出了其他的使用方法:配置维护.组服务.分布式消息队列.分布式通知/协调等. 注意:ZooKeeper性能上的特点决定了它能够用在大型的.分布式的系统当中.从可靠性方面来说,它并

ZooKeeper全面介绍

ZooKeeper简介 ZooKeeper是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. ZooKeeper是Apache的子项目,之前是Hadoop项目的一部分,使用Java实现,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取. ZooKeeper基本概念 角色 ZooKeeper中的角色主要有以下三类,如下表所示: 系统模型如图所示: 设计目的

zookeeper原理介绍

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt354 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其发展历程无需赘述.在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的.可扩展的.分布式的.可配置的协调机制