HDFS在Linux系统中的故障转移实现(基于高可用HA架构)
HDFS的故障转移主要通过高可用(HA)架构实现,核心是利用ZooKeeper监控NameNode状态,结合JournalNode同步元数据,确保当Active NameNode故障时,Standby NameNode能快速接管服务。以下是具体实现步骤:
ssh-keygen -t rsa生成密钥,ssh-copy-id分发公钥),便于后续命令远程执行。JournalNode用于存储NameNode的编辑日志(edits),确保Active与Standby NameNode元数据一致。
hdfs-site.xml(所有JournalNode节点):添加JournalNode数据目录配置。<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/journalnode/data</value> <!-- 实际路径需根据磁盘空间调整 -->
</property>
hdfs --daemon start journalnode
使用jps命令验证JournalNode进程是否启动(显示JournalNode进程即为成功)。ZooKeeper通过临时节点监控NameNode状态,当Active NameNode故障时,触发故障转移。
conf/zoo.cfg文件(添加集群节点信息):tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
clientPort=2181
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
在dataDir目录下创建myid文件(内容为节点ID,如zoo1节点写入1),启动ZooKeeper服务:zkServer.sh start
使用zkServer.sh status验证节点状态(Leader/Follower)。在所有NameNode节点上修改hdfs-site.xml,配置HA核心参数:
<!-- 指定集群逻辑名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 定义NameNode列表 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value> <!-- nn1:Active节点ID; nn2:Standby节点ID -->
</property>
<!-- 配置Active NameNode RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>namenode1:8020</value> <!-- 替换为实际IP/主机名 -->
</property>
<!-- 配置Standby NameNode RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>namenode2:8020</value> <!-- 替换为实际IP/主机名 -->
</property>
<!-- 配置共享编辑日志目录(JournalNode地址) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://namenode1:8485;namenode2:8485;namenode3:8485/mycluster</value> <!-- JournalNode地址列表 -->
</property>
<!-- 配置客户端故障转移代理(自动选择Active NameNode) -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置故障转移策略(SSH强制终止故障节点) -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 配置SSH私钥路径(用于故障转移时登录故障节点) -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value> <!-- 替换为实际私钥路径 -->
</property>
同时修改core-site.xml,配置默认文件系统地址:
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value> <!-- 指向集群逻辑名称 -->
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>zoo1:2181,zoo2:2181,zoo3:2181</value> <!-- ZooKeeper集群地址 -->
</property>
hdfs namenode -format
hdfs --daemon start namenode
hdfs namenode -bootstrapStandby
hdfs --daemon start namenode
hdfs --daemon start datanode
hdfs dfsadmin -report
hdfs --daemon stop namenode
hdfs dfsadmin -report,应显示namenode2变为Active状态。hdfs dfs -ls /命令,若能正常列出根目录,说明故障转移成功。hdfs-site.xml、core-site.xml配置必须一致,避免因配置差异导致故障。