zookeeper简介及其搭建

原创 2016年05月31日 22:04:10

zookeeper简介:

zookeeper即分布式数据同步服务,具有数据同步,分布式锁等等功能,
Zookeeper集群必须是奇数台,故要保证可靠性至少要三台。理论上至少要保证一半以上的机器运行即可。分leader和Follower。leader只有一个。Follower可以有多个,当leader宕掉后,会在在其余Follower中选举一个作为leader。
数据同步是指:每台Cilent 机器都连接一个Follower或leader。当Cilent上数据被修改后,其连接的Follower或leader上的Server会首先接收到,而leader会随时检测所有与的Follower上的Server如果有数据变化就将数据同步到其他Follower上,
hadoop2.0中使用zookeeper确保整个NameService中只有一个活跃的NameNode(会有多个代用的NameNode但处于代用状态),当一个nameNode 当掉或会启用其他的备用的NameNode。此外在Hbase集群中也会使用zookeeper来保证Hbase集群中只有一个HMaster,同时通过zookeeper将Hbase客户端、RegionServer、Master三者联系在一起。

zookeeper的安装:

第一步:修改配置文件zoo.cfg
mkdir /buaa/zookeeper-3.4.5/data创建目录/buaa/zookeeper-3.4.5/data。并修改zoo.cfg配置文件将dataDir指向该目录:

dataDir里还存储了日志信息,故dataDir不能存放在命名为tmp的文件里
同时在文件末尾添加内容:设置如下:

其中端口2888是用于进行leader选举的端口,3888是zookeeper集群中各个机器间的通讯接口。

第二步:创建文件myid

进入到创建的/buaa/zookeeper-3.4.5/data 目录下创建一个文件,文件名为myid,并添加上面对应的server的id号,例如hadoop01节点对应的servere编号为1,故myid文件中只需要输入一个1即可;其他节点如hadoop02节点中的myid文件中的内容为2。hadoop03节点中的myid文件为内容为3.

第三步:使用scp命令将配置好的zookeeper拷贝到其他机器。并修改相应的data目录下的myid文件中的id值


第四步:测试

依次启动三个机器上的zookeeper服务:./zkServer.sh start
依次在每台机器上查看当前zookeeper的状态:./zkServer.sh status
其中会有一台机器上启动的为leader两个机器上启动的是Follower.其实只要启动两台机器即可组成一个集群,集群要保证可靠性至少要三台zookeeper。理论上至少要保证一半以上的机器运行即可,所以两台就可以组成zookeeper集群。这里我们开启三台。
在一个节点上(如hadoop01)启动客户端进程并创建一个文件,之后在其它两个节点上查看数据是否同步:
[root@hadoop01 bin]# ./zkCli.sh 在hadoop01中启动客户端进程会自动连接到本地
查看器根目录,在根目录下创建一个文件/hadoop123,内容为123

之后再在hadoop02节点上启动客户端进程:并查看根目录,是否已经同步:下图显示已经同步成功


zookeeper与HDFS

在2.0之前HDFS中只有一个NameNode,但对于在线的应用只有一个NameNode是不安全的,故在2.0中对NameNode进行抽象,抽象成NamService其下包含有多个NameNode,但只有一个运行在活跃状态,因此需要zookeeper进项选举和自动转换。一旦active当掉之后zookeeper会自定进行切换将standby切换为active。

图片来源: HDFS-1623 设计文档

图片作者: Sanjay Radia, Suresh Srinivas

如上图,每一个运行NameNode的机器上都会运行一个FailoverController Active进程,用于监控NameNode,即FailoverController与NameNode 二者是运行在同一台节点上的。
1】、如上,系统中Active NameNode一旦数据发生变化,Active NameNode会将变化(edits文件)写入到介质中,通常介质使用:
       1、NFS网络文件系统;
2、依赖于zookeeper的JournalNode,当机器不是很多时可以使用JournalNode存储edits,
而一旦介质中数据发生变化,Standby的NameNode会实时同步介质中的数据,因此ActiveNameNode与处于Standby的NameNode是实时数据同步的,
2】、FailoverController Active进程会实时监控Active的NameNode并把他的信息汇报给zookeeper(由此不难理解为什么要将FailoverController与NameNode 安装在同一个节点上了吧,因为FailoverController需要实时的监控NameNode将二者放在同一个节点上),若active NameNode没有发生故障,FailoverController Active进程会每隔一段时间将监控Actice NameNode的状态,并将Active NameNode的信息发送给zookeeper。若一旦监控到Active NameNode出现问题,就会将信息汇报给zookeeper,而另一个Standby FailoverController进程与active FailoverController进程是数据同步的(通过zookeeper实现)因此,Standby FailoverController进程会同时知道Active NameNode当掉了,此时会给它监控的Standby NameNode节点发送信息,使其成为Active NameNode。

zookeeper与Hbase

Client客户端、Master、Region都会通过心跳机制(RPC通信)与zookeeper保持联系。
当在Hbase中插入或读取数据时流程如下;
1、在Client中写一个Java类运行,客户端只需要连接zookeeper,客户端会从zookeeper中得到Regionserver的映射信息,之后客户端会直接连接到Region Server,
2、RegionServer在启动之后会向zookeeper汇报信息(通过心跳RPC):本身有多少Region,有哪些数据,当前机器的运行状况等等。
3、master 启动后也会向zookeeper汇报信息,并且从zookeeper中得到Region Server的一些信息。例如当一台Region Server当掉之后,zookeeper会得知,之后Master也会通过zookeeper得到该Region Server当掉的信息。
4、当客户端Client在做DDL(创建,修改,删除表)时,会通过zookeeper获取到Master的地址,而Master中保存了表的元数据信息,之后Client就可以直接与Master进行通信,进行表的DDL操作
5、当Region中数据不断增大,MAster会向Region Serve发送指令,讲分割出来的Region进行转移,


Zookeeper:
1】保证任何时候,集群中只有一个活跃的master,因为为保证安全性会启动多个Master
2】存储所有Region的寻址入口。知道那个Region在哪台机器上。
3】实时监控Region Server的状态,将Region Server的上下线的信息汇报给HMaster。(因为每间隔一段时间,RegionServer与Master都会zookeeper发送心跳信息),Region Server不直接向Master发送信息的原因是为了减少Master的压力因为只有一个活跃的Master,所有的RegionServer同时向他汇报信息,压力太大。而若有100台RegionServer时,Region Server可以分每10台向一个zookeeper汇报信息,实现zookeeper的负载均衡。
4】存储Hbase的元数据(Schema)包括,知道整个Hbase集群中有哪些Table,每个 Table 有哪些column family(列族)

Client
Client包含了访问Hbase的接口,Client维护这些Cache来加快对Hbase的访问,比如Region的位置信息,zookeeper,zookeeper保证了任何时候急群众只有一个Master存储所有的Region中的寻址入口还有实时监控RegionServer上的状态,将RegionServer的上线和下线信息实时通知给Master,存储hbase 的Schema,包括有哪些table,每个Table有哪些Column Family

Master
Master有以下特点:
1、为RegionServer分配Region
2、负责RegionServer的负载均衡    
3、发现失效的RegionServer并重新分配其上的Region
4、HDFS上的垃圾文件回收
5、处理Schema更新请求

RegionServer有以下几点:
1、RegionServer维护Master分配给他的 Region,处理对这些Region的IO请求
2、RegionServer负责切分在运行过程中变得过大的Region,

因此可看出,Client访问Hbase上的数据的过程并不需要Master的参与(寻址访问zookeeper和Region Serve,写数据访问Region Server)Master仅仅维护着table和Region的元数据信息。负载很低。

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。

Hadoop2.x通过Zookeeper实现NameNode HA方案集群搭建-实践版

配置静态IP 执行vi /etc/sysconfig/network-scripts/ifcfg-eth0,注:每个节点IP不一样 DEVICE=eth0 HWADDR=00:0C:29:B4:3...
  • zhangli_5
  • zhangli_5
  • 2016年12月13日 15:59
  • 916

基于zookeeper的hadoop HA实现

非HA集群的弊端 HDFS集群的分布式存储是靠namenode节点(namenode负责响应客户端请求)来实现。在非HA集群中一旦namenode宕机,虽然元数据不会丢失,但整个集群将无法对外提...
  • everl_1
  • everl_1
  • 2016年08月24日 18:28
  • 5423

HDFS HA系列实验之三:HA+NFS+zookeeper

由于时间关系,原规划在Hadoop cluster2上实施HA+NFS+zookeeper的,改成了在Hadoop cluster1上实施,这样省略了ssh无密码登陆配置环节和hadoop集群配置环节...
  • book_mmicky
  • book_mmicky
  • 2014年05月13日 15:22
  • 1771

ZooKeeper 基本介绍

Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储, Zookeeper 作用主要是用来维护和监控存储的数...
  • qunqin
  • qunqin
  • 2015年03月10日 18:51
  • 9017

Zookeeper简介(浅入)让你搞明白

zookeeper,有些听说过,有些人没有,本人也是因为自己在做一个分布式的系统,由dubbo+zookeeper整合,所以接触一下。到底是什么东西?关于这个问题我首先到其官网和百度百科。其大致就是z...
  • qq_18416057
  • qq_18416057
  • 2017年02月12日 19:11
  • 3968

Zookeeper介绍

ZooKeeper提供一个集中式服务,包括配置维护、服务命名、分布式同步、组管理。子服务常用于分布式应用。...
  • tang06211015
  • tang06211015
  • 2016年07月06日 22:25
  • 525

Hadoop+Zookeeper+NameNode(HA)+ResourceManager(HA)自动切换 配置

HDFS的NameNode的NameNode的HA配置 一,zookeeper的安装(略)。 启动Zookeeper。 二,Hadoop配置文件修改。 修改core-site....
  • nacey5201
  • nacey5201
  • 2015年10月22日 18:17
  • 3465

Zookeeper系列(一)

一、ZooKeeper的背景 1.1 认识ZooKeeper ZooKeeper---译名为“动物园管理员”。动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物...
  • tswisdom
  • tswisdom
  • 2014年11月26日 20:58
  • 62761

ZooKeeper 搭建

一 概述 二 单机模式 Standalone Mode 1 下载 ZooKeeper 2 解压 ZooKeeper 346 3 配置环境变量并使之生效 4 配置 zoocfg 5 启动本地 ZooKe...
  • u011414200
  • u011414200
  • 2015年12月23日 16:04
  • 1554

Zookeeper介绍和使用

一、ZooKeeper的背景 1.1 认识ZooKeeper ZooKeeper---译名为“动物园管理员”。动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类...
  • fan_fuzi
  • fan_fuzi
  • 2017年12月07日 19:48
  • 190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:zookeeper简介及其搭建
举报原因:
原因补充:

(最多只允许输入30个字)