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

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

一、ZooKeeper基础介绍

1.1 动物园也要保障安全

  zookeeper是hadoop下面的一个子项目,用来协调跟hadoop相关的一些分布式的框架,如hadoop, hive, pig等, 其实他们都是动物,所以叫zookeeper ——“动物园管理员”。动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被动物所观赏。为了让各种不同的动物呆在它们应该呆的地方,而不是相互串门,或是相互厮杀,就需要动物园管理员按照动物的各种习性加以分类和管理,这样我们才能更加放心安全的观赏动物。

1.2 进程内的协调方法

  在实际应用中,Zookeeper主要是针对大型分布式系统进行高可靠的协调。由这个定义我们知道zookeeper是个协调系统,作用的对象是分布式系统。说到协调,我们可以联想到的现实生活中很多十字路口的交通协管,他们手握着小红旗,指挥车辆和行人是不是可以通行。如果我们把车辆和行人比喻成运行在计算机中的单元(线程),那么这个协管是干什么的?很多人都会想到,这不就是锁么?对,在一个并发的环境里,我们为了避免多个运行单元对共享数据同时进行修改,造成数据损坏的情况出现,我们就必须依赖像锁这样的协调机制,让有的线程可以先操作这些资源,然后其他线程等待。对于进程内的锁来讲,我们使用的各种语言平台都已经给我们准备很多种选择。例如在C#中,最常用的莫过于借助语法糖lock构造同步块:

  int Withdraw(int amount)
    {
        if (balance < 0)
        {
            throw new Exception("Negative Balance");
        }

        lock(thisLock)
        {
            if (balance >= amount)
            {
                Console.WriteLine("Balance before Withdrawal :  " + balance);
                Console.WriteLine("Amount to Withdraw        : -" + amount);
                balance = balance - amount;
                Console.WriteLine("Balance after Withdrawal  :  " + balance);
                return amount;
            }
            else
            {
                return 0;
            }
        }
    }

1.3 分布式环境中的协调

  在进程内进行协调我们可以使用语言,平台,操作系统等为我们提供的机制。那么如果我们在一个分布式环境中呢?也就是我们的程序运行在不同的机器上,这些机器可能位于同一个机架,同一个机房又或不同的数据中心。在这样的环境中,我们要实现协调该怎么办?那么这就是分布式协调服务要干的事情。

  于是,Google创造了Chubby,而ZooKeeper则是对于Chubby的一个开源实现。

       

Definition:ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。由于ZooKeeper的开源特性,后来我们的开发者在分布式锁的基础上,摸索了出了其他的使用方法:配置维护、组服务、分布式消息队列分布式通知/协调等。

1.4 ZooKeeper的应用场景

  (1)统一命名服务

  有一组服务器向客户端提供某种服务(例如:使用LVS技术构建的Web网站集群,就是由N台服务器组成的集群,为用户提供Web服务),我们希望客户端每次请求服务端都可以找到服务端集群中某一台服务器,这样服务端就可以向客户端提供客户端所需的服务。对于这种场景,我们的程序中一定有一份这组服务器的列表,每次客户端请求时候,都是从这份列表里读取这份服务器列表。那么这分列表显然不能存储在一台单节点的服务器上,否则这个节点挂掉了,整个集群都会发生故障,我们希望这份列表时高可用的。高可用的解决方案是:这份列表是分布式存储的,它是由存储这份列表的服务器共同管理的,如果存储列表里的某台服务器坏掉了,其他服务器马上可以替代坏掉的服务器,并且可以把坏掉的服务器从列表里删除掉,让故障服务器退出整个集群的运行,而这一切的操作又不会由故障的服务器来操作,而是集群里正常的服务器来完成。这是一种主动的分布式数据结构,能够在外部情况发生变化时候主动修改数据项状态的数据机构。Zookeeper框架提供了这种服务。这种服务名字就是:统一命名服务,它和javaEE里的JNDI服务很像。

  (2)分布式锁服务

  当分布式系统操作数据,例如:读取数据、分析数据、最后修改数据。在分布式系统里这些操作可能会分散到集群里不同的节点上,那么这时候就存在数据操作过程中一致性的问题,如果不一致,我们将会得到一个错误的运算结果,在单一进程的程序里,一致性的问题很好解决,但是到了分布式系统就比较困难,因为分布式系统里不同服务器的运算都是在独立的进程里,运算的中间结果和过程还要通过网络进行传递,那么想做到数据操作一致性要困难的多。Zookeeper提供了一个锁服务解决了这样的问题,能让我们在做分布式数据运算时候,保证数据操作的一致性。

  (3)配置管理

  在分布式系统里,我们会把一个服务应用分别部署到n台服务器上,这些服务器的配置文件是相同的(例如:我设计的分布式网站框架里,服务端就有4台服务器,4台服务器上的程序都是一样,配置文件都是一样),如果配置文件的配置选项发生变化,那么我们就得一个个去改这些配置文件,如果我们需要改的服务器比较少,这些操作还不是太麻烦,如果我们分布式的服务器特别多,比如某些大型互联网公司的hadoop集群有数千台服务器,那么更改配置选项就是一件麻烦而且危险的事情。这时候zookeeper就可以派上用场了,我们可以把zookeeper当成一个高可用的配置存储器,把这样的事情交给zookeeper进行管理,我们将集群的配置文件拷贝到zookeeper的文件系统的某个节点上,然后用zookeeper监控所有分布式系统里配置文件的状态,一旦发现有配置文件发生了变化,每台服务器都会收到zookeeper的通知,让每台服务器同步zookeeper里的配置文件,zookeeper服务也会保证同步操作原子性,确保每个服务器的配置文件都能被正确的更新。

  可以看出,zookeeper是一个典型的观察者模式的应用。

  (4)集群管理

  集群管理是很困难的,在分布式系统里加入了zookeeper服务,能让我们很容易的对集群进行管理。集群管理最麻烦的事情就是节点故障管理,zookeeper可以让集群选出一个健康的节点作为master,master节点会知道当前集群的每台服务器的运行状况,一旦某个节点发生故障,master会把这个情况通知给集群其他服务器,从而重新分配不同节点的计算任务。Zookeeper不仅可以发现故障,也会对有故障的服务器进行甄别,看故障服务器是什么样的故障,如果该故障可以修复,zookeeper可以自动修复或者告诉系统管理员错误的原因让管理员迅速定位问题,修复节点的故障。大家也许还会有个疑问,master故障了,那怎么办了?zookeeper也考虑到了这点,zookeeper内部有一个“选举领导者的算法”,master可以动态选择,当master故障时候,zookeeper能马上选出新的master对集群进行管理。

PS:关于Master的选举,可以浏览Suddenly的这篇:http://www.cnblogs.com/sunddenly/p/4033574.html,其文章有一部分叫做分布式锁应用场景,对于Master选举有一个详细的介绍。

二、ZooKeeper集群模式环境搭建

2.1 ZooKeeper集群模式典型架构

  (1)典型架构图如下所示:

  (2)本次试验架构图如下所示:

2.2 ZooKeeper集群模式搭建步凑

注意:ZooKeeper服务器集群规模不小于3个节点,要求各服务器之间系统时间要保持一致;

  (1)通过FTP工具上传ZooKeeper安装包,我这里使用的是3.4.5版本:

  下载地址:http://pan.baidu.com/s/1qWyoFhU

  (2)解压ZooKeeper安装包,并将解压后的文件夹名称改为zookeeper:

  ①tar -zvxf zookeeper-3.4.5.tar.gz

  ②mv zookeeper-3.4.5 zookeeper

  (3)修改环境变量:vim /etc/profile

  增加一行:export ZOOKEEPER_HOME=/usr/local/zookeeper

  修改PATH:export PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH

  ③使配置生效:source /etc/profile

  (4)进入zookeeper的conf目录下,修改文件名:mv zoo_sample.cfg  zoo.cfg

  (5)编辑zoo.cfg:vim zoo.cfg

  修改dataDir=/usr/local/zookeeper/data
  新增server.0=hadoop-master:2888:3888
      server.1=hadoop-slave1:2888:3888
      server.2=hadoop-slave2:2888:3888

  (6)创建data文件夹,并创建myid文件:

  新建data文件夹:mkdir /usr/local/zookeeper/data

  新建myid文件:vim myid,并设置第一台server为0。

  (7)复制zookeeper目录至其余两台服务器中:

  ①scp /usr/local/zookeeper hadoop-slave1:/usr/local/

  scp /usr/local/zookeeper hadoop-slave2:/usr/local/

  (8)复制环境变量配置文件至其余两台服务器中:

  ①scp /etc/profile hadoop-slave1:/etc

  scp /etc/profile hadoop-slave2:/etc

  (9)在其余两台服务器中修改myid文件:设置为1和2;

  (10)启动ZooKeeper,分别在三个节点中执行命令:zkServer.sh start

  (11)检验ZooKeeper集群节点角色状态,分别在三个节点中执行命令:zkServer.sh status

Role:ZooKeeper中包含以下角色:

领导者(leader),负责进行投票的发起和决议,更新系统状态;

学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票;observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度;

三、ZooKeeper简单测试

  搭建好集群环境后,就可以进行简单的读写一致性测试了,这里我们通过进入zookeeper的bin目录下的zkCli.sh来完成下面的操作:

  (1)在其中一个节点192.168.80.100上执行一个写操作:create /MyTest test

  (2)在其他两个节点上执行读操作:get /MyTest

  TIP:可以在一个节点中通过zkCli.sh -server hadoop-slave1:2181来远程登录

  (3)在其中一个节点192.168.80.101上执行一个修改操作:

  (4)在其他两个节点上执行读操作:

参考资料

(1)张善友,《zookeeper分布式锁服务》:http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html

(2)夏天的森林,《分布式网站架构后续:zookeeper技术浅析》:http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3113923.html

(3)横刀天笑,《Zookeeper—Zookeeper是什么?》:http://www.cnblogs.com/yuyijq/p/3391945.html

(4)Suddenly,《Hadoop日志Day20—ZooKeeper》:http://www.cnblogs.com/sunddenly/p/4033574.html

作者:周旭龙

出处:http://www.cnblogs.com/edisonchou/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

时间: 2024-10-06 23:46:57

Hadoop学习笔记—14.ZooKeeper环境搭建的相关文章

Hadoop学习笔记(3)——分布式环境搭建

Hadoop学习笔记(3) ——分布式环境搭建 前面,我们已经在单机上把Hadoop运行起来了,但我们知道Hadoop支持分布式的,而它的优点就是在分布上突出的,所以我们得搭个环境模拟一下. 在这里,我们采用这样的策略来模拟环境,我们使用3台ubuntu机器,1台为作主机(master),另外2台作为从机(slaver).同时,这台主机,我们就用第一章中搭建好的环境来. 我们采用与第一章中相似的步骤来操作: 运行环境搭建 在前面,我们知道,运行hadoop是在linux上运行的.所以我们单机就在

Cocos2dx 学习笔记整理----开发环境搭建

最近在学习cocos2dx,预备将学习过程整理成笔记. 需要的工具和环境整理一下: 使用的版本 cocos2dx目前已经出到了v3.1.1,学习和项目的话还是用2.2.3为宜,毕竟不大想做小白鼠,并且学习了几天之后才发出3.X版本的,版本内容变动比较大. 开发环境 1 jdk 1.6以上 2 python 2.7为宜(创建项目要用的) 3 NDT+Android SDK 4 Cygwin或者MinGW 开发工具 1 Eclipse + CDT + ADT 2 VS2010 3 Sublime T

[java基础学习笔记]Java8SE开发环境搭建、第一个Java Hello World、Java程序的编译与执行

本文作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/25745945 主要内容: ---------------------------------------------------| 1.JDK的下载与安装                            | 2.编写第一个java程序HelloWorld     | 3.编译执行HelloWorld                      

oracle学习笔记1(环境搭建)

学习的开始先剧透一下,本人有点笨,本来想用oracle vbox,装个red hat+oracle,但是虚拟机一直报错,0x00000000内存不能written.所以便想到其他的办法,刚好接触了golang,然后就知道了docker这个伟大的项目,所以本环境使用docker来搭建.省去了一大部分时间可以直接开始Oracle的学习. 特此留下笔记,以供参考.... 工具:一共需要三个工具 docker-install.exe DockerToolbox-1.12.0.exe SecureCRT.

IBatis .NET 开发学习笔记&mdash;&mdash;.NET 开发环境搭建

大家好,今天给大家带来的是web应用程序配置,至于windows应用程序或者其他类型解决方案可以相同的配置,web应用程序配置文件为web.config,windows应用程序是app.config. 通过以下步骤可以建立属于你自己的环境: 1.首先,肯定是打开Visual Studio(文章后面简称VS),如果你有其他工具开发,我也不介意,反正我用VS,VS目前最新版是2013,不过我喜欢复古,所以,我目前用安装VS2010来当作教程,不管目前是多少版本了,都可以同理得到. 2.然后,新建一个

php学习笔记1--开发环境搭建:apache+php+mysql

php开发环境搭建:apache + php + mysql1.下载apache,php及mysql安装包2.安装apache:下载的apache若是.msi可直接双击,按指示一步一步安装:(若操作系统为win8则,不能通过双击安装.msi,需要以管理员身份运行cmd,在cmd中进入.msi安装包所在目录,然后运行该.msi文件方可安装)若是压缩包,则先解压然后以管理员身份运行cmd,在cmd中进入到apache解压后的目录,进入bin子目录,找到httpd.exe,在cmd中输入httpd -

汇编学习笔记(7)-NASM环境搭建(nasm with vs2017)

前言 前面已经提到了为什么从MASM转到NASM,并且也简单的介绍了一下MASM和NASM在伪指令和程序结构上的差异,现在就来搭建一下NASM的编译.开发.调试环境吧. 参考资料: http://blog.csdn.net/duweix/article/details/19911967 http://blog.csdn.net/cashey1991/article/details/6773927 http://www.mouseos.com/assembly/nasm02.html http:/

ODB学习笔记之基础环境搭建

一,简介 ODB是应用于C++的一个开源.跨平台.跨数据库的对象关系映射(ORM)系统. 它可以让你持久化C++对象到关系数据库,而不必处理表.列或者SQL,无需手动编写任何映射代码. ODB支持MySQL,SQLite,PostgreSQL,Oracle和微软SQL Server关系数据库以及C ++98/03和C ++11语言标准. 它还配备了用于Boost和Qt可选的配置文件,让你可以无缝地使用这些库持久化C++类的值类型.容器和智能指针. 它有易用性,简洁的代码,安全,数据库可移植性,优

angular2.0学习笔记1.开发环境搭建

开发环境, 1.安装Node.js®和npm, node 6.9.x 和 npm 3.x.x 以上的版本. 更老的版本可能会出现错误,更新的版本则没问题. 控制台窗口中运行命令 node -v 和 npm -v,来查看版本 2. 运行 npm config set registry https://registry.npm.taobao.org 因为国内访问http://npmjs.org(angular2.0组件库) 的站点访问经常不是很顺畅,所以换成淘宝的镜像, 3. 然后全局安装 Angu