目录
一、Hadoop的高可用原理概述
1.1 原理概述
高可用是指在集群中当有一太master,出现故障时,另外一台可以接替其工作。
在典型的 HA 集群中,通常有两台不同的机器充当 NN。两台主机只有一台处于Active状态,另一台处于Standby。处于Active状态的主机负责HA集群中的操作管理,Standby负责备份,当Active出现状况时,可自动切换启动使用。
在HA集群中为了让 Standby 和 Active 两台主机保持元数据保持一致,它们都将会和JournalNodes 守护进程通信。当 Active节点执行任何有关命名空间的修改,它需要持久化到一半以上的 JournalNodes 上(通过 edits log 持久化存储),而 Standby节点负责观察 edits log的变化,从 JNs 中读取 edits 信息,并更新其内部的命名空间。当 Active节点出现故障,Standby将会保证从 JNs 中读出了全部的 Edits,然后切换成 Active 状态。
Standby 读取全部的 edits 可确保发生故障转移之前,是和 Active拥有完全同步的命名空间状态。
为了提供快速的故障恢复,Standby也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的 Database 将配置好 Active和 Standby的位置,并向它们发送块文件所在的位置及心跳,如下图所示:
【注】在 HA 集群中,Standby也执行 namespace 状态的 checkpoints,所以不必要运行Secondary NN、CheckpointNode 和 BackupNode。
1.2 实验环境要求
5台虚拟机、Zookeeper的压缩包
其中: server1、5搭建NN的高可用;
server2、3、4搭建zk\jk\dn
虚拟机ip | 主机名 | 搭载的服务 |
192.168.19.71 | server1 | NameNode、ResourceManager、DFSZKFailoverController |
192.168.19.75 | server5 | NameNode、ResourceManager、DFSZKFailoverController |
192.168.19.72 | server2 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
192.168.19.73 | server3 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
192.168.19.74 | server4 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
【注】 (1)NameNode machines:运行 Active和 Standby 的机器需要相同的硬件配置;
(2)JN :相对来说比较轻量,可以和其他线程(比如 NN,YARN ResourceManager)运行在同一台机器上。
(3)在一个集群中,最少要运行 3 个 JN 守护进程,来增强容错能力。更多则需要保证运行个数为奇数个 JN(3、5、7 等),当运行 N 个 JN,系统将最多容忍(N-1)/2 个 JN 崩溃。
二、高可用集群的搭建
2.1 搭建Zookeeper
##清空所有运行进程
sbin/stop-all/.sh
##清楚数据缓存目录--->server1\2\3均要清除
rm -fr /tmp/*
##新加入节点安装nfs--->server4\5
yum install -y nfs-utils
##新加入节点创建目录并挂载共享文件--->server4\5
useradd hadoop
echo 123 | passwd --stdin hadoop
mount 192.168.19.71:/home/hadoop /home/hadoop
##对zookeeper压缩包进行解压--->nfs共享,所有主机均生效
tar zxf zookeeper-3.4.9.tar.gz
##对ZK进行配置--->server2\3\4
mkdir /tmp/zookeeper -->存储ZK集群信息
cd zookeeper-3.4.9/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg -->加入zk三个节点的IP,IP1:192.168.19.72\IP2:192.168.19.73\IP3:192.168.19.74 -- 端口2888(同步数据)3888(选举leader)
---------------------
server.1=192.168.19.72:2888:3888
server.2=192.168.19.73:2888:3888
server.3=192.168.19.74:2888:3888
---------------------
##将对应的编号写入对应主机的文件中--->server2\3\4
echo 1 > /tmp/zookeeper/myid --server2
echo 2 > /tmp/zookeeper/myid --server3
echo 3 > /tmp/zookeeper/myid --server4
##在server2\3\4上开启zkserver
cd zookeeper-3.4.9
bin/zkServer.sh start
##查看各节点状态--->server2\3\4
bin/zkServer.sh status
##在leader节点执行初始化命令--server2(status--leader)
bin/zkCli.sh
##分别查看节点运行的进程---&