HA 架构模型

image.png

规划

HOST NN_1 NN_2 DN JNN ZKFC ZK
node01
node02
node03
node04

配置

core-size.xml

  1. <property>
  2. <name>fs.defaultFS</name>
  3. <value>hdfs://mycluster</value>
  4. </property>
  5. <property>
  6. <name>ha.zookeeper.quorum</name>
  7. <value>node02:2181,node03:2181,node04:2181</value>
  8. </property>

hdfs-size.xml

  1. <property>
  2. <name>dfs.nameservices</name>
  3. <value>mycluster</value>
  4. </property>
  5. <property>
  6. <name>dfs.ha.namenodes.mycluster</name>
  7. <value>nn1,nn2</value>
  8. </property>
  9. <!-- 配置 active 节点端口 -->
  10. <property>
  11. <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  12. <value>node01:8020</value>
  13. </property>
  14. <property>
  15. <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  16. <value>node02:8020</value>
  17. </property>
  18. <!-- 配置 namenode 节点端口 -->
  19. <property>
  20. <name>dfs.namenode.http-address.mycluster.nn1</name>
  21. <value>node01:50070</value>
  22. </property>
  23. <property>
  24. <name>dfs.namenode.http-address.mycluster.nn2</name>
  25. <value>node02:50070</value>
  26. </property>
  27. <!-- journal 节点通信端口 -->
  28. <property>
  29. <name>dfs.namenode.shared.edits.dir</name>
  30. <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
  31. </property>
  32. <property>
  33. <name>dfs.journalnode.edits.dir</name>
  34. <value>/var/bigdata/hadoop/ha/dfs/jn</value>
  35. </property>
  36. <!-- HA 角色切换的代理类实现方法和免密配置 -->
  37. <property>
  38. <name>dfs.client.failover.proxy.provider.mycluster</name>
  39. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  40. </property>
  41. <property>
  42. <name>dfs.ha.fencing.methods</name>
  43. <value>sshfence</value>
  44. </property>
  45. <property>
  46. <name>dfs.ha.fencing.ssh.private-key-files</name>
  47. <value>/root/.ssh/id_dsa</value>
  48. </property>
  49. <!-- 开启自动化,启动 ZKFC -->
  50. <property>
  51. <name>dfs.ha.automatic-failover.enabled</name>
  52. <value>true</value>
  53. </property>

搭建 ZooKeeper 集群

配置 zoo.cfg

  1. tickTime=2000
  2. initLimit=10
  3. syncLimit=5
  4. dataDir=/var/bigdata/hadoop/zk
  5. clientPort=2181
  6. # 集群权重配置
  7. server.1=node02:2888:3888
  8. server.2=node03:2888:3888
  9. server.3=node04:2888:3888

设置 myid

  1. cd /var/bigdata/hadoop/zk
  2. echo 1 >> myid
  3. # 同理设置 node3,node4

配置环境变量

  1. export JAVA_HOME=/usr/java/default
  2. export HADOOP_HOME=/opt/bigdata/hadoop-2.10.0
  3. export ZOOKEEPER_HOME=/opt/bigdata/apache-zookeeper-3.6.1-bin
  4. export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

SSH 免密配置

主要让两台 namenode 所在的机器可以相互免密登录,为了自动化设置 active namenode 和 standby namenode使用

  1. # node02 生成自己的公钥和私钥
  2. cd .ssh
  3. ssh-keygen -t dsa -P '' -f ./id_dsa
  4. # 将公钥加入自己的 authorized_keys
  5. cat id_dsa.pub >> authorized_keys
  6. # 将公钥发送给 node01
  7. scp ./id_dsa.pub node01:`pwd`/node02.pub
  8. # node01 将 node02 的公钥写入 authorized_keys
  9. cd .ssh
  10. cat node02.pub >> authorized_keys

初始化启动

1、先启动 JN

  1. # node01 下启动 journalnode
  2. hadoop-daemon.sh start journalnode
  3. # node02 下启动 journalnode
  4. hadoop-daemon.sh start journalnode
  5. # node03 下启动 journalnode
  6. hadoop-daemon.sh start journalnode

2、选择一个 NN 做格式化

  1. # 格式化 node01 下的 namenode
  2. hdfs namenode -format

3、启动格式化后的 NN

  1. # 启动 node01 下的 namenode
  2. hadoop-daemon.sh start namenode

4、另外一台 NN 同步元数据

  1. # node02 启动 namenode 同步 node01 namenode 的元数据
  2. hdfs namenode -bootstrapStandby

5、格式化 Zookeeper

  1. # node01 执行格式化 ZooKeeper 集群
  2. hdfs zkfc -formatZK

6、启动 HA

  1. 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 进行观察