分布式架构是中心化的设计。就是一个主控机连接多个处理节点,因此保证主控机高可用性十分关键.分布式锁是解决该问题的较好方案,多主控机抢一把锁.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. .xcodeprok cannot be opened because the project file cannot be parsed

    用svn更新代码后,打开xcode工程文件出现 xxx..xcodeproj cannot be opened because the project file cannot be parsed. 这 ...

  2. Linux CURL的安装

    Linux CURL的安装  Linux CURL的安装   --获得安装包,从网上直接下载或者其他途径,这里直接wget# wget http://curl.haxx.se/download/cur ...

  3. Linux下查看某个进程的网络带宽占用情况

    说明: 1.可能查看某个进程的带宽占用需要明确知道PID.进程名字.发送速度.接收速度. 2.很遗憾,在Linux原生的软件中没有这样的一款,只能额外装,最符合以上的情况就只有nethogs. 3.n ...

  4. 我的一次Postgre数据库Insert 、Query性能优化实践

    一.前言 以前的系统由于表设计比较复杂(多张表,表与表直接有主从关系),这个是业务逻辑决定的. 插入效率简直实在无法忍受,必须优化.在了解了Postgre的Copy,unlogged table 特性 ...

  5. PS Tips: powershell 将文件以utf8格式打开并另存

    1. powershell 将文件以utf8格式打开并另存 Get-Content .\rep_position_liquidity.csv -Encoding UTF8 | Set-Content ...

  6. JAVA常见算法题(四)

    package com.xiaowu.demo; /** * 将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. * * * @author WQ * */ public class ...

  7. 《Linux性能及调优指南》----1.1 Linux进程管理

    翻译:飞哥 ( http://hi.baidu.com/imlidapeng ) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance ...

  8. Nginx user_agent、if指令及全局变量

    Nginx user_agent.if指令及全局变量 1.User_agent User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CP ...

  9. MyBatis Generator生成DAO——序列化

    MyBatis Generator生成DAO 的时候,生成的类都是没有序列化的. 还以为要手工加入(開始是手工加入的),今天遇到分页的问题,才发现生成的时候能够加入插件. 既然分页能够有插件.序列化是 ...

  10. vue-router $route

    1.$route 除了 $route.params 外,$route 对象还提供了其它有用的信息,例如,$route.query (如果 URL 中有查询参数).$route.hash 等等