6. Zookeeper和 集群HA配置

作者: 奉先 | 来源:发表于2017-02-03 17:32 被阅读427次

    1. Zookeeper介绍:

    1.基本介绍:

    Zookeeper: 为分布式应用提供分布式协作(协调)服务。使用类似文件系统的树形结构。目的是分布式服务不再需要由于协作冲突而另外实现协作服务。

    Zookeeper's Hierarchical Namespace

    一般情况下Zookeeper集群的服务器数量是奇数个,2N+1, N代表允许宕机的个数,下面文章中介绍使用3台主机进行实验。

    Zookeeper集群统一为其他分布式应用(也是集群,例如HDFS集群、Yarn集群等等)集群提供协作服务

    2. Zookeeper角色。

    Zookeeper角色不是手工配置的,而是集群自动选举产生的:

    (1)Leader:做决策(做什么决策跟Zookeeper实现的功能有关),更新系统状态

    (2)Follower:接入客户端。接收客户端请求,并返回响应结果给客户端。

    (3)Observer:

    (4)Client:使用协作服务的分布式应用,例如HDFS集群。

    Zookeeper Service

    3.Zookeeper的典型应用场景:

    (1)统一命名服务(Name Service)

    (2)配置管理(Configuration Management)

    (3)集群管理(Group Membership)

    (4)共享锁(Locks)/ 同步锁

    2. Zookeeper集群环境搭建和启动:

    如果有单独的集群规划,可以在单独的机器上安装Zookeeper集群,我使用的是实验虚拟机环境,就直接在hadoop-senior01、hadoop-senior02、hadoop-senior03安装,与Hadoop共存,没有问题。

    1. 下载Zookeeper安装包:

    使用版本:zookeeper-3.4.5.tar.gz

    (1)java环境安装:

    见前边文章。

    (2)上传解压安装包:

    $ tar -zxf zookeeper-3.4.5.tar.gz -C /opt/modules/

    2. 配置Zookeeper:

    (1)复制配置文件:

    Zookeeper的主目录的conf文件夹下,有一个实例的配置文件zoo_sample.cfg,我们复制一份出来:

    $ cd /opt/modules/zookeeper-3.4.5/conf

    $ cp -a zoo_sample.cfg zoo.cfg

    $ vi zoo.cfg

    $ mkdir data

    下面通过编辑这个文件来完成Zookeeper的配置:

    (2)配置数据存储目录:

    按照开发规范,我们通常在zookeeper的安装目录下,新建一个目录data,将这个目录作为zookeeper的数据存储目录。

    dataDir=/opt/modules/zookeeper-3.4.5/data

    zoo.cfg重要参数介绍:

    tickTime:zookeeper服务器与服务器之间,或者服务器与客户端之间维持心跳的时间间隔。单位:毫秒。

    clientPort:客户端连接zookeeper服务器的端口。默认2181

    dataDir:Zookeeper保存数据的目录。

    (3)在zoo.cfg中添加服务器信息:

    格式: server.A=B:C:D  。 在zoo.cfg中添加如下内容:

    server.1=192.168.8.128:2888:3888

    server.2=192.168.8.129:2888:3888

    server.3=192.168.8.130:2888:3888

    (4)在每台服务器的$ZOOKEEPER_HOME/data/目录创建myid文件。

    在hadoop-senior01服务器(192.168.8.128)上,cd 到$ZOOKEEPER_HOME/data/目录,创建myid文件,myid文件的内容是1

    在hadoop-senior02服务器(192.168.8.129)上,cd 到$ZOOKEEPER_HOME/data/目录,创建myid文件,myid文件的内容是2

    在hadoop-senior03服务器(192.168.8.130)上,cd 到$ZOOKEEPER_HOME/data/目录,创建myid文件,myid文件的内容是3

    注意:myid文件在linux下用vi创建。

    在一台机器上配置好,拷贝到其他服务器:

    $ scp -r zookeeper-3.4.5/ natty@hadoop-senior02.pmpa.com:/opt/modules/

    3.启动Zookeeper:

    (1)启动Zookeeper:

    $ bin/zkServer.sh start

    (2)查看状态

    $ bin/zkServer.sh status

    $ jps

    注意:启动操作需要在三台服务器上都执行

    3. Zookeeper基本命令介绍

    使用命令,可以使用bin/zkCli.sh脚本

    $ bin/zkCli.sh

    在zkCli.sh进入命令行模式后,可以敲命令操作。使用help命令来查看可以使用的所有的命令。

    [zk: localhost:2181(CONNECTED) 0] ls /

    [zk: localhost:2181(CONNECTED) 1] help

    [zk: localhost:2181(CONNECTED) 2] create /test pmpa_test

    查看刚才创建的/test的信息:

    [zk: localhost:2181(CONNECTED) 4] get /test

    4. Namenode HA 介绍:

    为了防止Namenode的单点故障,Hadoop 2.x版本增加了HA(High Available 高可用)功能。在下边两种情况下,需要配置HA:Namenode机器发生意外;Namenode机器需要升级。 HDFS HA通过配置Active/Standby 两个Namenode实现在集群中对Namenode的热备。下面实现配置:使用Quorum Journal Manager(QJM) 在Active Namenode和Standby Namenode来共享edit logs。

    HDFS HA设计

    另外,在hadoop 2.x版本之前,没有自带HA功能,如果要实现此功能,可以使用Linux上的keepalived软件进行热备。

    HDFS HA设计

    1. HDFS HA using QJM 架构:

    在典型的HA集群中,Active Namenode响应客户端的操作请求,而Standby Namenode作为一个slave执行,只是保持跟Active Namenode的状态一致。Active namenode和Standby namenode为了保持一致,他们都与JournalNodes(JNs)进行通信。每当Active node修改namespace时,都会将修改日志计入JNs中,Standby node从JNs读取edit logs,并时刻监控JNs(只要Edit Logs有改动就同步),因为Standy node在时刻监控,就可以保证在故障转移发生时,Standby node的edit Logs与Active node完全一致,从而直接切换成Active状态。

    为了实现快速故障转移,Standby node必须清楚集群中数据块的位置,为datanodes配置这2个Namenods(Active/Standby),并且datanodes同时向两个namenodes发送块信息和心跳。

    在HDFS HA集群中,必须保证只有一个Active节点,否则会造成错误和混乱。

    2. 硬件资源:

    JournalNode daemon是轻量级的,可以和其他hadoop daemons(namenode,resourcemanager等)共同运行在一台主机。JournalNode主机和Zookeeper主机很相似,必须要有奇数个(2N+1)主机(最少3个),其中N代表可以宕机的数量,如果宕机的数量超过了N,JournalNode集群就不可用了。

    Standby namenode不可以代替Secondary Node的作用。

    5. Namenode HA搭建配置和测试:

    Namenode HA资源规划设计:

    Namenode HA资源配置

    Namenode HA只涉及到HDFS角色,在hadoop-senior01.pmpa.com上安装Namenode(Active),在hadoop-senior02.pmpa.com上安装Namenode(Standby)。与yarn资源不冲突。

    1. 先备份之前的hadoop安装目录:

    先停掉hdfs 和 yarn(拷贝文件夹前最好先停掉应用),在senior01上执行,停掉hdfs:

    $ sbin/stop-dfs.sh

    在senior02上执行,停掉yarn:

    $ sbin/stop-yarn.sh

    备份hadoop安装目录(Senior01):

    $ cp -ra hadoop-2.5.0/ hadoop-2.5.0_bak

    下面根据官方文档来配置HDFS HA:

    HDFS HA with QJM

    2. Namenode HA配置:

    (1)配置NN HA需要配置 hdfs-site.xml。

    a). 配置一个服务组名称,默认名字是mycluster(可任意修改),  配置项:dfs.nameservices。

    b). 配置JournalNodes,默认端口是8485,配置项:dfs.namenode.shared.edits.dir。设计图中的 “SHARED EDITS”角色。

    c). 配置JournalNodes的本地保存目录,一般情况下会在$HADOOP_HOME/data下创建一个dn目录指定之,当然可以任意指定,配置项:dfs.journalnode.edits.dir

    d). 配置代理Proxy,客户端的访问入口设置为代理,不再是之前的单独namenode。配置项:dfs.client.failover.proxy.provider.mycluster。

    e). 配置隔离,采用的sshfence,这一项为了保证两台namenode只有一台是active状态,正常情况下只有一台namenode对外提供服务。

    (2)配置core-site.xml:

    a). 配置hdfs的访问入口:访问入口需要修改成mycluster, 配置项:fs.defaultFS。

    两个配置文件内容如下:

    core-site.xml

    hdfs-site.xml

    3.同步配置:

    (1)在senior02和senior03上创建 jn目录(保存journal node文件):

    $ mkdir jn

    (2)上边修改了core-site.xml 和 hdfs-site.xml,将这2个配置文件同步senior02和senior03。

    $ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior02.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

    $ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior03.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

    4. HA with QJM 启动:

    (1)启动 JournalNode,需要在三个节点上执行:

    $ sbin/hadoop-daemon.sh start journalnode

    这时使用jps 可以看到 JournalNode 进程。

    (2)在[nn1]上格式化,并启动namenode:

    $ bin/hdfs namenode -format

    $ sbin/hadoop-daemon.sh start namenode

    (3)在[nn2]上同步[nn1]的元数据信息:

    $ bin/hdfs namenode --help

    $ bin/hdfs namenode -bootstrapStandby

    上边要在nn2上执行,nn2向nn1同步一次元数据信息。

    (4)在[nn2]上启动namenode:

    $ sbin/hadoop-daemon.sh start namenode

    (5)将[nn1]切换成Active:

    $ bin/hdfs haadmin -transitionToActive nn1

    (6)在[nn1]上启动所有datanode:

    $ sbin/hadoop-daemon.sh start datanode

    (7)测试[nn1]和[nn2]的状态:

    可以浏览器访问namenode 50070端口,能够发现一个是active,一个是standby的状态。分别访问:http://hadoop-senior01.pmpa.com:50070/ 和 http://hadoop-senior02.pmpa.com:50070/

    nn1  Namnode  -----Active nn2  Namenode  ---- Standby

    我们可以上传一个测试文件到HDFS,在Active 节点中可以浏览到该文件,在Standby节点,提示“Operation category READ is not supported in state standby”。

    下面把nn1 改成standby状态,再来查看这两个页面(手动切换Active/Standby)

    $ bin/hdfs haadmin -transitionToStandby nn1

    $ bin/hdfs haadmin -transitionToActive nn2

    6. Namenode HA 实现自动故障转移:

    Namenode HA实现自动故障转移:

    Namenode实现自动故障转移

    Namenode HA 自动故障转移,需要借助Zookeeper来完成。使用ZKFC组件来协助完成。

    HDFS  HA  Using QJM

    1. 配置自动故障转移:

    (1) 在hdfs-site.xml开启自动故障转移,配置项:dfs.ha.automatic-failover.enabled。

    (2)在core-site.xml配置Zookeeper的HA,配置项:ha.zookeeper.quorum

    (3)同步更改到其他服务器:

    $ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior02.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

    $ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml natty@hadoop-senior03.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

    2. 启动Zookeeper自动故障转移:

    (1)关闭hdfs:

    $ sbin/stop-dfs.sh

    (2)启动zookeeper(每台机器启动):

    $ bin/zkServer.sh start

    (3)初始化HA在Zookeeper集群中的状态(在其中一台Namenode上运行):

    $ bin/hdfs zkfc -formatZK

    (4)启动hdfs 服务:

    $ sbin/start-dfs.sh 

    使用start-dfs.sh 启动hdfs后,也会启动zkfc。

    可以直接在各个Namenode节点上启动DFSZK Failover Controller ,通过jps可查看到DFSZKFailoverController进程。

    通过sbin/hadoop-daemon.sh ,可以选择在nn1 和nn2上哪个先启动zkfc。在哪台Namenode上先启动,哪台就是Active状态(另外的就是Standby状态)。

    $ sbin/hadoop-daemon.sh start zkfc

    3. 测试Zookeeper 自动故障转移:

    启动了HDFS之后,在浏览器访问50070端口,确定senior02是Active状态、Senior01是Standby状态。现在通过在nn2上杀掉Namenode进程(模仿Senior02故障,看看Senior01是否能够自动切换到Active状态)。

    $ jps

    12017 DFSZKFailoverController

    5675 QuorumPeerMain

    11803 DataNode

    11730 NameNode

    11892 JournalNode

    12119 Jps

    $ kill -9 11730

    在senior02上杀掉namenode进程后,可以在senior01的50070端口访问,看到已经切换到Active状态。

    Senior01 切换到Active状态

    7. ResourceManager HA 介绍:

    1. RM HA介绍:

    Resource Manager负责集群中资源跟踪、分配和应用的调度(例如作业调度)。在Hadoop 2.4版本之前,Yarn集群中的Resource Manager存在单点故障。RM HA添加了一组冗余的Active/Standby Resource Manager来防止单点故障。

    2. Resource Manager HA架构:

    RM HA Architecture

    1. RM记录的状态:

    (1)Job任务的状态,

    (2)资源状态,每个任务。

    假如一个任务需要执行一小时,Job在执行到半小时的时候Resource Manager出错,配置的RM HA应该可以直接切换到Standby RM,并且这个任务应该继续执行后半小时内容,不应该重新执行,这样会很耗时。

    RM的状态是记录在Zookeeper中的。

    2. Zookeeper作用

    (1)监控ResourceManager ;

    (2)切换active/standy状态;

    (3)保存状态:

                  a) Job任务的状态

                  b) 资源的状态

    8. ResourceManager HA 搭建配置和测试:

    1. 资源主机规划:

    下面是资源主机规划安装列表:

    RM HA 资源规划列表

    修改mapred-site.xml来修改jobhisotry的配置节点(原来在senior03,现在切回到senior01)。

    停掉jobhistoryserver:

    $ sbin/mr-jobhistory-daemon.sh stop historyserver

    2. RM HA配置:

    需要修改配置文件yarn-site.xml:

    可以按照官网的sample configuration 来进行配置,官网地址: ResourceManagerHA

    实现RM HA需要保证Resource Manager的自动重启,所以还增加Resource Manager Restart的配置。在保存RM状态时,有两种方式,一个是保存在Zookeeper中(架构图中情况),一种是保存在HDFS中。 关于RM Restart的参考,官网地址:ResourceManagerRestart

    保存到Zookeeper和hdfs的状态的两个类分别是:

    org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore

    org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore

    3. 配置同步,rm启动

    (1)同步配置:

    同步配置到其他两台服务器,我修改了yarn-site.xml和mapred-site.xml:

    $ scp etc/hadoop/yarn-site.xml etc/hadoop/mapred-site.xml natty@hadoop-senior02.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

    $ scp etc/hadoop/yarn-site.xml etc/hadoop/mapred-site.xml natty@hadoop-senior03.pmpa.com:/opt/modules/hadoop-2.5.0/etc/hadoop/

    (2)启动rm1 和 rm2:

    a) 在senior02上启动 yarn:

    $ sbin/start-yarn.sh

    上边操作会启动senior02的resource manager和三台服务器的node manager。

    b) 在senior03上启动resource manager:

    $ sbin/yarn-daemon.sh start resourcemanager

    c) 查看两个Resource Manager 的状态:

    查看rm1的状态(active状态):

    $ bin/yarn rmadmin -getServiceState rm1

    查看rm2的状态(standby状态):

    $ bin/yarn rmadmin -getServiceState rm2

    d) 启动 jobhistoryserver:

    $ sbin/mr-jobhistory-daemon.sh  start historyserver

    4. 测试RM HA ,通过调度任务来测试:

    调度一个wordcount任务:

    $ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /words.txt /output20

    任务正常执行完,现在rm1(Senior02)是active  rm2(Senior03)是standby。

    下面在任务执行过程中(到map阶段),我把senior02的resource manager进程kill掉,按照分析rm2应该自动切换为active,并且继续执行任务。

    在senior01上调度任务,执行日志如下:

    RM HA 测试日志

    通过日志,可以看到,在rm1的resourcemanager进程杀掉后,自动切换到rm2,作业继续执行,最后执行成功。

    相关文章

      网友评论

        本文标题:6. Zookeeper和 集群HA配置

        本文链接:https://www.haomeiwen.com/subject/llvdittx.html