Hadoop+Zookeeper实现hadoop高可用

一、zookeeper高可用

实验环境:在上一章的基础上增添高可用节点server5,server5同样使用nfs文件系统共享server1的文件

在这里插入图片描述
在典型的 HA 集群中,通常有两台不同的机器充当 NN。在任何时间,只有一台机器处于
Active 状态;另一台机器是处于 Standby 状态。Active NN 负责集群中所有客户端的操作;
而 Standby NN 主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢
复。
为了让 Standby NN 的状态和 Active NN 保持同步,即元数据保持一致,它们都将会和
JournalNodes 守护进程通信。当 Active NN 执行任何有关命名空间的修改,它需要持久化到
一半以上的 JournalNodes 上(通过 edits log 持久化存储),而 Standby NN 负责观察 edits log
的变化,它能够读取从 JNs 中读取 edits 信息,并更新其内部的命名空间。一旦 Active NN
出现故障,Standby NN 将会保证从 JNs 中读出了全部的 Edits,然后切换成 Active 状态。
Standby NN 读取全部的 edits 可确保发生故障转移之前,是和 Active NN 拥有完全同步的命
名空间状态。
为了提供快速的故障恢复,Standby NN 也需要保存集群中各个文件块的存储位置。为
了实现这个,集群中所有的 Database 将配置好 Active NN 和 Standby NN 的位置,并向它们
发送块文件所在的位置及心跳,如下图所示:
在这里插入图片描述
在任何时候,集群中只有一个 NN 处于 Active 状态是极其重要的。否则,在两个 Active NN
的状态下 NameSpace 状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为
了保证这种情况不会发生,在任何时间,JNs 只允许一个 NN 充当 writer。在故障恢复期
间,将要变成 Active 状态的 NN 将取得 writer 的角色,并阻止另外一个 NN 继续处于 Active
状态。
为了部署 HA 集群,你需要准备以下事项:
(1)、NameNode machines:运行 Active NN 和 Standby NN 的机器需要相同的硬件配
置;
(2)、JournalNode machines:也就是运行 JN 的机器。JN 守护进程相对来说比较轻
量,所以这些守护进程可以可其他守护线程(比如 NN,YARN ResourceManager)运行在
同一台机器上。在一个集群中,最少要运行 3 个 JN 守护进程,这将使得系统有一定的容错
能力。当然,你也可以运行 3 个以上的 JN,但是为了增加系统的容错能力,你应该运行奇
数个 JN(3、5、7 等),当运行 N 个 JN,系统将最多容忍(N-1)/2 个 JN 崩溃。
在 HA 集群中,Standby NN 也执行 namespace 状态的 checkpoints,所以不必要运行
Secondary NN、CheckpointNode 和 BackupNode;事实上,运行这些守护进程是错误的。
1.在上一章的基础上关闭之前的服务,并清理环境

[hadoop@server1 hadoop]$ sbin/stop-dfs.sh 
[hadoop@server1 hadoop]$ jps
2244 Jps
[hadoop@server1 hadoop]$ rm -fr /tmp/*
[hadoop@server2 hadoop]$ rm -fr /tmp/*
[hadoop@server3 hadoop]$ rm -fr /tmp/*
[hadoop@server4 hadoop]$ rm -fr /tmp/*

2.安装zookeeper(可选择任意节点,我们选择server2)

[hadoop@server2 ~]$ tar zxf zookeeper-3.4.9.tar.gz 
[hadoop@server2 ~]$ cd zookeeper-3.4.9/
[hadoop@server2 zookeeper-3.4.9]$ cd conf/

3.添加从节点信息

[hadoop@server2 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@server2 conf]$ vim zoo.cfg 
server.1=172.25.66.2:2888:3888
server.2=172.25.66.3:2888:3888
server.3=172.25.66.4:2888:3888

4.各节点配置文件相同,并且需要在/tmp/zookeeper目录创建myid文件,写入一个唯一的数字,取值范围在1-255

[hadoop@server2 conf]$ mkdir /tmp/zookeeper
[hadoop@server2 conf]$ echo 1 > /tmp/zookeeper/myid
[hadoop@server3 ~]$ mkdir /tmp/zookeeper
[hadoop@server3 ~]$ echo 2 > /tmp/zookeeper/myid
[root@server4 ~]# mkdir /tmp/zookeeper
[root@server4 ~]# echo 3 > /tmp/zookeeper/myid

5.开启服务

[hadoop@server2 zookeeper-3.4.9]$ bin/zkServer.sh start
[hadoop@server3 zookeeper-3.4.9]$ bin/zkServer.sh start
[hadoop@server4 zookeeper-3.4.9]$ bin/zkServer.sh start

查看各节点状态
[hadoop@server2 zookeeper-3.4.9]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: follower		从节点

[hadoop@server3 zookeeper-3.4.9]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: leader		主节点

[hadoop@server4 zookeeper-3.4.9]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: follower		从节点

6.在server2进入命令行

[hadoop@server4 zookeeper-3.4.9]$ cd bin
[hadoop@server4 bin]$ ls
README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh
[hadoop@server4 bin]$ ./zkCli.sh	连接zookeeper
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /zookeeper
[quota]
[zk: localhost:2181(CONNECTED) 2] ls /zookeeper/quota
[]
[zk: localhost:2181(CONNECTED) 3] get /zookeeper/quota

cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0

7.server1进行hadoop的配置

[hadoop@server1 hadoop]$ cd etc/hadoop/
[hadoop@server1 hadoop]$ vim core-site.xml
指定hdfs的namenode为masters(自定义)
<configuration>
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://masters</value>
</property>
指定zookeeper集群主机地址
    <property>
    <name>ha.zookeeper.quorum</name>
    <value>172.25.66.2:2181,172.25.66.3:2181,172.25.66.4:2181</value>
</property>
</configuration>


[hadoop@server1 hadoop]$ vim hdfs-site.xml
<configuration>
<property>
    <name>dfs.replication</name>
    <value>3</value>	设置三个节点
</property>
指定hdfs的nameservices为masters,与core-site.xml文件中的配置保持一致
    <property>
    <name>dfs.nameservices</name>
    <value>masters</value>
</property>
##masters下面有两个namenode节点,分别设为h1,h2
    <property>
    <name>dfs.ha.namenodes.masters</name>
    <value>h1,h2</value>
</property>
指定h1节点的rpc通信地址
    <property>
    <name>dfs.namenode.rpc-address.masters.h1</name>
    <value>172.25.66.1:9000</value>
</property>
指定h1节点的http通信地址
    <property>
    <name>dfs.namenode.http-address.masters.h1</name>
    <value>172.25.66.1:9870</value>
</property>
指定h2节点的rpc通信地址
    <property>
    <name>dfs.namenode.rpc-address.masters.h2</name>
    <value>172.25.66.5:9000</value>
</property>
指定h2节点的http通信地址
    <property>
    <name>dfs.namenode.http-address.masters.h2</name>
    <value>172.25.66.5:9870</value>
</property>
指定NameNode元数据在JournalNode上的存放地址
    <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://172.25.66.2:8485;172.25.66.3:8485;172.25.66.4:8485/masters</value>
</property>
指定JournalNode在本地磁盘存放数据的位置
    <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/tmp/journaldata</value>
</property>
开启NameNode失败自动切换
    <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>
配置失败自动切换实现方式
    <property>
    <name>dfs.client.failover.proxy.provider.masters</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
设置隔离机制方法,每个机制占用一行
    <property>
    <name>dfs.ha.fencing.methods</name>
    <value>
    sshfence
    shell(/bin/true)
    </value>
</property>
使用sshfence隔离机制时需要的ssh免密码
    <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
</property>
配置sshfence隔离机制超时时间
    <property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
</property>
</configuration>

7.启动hdfs集群(按顺序启动)在三个DN上依次启动zookeeper集群

[hadoop@server2 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server2 hadoop]$ bin/hdfs --daemon start journalnode
[hadoop@server2 hadoop]$ jps
2982 Jps
2775 QuorumPeerMain
2943 JournalNode

[hadoop@server3 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server3 hadoop]$ bin/hdfs --daemon start journalnode
[hadoop@server3 hadoop]$ jps
2484 JournalNode
2313 QuorumPeerMain
2523 Jps

[hadoop@server4 hadoop]$ bin/hdfs --daemon start journalnode
[hadoop@server4 hadoop]$ jps
2833 JournalNode
2642 QuorumPeerMain
2872 Jps

8.测试与server5的免密连接,传递文件搭建高可用

[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ ssh-copy-id server5
[hadoop@server5 ~]$ logout
[hadoop@server1 hadoop]$ bin/hdfs namenode -format
[hadoop@server1 hadoop]$ scp -r /tmp/hadoop-hadoop 172.25.66.5:/tmp
VERSION                                                                                                             100%  214     0.2KB/s   00:00    
seen_txid                                                                                                           100%    2     0.0KB/s   00:00    
fsimage_0000000000000000000.md5                                                                                     100%   62     0.1KB/s   00:00    
fsimage_0000000000000000000  
[root@server5 ~]# ls /tmp/
hadoop-hadoop

9.格式化zookeeper(只需在h1上执行即可)

[hadoop@server1 hadoop]$ bin/hdfs zkfc -formatZK

10.启动hdfs集群(只需在h1上执行即可)

[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ sbin/start-dfs.sh 
Starting namenodes on [server1 server5]
Starting datanodes
Starting journal nodes [172.25.66.2 172.25.66.3 172.25.66.4]
172.25.66.2: journalnode is running as process 2343.  Stop it first.
172.25.66.4: journalnode is running as process 2285.  Stop it first.
172.25.66.3: journalnode is running as process 2320.  Stop it first.
Starting ZK Failover Controllers on NN hosts [server1 server5]
[hadoop@server1 hadoop]$ jps
2746 NameNode
3099 DFSZKFailoverController
3150 Jps

11.浏览器查看
在这里插入图片描述
在这里插入图片描述
12.测试故障自动切换
server1杀掉namenode进程:

[hadoop@server1 hadoop]$ jps
2746 NameNode
3099 DFSZKFailoverController
3150 Jps
[hadoop@server1 hadoop]$ kill -9 2746

然后我们会发现server1的网页进不去了,但是我们的server5的可以进去,而且变成了active状态。
在这里插入图片描述
重新开启server1的namenode:

[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ sbin/hadoop-daemon.sh start namenode
WARNING: Use of this script to start HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon start" instead.
[hadoop@server1 hadoop]$ jps
3313 Jps
3099 DFSZKFailoverController
3246 NameNode
[hadoop@server1 hadoop]$ 

刷新server1,server1的状态变成standy
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42446031/article/details/90443041