分布式架构是中心化的设计。就是一个主控机连接多个处理节点,因此保证主控机高可用性十分关键.分布式锁是解决该问题的较好方案,多主控机抢一把锁.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. 关于android主线程异常NetworkOnMainThread不能访问网络

    在Android开发中,如果你使用的是Android4.0以后,那你会发现,只要是写在主线程(就是Activity)中的HTTP请求,运行时都会报错,这是因为Android在4.0以后为了防止应用的A ...

  2. 当ASP.NET Forms验证方式遭遇苹果IOS

    一.问题出现 我在用ASP.NET MVC4做微信开发的时候,用Forms验证方式做为authentication. 一般都是在web.config加: <authentication mode ...

  3. yaffs和jffs2简单比较

    转:http://blog.chinaunix.net/uid-27675161-id-3392636.html 相关知识引用<嵌入式 Linux 应用开发 完全手册>    Nand F ...

  4. jquery验证表单代码

    代码如下: //开始验证-修改用户密码 $('.editUserPwd').validate({ /**//* 设置验证规则 */ rules: { lname:{ required:true, st ...

  5. UIViewController的生命周期及iOS程序运行顺序

    当一个视图控制器被创建,并在屏幕上显示的时候. 代码的运行顺序 1. alloc                                   创建对象,分配空间 2.init (initWit ...

  6. 在vs2012中配置使用iisexpress

    在vs2012中配置使用iisexpress   vs2012支持基于iisexpress的web站点调试,这样可以尽可能与生产环境具备一样的环境. 但是,如果在vs2012中直接配置iis目录,通常 ...

  7. tensorflow TensorArray 代码例子

    import tensorflow as tf import numpy as np B=3 D=4 T=5 tf.reset_default_graph() xs=tf.placeholder(sh ...

  8. 机器学习第3课:线性代数回顾(Linear Algebra Review)

    3.1  矩阵和向量 如图:这个是 4×2 矩阵,即 4 行 2 列,如 m 为行,n 为列,那么 m×n 即 4×2 矩阵的维数即行数×列数 矩阵元素(矩阵项): Aij 指第 i 行,第 j 列的 ...

  9. xpath节点匹配简易教程

    2017-03-23 非本人原创,只是写爬虫时很有用,就留下了 <A id="a1"> <B id="b1"> <C id=&qu ...

  10. ACdreamoj 1011(树状数组维护字符串hash前缀和)

    题目链接:http://acdream.info/problem? pid=1019 题意:两种操作,第一种将字符串某个位置的字符换为还有一个字符.另外一种查询某个连续子序列是否是回文串: 解法:有两 ...