6. Zookeeper和 集群HA配置

0.192字数 3695阅读 1997

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,作业继续执行,最后执行成功。

推荐阅读更多精彩内容