HA 架构模型
规划
| HOST | NN_1 | NN_2 | DN | JNN | ZKFC | ZK |
|---|---|---|---|---|---|---|
| node01 | √ | √ | √ | |||
| node02 | √ | √ | √ | √ | √ | |
| node03 | √ | √ | √ | |||
| node04 | √ | √ |
配置
core-size.xml
<property><name>fs.defaultFS</name><value>hdfs://mycluster</value></property><property><name>ha.zookeeper.quorum</name><value>node02:2181,node03:2181,node04:2181</value></property>
hdfs-size.xml
<property><name>dfs.nameservices</name><value>mycluster</value></property><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value></property><!-- 配置 active 节点端口 --><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>node01:8020</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>node02:8020</value></property><!-- 配置 namenode 节点端口 --><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>node01:50070</value></property><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>node02:50070</value></property><!-- journal 节点通信端口 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value></property><property><name>dfs.journalnode.edits.dir</name><value>/var/bigdata/hadoop/ha/dfs/jn</value></property><!-- HA 角色切换的代理类实现方法和免密配置 --><property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><property><name>dfs.ha.fencing.methods</name><value>sshfence</value></property><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_dsa</value></property><!-- 开启自动化,启动 ZKFC --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property>
搭建 ZooKeeper 集群
配置 zoo.cfg
tickTime=2000initLimit=10syncLimit=5dataDir=/var/bigdata/hadoop/zkclientPort=2181# 集群权重配置server.1=node02:2888:3888server.2=node03:2888:3888server.3=node04:2888:3888
设置 myid
cd /var/bigdata/hadoop/zkecho 1 >> myid# 同理设置 node3,node4
配置环境变量
export JAVA_HOME=/usr/java/defaultexport HADOOP_HOME=/opt/bigdata/hadoop-2.10.0export ZOOKEEPER_HOME=/opt/bigdata/apache-zookeeper-3.6.1-binexport PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
SSH 免密配置
主要让两台 namenode 所在的机器可以相互免密登录,为了自动化设置 active namenode 和 standby namenode使用
# node02 生成自己的公钥和私钥cd .sshssh-keygen -t dsa -P '' -f ./id_dsa# 将公钥加入自己的 authorized_keyscat id_dsa.pub >> authorized_keys# 将公钥发送给 node01scp ./id_dsa.pub node01:`pwd`/node02.pub# node01 将 node02 的公钥写入 authorized_keyscd .sshcat node02.pub >> authorized_keys
初始化启动
1、先启动 JN
# node01 下启动 journalnodehadoop-daemon.sh start journalnode# node02 下启动 journalnodehadoop-daemon.sh start journalnode# node03 下启动 journalnodehadoop-daemon.sh start journalnode
2、选择一个 NN 做格式化
# 格式化 node01 下的 namenodehdfs namenode -format
3、启动格式化后的 NN
# 启动 node01 下的 namenodehadoop-daemon.sh start namenode
4、另外一台 NN 同步元数据
# node02 启动 namenode 同步 node01 namenode 的元数据hdfs namenode -bootstrapStandby
5、格式化 Zookeeper
# node01 执行格式化 ZooKeeper 集群hdfs zkfc -formatZK
6、启动 HA
start-dfs.sh
验证 HA 模式
- 关闭一台状态为 active 的 namenode
- 第二台 namenode 会称为 active 状态
- 重新启动
hadoop-daemon.sh start namenode第一台 namenode,会称为 standby 状态
- 关闭其中一台 ZKFC
- 另一台 ZKFC 会将本机的 namenode 提升为 active
- 关闭的一台 ZKFC 所在的 namenode 降级为 standby
- 重新启动 ZKFC
hadoop-daemon.sh start zkfc依然为 standby
- 关闭一台状态为 active 的 namenode 所在的网卡
- 另一台 ZKFC 会将本机的 namenode 依然为 standby,因为 ZKFC 无法成功获取到 active 的状态,会一直尝试获取
- 当网络恢复的时候,原 standby 状态的会提升为 active,原网络出现问题的 namenode 降级为 standby
- 可以通过
cat hadoop-root-zkfc-node01.log进行观察
