大数据之Zookeeper集群搭建

摘要:
构建Hadoop集群的第一步是构建Zookeeper。Zookeeper如何存储?Zookeeper的应用场景?动物园管理员可以大大减少系统耦合。Zookeeper可以确保只能成功创建一个客户端,不成功的客户端需要注册/排除_锁节点侦听。Zookeeper的数据同步机制可以很好地实现这个场景。Zookeeper集群是一个基于主从架构的高可用集群。群集中的所有主机节点都具有以下三种角色之一。当Zookeeper集群中的服务器出现以下两种情况之一时,需要进入Leader选举。

Hadoop集群搭建第一步,就是搭建Zookeeper。Zookeeper是什么?为什么第一步就是要搭建Zookeeper?

  Zookeeper是什么?

  官方是这样描述Zookeeper的,“ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。”。

  看上去第一眼好像不太懂,就是觉得非常的高大上,换做我理解的话来说,Zookeeper呢是搭建在一个分布式的Hadoop集群上的一种资源协调式服务,是一个开源的分布式协调服务框架 ,主要用来解决分布式集群中应用系统的一致性问题和数据管理问题。就是复制监控管理一些集群内的软件状态,比如说Zookeeper的选举机制呢,能在Hadoop集群中的主机宕机之后迅速选举出另一个节点当做主机继续工作。Zookeeper呢本质上来说是一个分布式文件管理系统,但是不适用存放大文件,适合存放小文件,可以把它当做是一个分布式的小型的文件数据库。

  Zookeeper的机制?

  Zookeeper的机制呢可以用下面这个图来便于理解:

    大数据之Zookeeper集群搭建第1张

   意思呢就是在多个服务器直接通过挂在一个进程然后通过网络来进行一个同步数据与监控节点是否存活的作用。

  Zookeeper的存储方式?

  Zookeeper存储文件的方式是一个又一个的Znode,Znode就是Zookeeper中的节点,Znode是可以携带数据的,那么我们访问数据其实就是通过Znode的路径来进行访问,Znode的路径也可以被称之为Znode的Name。所以根据这些特性,Zookeeper可以提供类似一个文件管理系统的功能,可以通过操作文件系统方式进行操控Zookeeper。比如通过路径来获取Znode和Znode上携带的数据,也可以对Znode进行新增、删除、修改。

  Zookeeper的应用场景?

   数据发布/订阅系统,需要发布者将数据发布到Zookeeper的节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。发布/订阅一般有两种设计模式:推模式和拉模式,服务端主动将数据更新发送给所有订阅的客户端称为推模式;客户端主动请求获取最新数据称为拉模式。Zookeeper采用了推拉相结合的模式,客户端向服务端注册自己需要关注的节点,一旦该节点数据发生变更,那么服务端就会向相应的客户端推送Watcher事件通知,客户端接收到此通知后,主动到服务端获取最新的数据。

   命名服务,命名服务是分步实现系统中较为常见的一类场景,分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等,通过命名服务,客户端可以根据指定名字来获取资源的实体,在分布式环境中,上层应用仅仅需要一个全局唯一的名字。Zookeeper可以实现一套分布式全局唯一ID的分配机制。

     分布式协调/通知Zookeeper中特有的Watcher注册于异步通知机制,能够很好地实现分布式环境下不同机器,甚至不同系统之间的协调与通知,从而实现对数据变更的实时处理。通常的做法是不同的客户端都对Zookeeper上的同一个数据节点进行Watcher注册,监听数据节点的变化(包括节点本身和子节点),若数据节点发生变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并作出相应处理。

在绝大多数分布式系统中,系统机器间的通信无外乎 心跳检测、工作进度汇报和系统调度 。
①心跳检测,不同机器间需要检测到彼此是否在正常运行,可以使用Zookeeper实现机器间的心跳检测,基于其临时节点特性(临时节点的生存周期是客户端会话,客户端若当即后,其临时节点自然不再存在),可以让不同机器都在Zookeeper的一个指定节点下创建临时子节点,不同的机器之间可以根据这个临时子节点来判断对应的客户端机器是否存活。通过Zookeeper可以大大减少系统耦合。
②工作进度汇报,通常任务被分发到不同机器后,需要实时地将自己的任务执行进度汇报给分发系统,可以在Zookeeper上选择一个节点,每个任务客户端都在这个节点下面创建临时子节点,这样不仅可以判断机器是否存活,同时各个机器可以将自己的任务执行进度写到该临时节点中去,以便中心系统能够实时获取任务的执行进度。
③系统调度,Zookeeper能够实现如下系统调度模式:分布式系统由控制台和一些客户端系统两部分构成,控制台的职责就是需要将一些指令信息发送给所有的客户端,以控制他们进行相应的业务逻辑,后台管理人员在控制台上做一些操作,实际上就是修改Zookeeper上某些节点的数据,Zookeeper可以把数据变更以时间通知的形式发送给订阅客户端。

   分布式锁,分布式锁用于控制分布式系统之间同步访问共享资源的一种方式,可以保证不同系统访问一个或一组资源时的一致性,主要分为排它锁和共享锁。排它锁又称为写锁或独占锁 ,若事务T1对数据对象O1加上了排它锁,那么在整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能再对这个数据对象进行任何类型的操作,直到T1释放了排它锁。

① 获取锁,在需要获取排它锁时,所有客户端通过调用接口,在/exclusive_lock节点下创建临时子节点/exclusive_lock/lock。Zookeeper可以保证只有一个客户端能够创建成功,没有成功的客户端需要注册/exclusive_lock节点监听。

② 释放锁,当获取锁的客户端宕机或者正常完成业务逻辑都会导致临时节点的删除,此时,所有在/exclusive_lock节点上注册监听的客户端都会收到通知,可以重新发起分布式锁获取。

共享锁又称为读锁,若事务T1对数据对象O1加上共享锁,那么当前事务只能对O1进行读取操作,其他事务也只能对这个数据对象加共享锁,直到该数据对象上的所有共享锁都被释放。在需要获取共享锁时,所有客户端都会到/shared_lock下面创建一个临时顺序节点

  分布式队列有一些时候,多个团队需要共同完成一个任务,比如,A团队将Hadoop集群计算的结果交给B团队继续计算,B完成了自己任务再交给C团队继续做。这就有点像业务系统的工作流一样,一环一环地传下去.分布式环境下,我们同样需要一个类似单进程队列的组件,用来实现跨进程、跨主机、跨网络的数据共享和数据传递,这就是我们的分布式队列。Zookeeper的数据同步机制就能很好的实现这个场景。

  Zookeeper的架构?

    Zookeeper集群是一个基于主从架构的高可用集群,集群中的所有主机节点都是在下列三种角色中的一个。

      大数据之Zookeeper集群搭建第2张

  Zookeeper的选举机制?

  其实上面我们已经提到过很多次选举机制,那么Zookeeper的选举机制到底是怎么一回事呢?

  Leader选举是保证分布式数据一致性的关键所在。当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举。

  服务器启动时期的Leader选举

  若进行Leader选举,则至少需要两台机器,这里选取3台机器组成的服务器集群为例。在集群初始化阶段,当有一台服务器Server1启动时,其单独无法进行和完成Leader选举,当第二台服务器Server2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,于是进入Leader选举过程。选举过程如下
(1)每个Server发出一个投票。由于是初始情况,Server1和Server2都会将自己作为Leader服务器来进行投票,每次投票会包含所推举的服务器的myid和ZXID,使用(myid,ZXID)来表示,此时Server1的投票为(1,0),Server2的投票为(2,0),然后各自将这个投票发给集群中其他机器。

          服务器IP       主机名    myid的值
          192.168.174.100   node01     1
          192.168.174.110   node02     2
          192.168.174.120   node03     3
(2) 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器。


(3) 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下
  · 优先检查ZXID。ZXID比较大的服务器优先作为Leader。
  · 如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。
对于Server1而言,它的投票是(1,0),接收Server2的投票为(2,0),首先会比较两者的ZXID,均为0,再比较myid,此时Server2的myid最大,于是更新自己的投票为(2,0),然后重新投票,对于Server2而言,其无须更新自己的投票,只是再次向集群中所有机器发出上一次投票信息即可。

  
(4) 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于Server1、Server2而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出了Leader。


(5)改变服务器状态。一旦确定了Leader,每个服务器就会更新自己的状态,如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING。

  服务器运行时期的Leader选举

  在Zookeeper运行期间,Leader与非Leader服务器各司其职,即便当有非Leader服务器宕机或新加入,此时也不会影响Leader,但是一旦Leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮Leader选举,其过程和启动时期的Leader选举过程基本一致过程相同。

  Zookeeper的安装?

  好了前面长篇阔论那么久,终于到了我们至关重要的一步,安装。我们的Zookeeper集群规划如下:

    大数据之Zookeeper集群搭建第3张

    第一步:下载zookeeeper的压缩包,下载网址如下:

      http://archive.apache.org/dist/zookeeper/ 
    我们在这个网址下载我们使用的zk版本为3.4.9,下载完成之后上传到我们的/export/software目录下。 
   第二步:解压
    解压刚刚上川的安装包到/export/servers目录下。
    大数据之Zookeeper集群搭建第4张
  第三步:修改配置文件
    大数据之Zookeeper集群搭建第5张

     执行命令:vim zoo.cfg

     大数据之Zookeeper集群搭建第6张

   第四步:添加myid配置,仔细看了前面的话应该知道这是为了选举而配置的

    在第一台机器的/export/servers/zookeeper-3.4.9/zkdatas /这个路径下创建一个文件,文件名为myid ,文件内容为1

     命令:echo 1 > /export/servers/zookeeper-3.4.9/zkdatas/myid

  第五步:将安装配置好的安装包,通过scp 分发到其余两台机器, 命令:

    scp -r /export/servers/zookeeper-3.4.9/ node02:/export/servers/

    scp -r /export/servers/zookeeper-3.4.9/ node03:/export/servers/

  第六步:修改其余两台机器的myid内容,一个为2 ,一个为3

  第七步:启动Zookeeper,三台机器分别执行命令:

    /export/servers/zookeeper-3.4.9/bin/zkServer.sh start 

    全部执行完毕后,查看三台机器的Zookeeper启动的状态以及对应的角色

    命令:/export/servers/zookeeper-3.4.9/bin/zkServer.sh status

  自此我们就安装完Zookeeper集群了,最容易出现的问题就是安装完启动后查看状态发现说只显示服务已启动但是没有对应的角色,这时候多半两种情况,一种是你其他服务器节点还没启动,或者说你的配置文件配置错了。还一个情况就是,连启动都启动不起来,这时候可能不是你的Zookeeper的问题,可能是你的Java运行环境JDK没有安装好,或者版本错误。

  Zookeeper相关指令

  大数据之Zookeeper集群搭建第7张

 好了以上就是我了解的Zookeeper的相关知识,继续加油吧。

免责声明:文章转载自《大数据之Zookeeper集群搭建》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Redis操作命令大全(NodeJS版)Tableau可视化操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

kafka 消息队列

kafka是使用Java和Scala编写的一个快速可扩展的高吞吐量的分布式消息队列系统。 kafka将数据持久化存储到磁盘上,自带分区和副本机制,因而具有较好的持久化保证。 但是kafka的消息消费没有确认机制,可能因为consumer崩溃导致消息没有完成处理。因此不建议将kafka用于一致性较高的业务场景,kafka经常被用做日志收集和数据仓库之间的缓存...

rabbitmq+haproxy+keepalived实现高可用集群搭建

  项目需要搭建rabbitmq的高可用集群,最近在学习搭建过程,在这里记录下可以跟大家一起互相交流(这里只是记录了学习之后自己的搭建过程,许多原理的东西没有细说)。 搭建环境   CentOS7 64位   RabbitMQ 3.6.2   Keepalived 1.2.21   主机:192.168.0.1   192.168.0.2   192.16...

Docker最全教程——从理论到实战(六)

Docker最全教程——从理论到实战(六) 托管到腾讯云容器服务托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅。   自建还是托管? 在开始之前,我们先来讨论一个问题——是自建容器服务还是托管到云容器服务? 这里笔者建议大家托管到云容器服务。对于中小团队来说,很多情况下,团队中的运维人员是缺...

Zookeeper入门

Zookeeper相关介绍和选举算法、应用场景等: Zookeeper 的简介 Zookeeper是一个开源的分布式的,一个针对大型分布式系统的可靠协调系统的Apache项目。 目标是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户; ZooKeeper已经成为Hadoop生态系统的基础组件;功能包括:配置服务、名字服务、分...

redis集群如何解决重启不了的问题

redis使用集群部署,如果遇到断电或者服务器重启,当再次启动的时候,有时候会启动不了。需要使用trib的fix命令进行修复。如果修复还是不行的话,可以清除节点数据再重新建集群,前提要备份之后操作。 1.使用redis-cli连接上redis其中一台 redis-cli -c -h xxx -p 7001 输入cluster info查看当前集群的状态...

HadoopDB:混合分布式系统

HadoopDB 是一个 Mapreduce 和传统关系型数据库的结合方案,以充分利用 RDBMS 的性能和 Hadoop 的容错、分布特性。2009 年被 Yale 大学教授 Abadi 提出,继而商业化为 Hadapt,据称从 VC 那儿拉到了 10M 刀投资。 本文是对 HadoopDB 论文的总结。其中不免掺杂些自己的不成熟想法,更详细的内容,还...