分布式架构是中心化的设计。就是一个主控机连接多个处理节点,因此保证主控机高可用性十分关键.分布式锁是解决该问题的较好方案,多主控机抢一把锁.Zookeeper就是一套分布式锁管理系统,用于高可靠的维护元数据.

一、应用

1、集群模式

集群模式下配置多个Zookeeper节点,启动Zookeeper集群,Zookeeper会依据配置投票选举一个节点获得分布式锁。

关键配置举例:

# The Cluster servers

#server.1=192.168.1.10:2887:3887

#server.2=192.168.1.11:2888:3888

#server.3=192.168.1.12:2889:3889

以上配置的几个Zookeeper节点会相互投票,直到选举出一个Leader,其它节点为follower.

2、单机模式

不配置信息,启动时会自己主动选取当前节点为Zookeeper主控节点.

使用Zookeeper:

获取Zookeeperclient。Zookeeper同一时候提供了C和Java的client訪问接口,主要框架是用Java语言实现。Javaclient使用举例,调用程序须要指定zookeeper连接地址和port号。实例化时client会自己主动创建session并连接zookeeper集群。代码例如以下:

ZooKeeper zooKeeper=new ZooKeeper(ip:port,timeout,null);

通过以上方式获取zookeeper的client就能够进行zookeeper的操作了。演示样例操作检查节点是否存在,不存在则创建该节点并赋值:

Stat stat=zooKeeper.exists(path,false);

byte[] bytes=values;

if(stat==null)

{

zooKeeper.create(path,bytes,Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);

}

else

{

zooKeeper.setData(path,bytes,-1);

}

删除某节点:

zooKeeper.delete(path,version);

更新某个节点数据:

byte[] bytes=values;

zooKeeper.setData(path,bytes,-1);

二、投票算法

集群模式下有例如以下配置:

# The Cluster servers

#server.1=192.168.1.10:2887:3887

#server.2=192.168.1.11:2888:3888

#server.3=192.168.1.12:2889:3889

每个Zookeeper节点上有一个唯一的id。投票算法能够在配置文件里自行指定採用哪种投票算法,选择优先级最高的是先比較事务序列.向其它节点发送投票时须要将投票的id与事务序列发送出去,先比較事务序列,事务序列最大的首先被选择,假设事务序列同样则考虑id中最大的选取出来作为leader,其它节点被选为follower,操作数据会以leader为主,其它节点将数据从leader中merge过来。

关键代码:

if((newZxid>curZxid)||(newZxid==curZxid)&&(newId>curId))

return true;

else

return false;

启动时:

1、每一个节点向集群中全部节点包含发送节点自身发送投票,投票推荐自己为主控机.

2、将接受到的票中最大的ID的选出推荐为自己节点的投票.本地保存各个节点发来的投票,并计算,将ID最大的挑出。计算投该ID的票数。假设超过半数则终止投票选举此ID为主控,并向其它节点发送通知,假设没有超过半数则向各个节点发送自己推荐的投票并反复第二步操作.

三、元数据

1、元数据数据模型

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXJwX3NzZHV0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

2、操作

ZooKeeper中元数据的组织结构是树形的,用户能够使用/a/b/c的形式来使用元数据,它提供了create,exists,delete,getData,setData,getChildren.

create:创建节点

exsits:检查是否有指定名称的节点

delete:删除某个节点

getData:获取某个节点的值。返回的是字节流

setData:给某个节点上赋值,參数是字节流

getChildren:得到指定节点下的子节点

3、元数据的存储

从总体架构上看,zookeeper存储元数据上就是一个分布式文件系统,可是有不同之处,zookeeper的每一个节点上保存的数据都是整个系统全部数据独立完整的一份,能够说是follower节点上的数据都是leader节点上的数据备份。

在确定了leader与follower之后,数据都去操作leader,并同一时候将数据备份到follower中,这样一来即使leader挂掉,能够再次自己主动投票从follower中选出leader,同一时候数据也是最新的,最大可能的保证了可用性。

4、通信协议

Zookeeper中投票时须要不同节点之间进行通信投票。而投票不须要确认对方是否一定每一个投票都收到,而且为了提高投票的效率节约时间。投票通信时採用的通信方式是UDP,示比例如以下:

byte responseBytes[]=new byte[48];

ByteBuffer responseBuffer=ByteBuffer.wrap(responseBytes);

DatagramPacket responsePacket=new DatagramPacket(responseBytes,responseBytes.length);

mySocket=new DatagramSocket(port);

5、zooKeeper节点配置信息维护——JMX

为了方便zookeeper节点管理,zookeeper的节点管理採用了JMX。演示样例:

在MBeanRegistry注冊节点:注冊节点实现ZKMBeanInfo接口:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXJwX3NzZHV0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

当须要改动或调用节点相关信息能够直接从本地JMX中取到。

兴许会不断完好更新……

Hadoop学习笔记(二)——zookeeper使用和分析的更多相关文章

  1. Hadoop-HBASE案例分析-Hadoop学习笔记<二>

    之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X概述第八章的笔记 主要介绍HBase,一个分布式数据库的应用案例. 案例概况: 1)时间序列数据库(OpenTSD ...

  2. Hadoop学习笔记—14.ZooKeeper环境搭建

    从字面上来看,ZooKeeper表示动物园管理员,这是一个十分奇妙的名字,我们又想起了Hadoop生态系统中,许多项目的Logo都采用了动物,比如Hadoop采用了大象的形象,所以我们可以猜测ZooK ...

  3. hadoop 学习笔记二

    NameNode的持久化(persistent)(day4,1) 类似于:Redis redis中的持久化文件是相互独立的当两个持久化文件同时存在时默认使用的是aof ,但是namenode 的持久化 ...

  4. hadoop学习笔记:zookeeper学习(上)

    在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookeeper的一些基本的应用,同时我 ...

  5. Hadoop学习笔记1---简介 优点 架构分析

    一.Hadoop简介 Hadoop最早起源于Nutch.Nutch是一个开源的网络搜索引擎,由Doug Cutting于2002年创建.Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取. ...

  6. Hadoop学习笔记二

    一.设置无密码sudo权限,不用在普通用户和root用户间来回切换 chmod u+w /etc/sudoers vim /etc/sudoers #首行添加如下的内容: hadoop ALL=(ro ...

  7. ZooKeeper学习笔记二:API基本使用

    Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...

  8. Hadoop学习笔记系列

    Hadoop学习笔记系列   一.为何要学习Hadoop? 这是一个信息爆炸的时代.经过数十年的积累,很多企业都聚集了大量的数据.这些数据也是企业的核心财富之一,怎样从累积的数据里寻找价值,变废为宝炼 ...

  9. Hadoop学习笔记(2)

    Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...

  10. Hadoop学习笔记(2) ——解读Hello World

    Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...

随机推荐

  1. IO模型同步与异步阻塞与非阻塞的区别

    同步异步的区别 关注点:同步和异步关注的是消息通信机制 同步:所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主 ...

  2. Mac上Git的安装与简单使用

    一.安装: Git下载地址: http://git-scm.com/downloads/ 下载Git.配置Git: http://blog.csdn.net/reactor1379/article/d ...

  3. DIV层+CSS实现锁屏

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  4. 关于MySQL Cluster集群NoOfReplicas参数问题

    摘自:http://www.itpub.net/thread-1845295-1-1.html 官方网站上说参数NoOfReplicas的值表示数据的备份份数,例如:NoOfReplicas=2,若在 ...

  5. vs2012 webservice创建

    第一步:打开VS2012,新建空项目,注意选择.NET Framework的版本.这里我选择的是.NET Framework 4 新建好项目后,在项目中添加一个WebService项 打开这个文件,我 ...

  6. EasyUi datagrid鼠标的悬停效果

    /*easyui,鼠标划过悬浮,显示一个小提示框的方法*/ { field : 'goodsName', title : '标的描述', width : 200, align : 'center', ...

  7. ios开发中APP底部上滑不能调出如WiFi、蓝牙、播放等的设置页面的解决的方法

    在开发的APP中我们通常通过手动底部上滑来调出WiFi.蓝牙.飞行模式等的设置页面.有时我们开发的APP无法调出. 解决的方法: 进入iPhone "设置" --> &quo ...

  8. Java迭代器原理

    1迭代器模式 迭代器是一种设计模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 一般实现方式如下:(来自)

  9. linux中grep命令

    grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. grep常用用法 [root@www ~]# grep [-acinv] [--color=auto] '搜寻字 ...

  10. OpenCV2学习笔记(十五):利用Cmake高速查找OpenCV函数源代码

    在使用OpenCV时,在对一个函数的调用不是非常了解的情况下,通常希望查到该函数的官方声明.而假设想进一步研究OpenCV的函数,则必须深入到源码. 在VS中我们能够选中想要查看的OpenCV函数,点 ...