目录大纲
Part01-基础概念与理论知识
1.1 HDFS HA架构概述
1.2 NameNode单点故障问题
1.3 HA解决方案对比
Part02-生产环境规划与建议
2.1 HA集群硬件规划
2.2 HA架构设计原则
2.3 HA集群网络规划
Part03-生产环境项目实施方案
3.1 JournalNode集群配置
3.2 NameNode主备配置
3.3 ZooKeeper故障转移配置
3.4 HA集群启动与验证
Part04-生产案例与实战讲解
4.1 HA集群故障切换案例
4.2 HA集群运维管理案例
4.3 HA集群性能优化案例
Part05-风哥经验总结与分享
5.1 HA架构最佳实践
5.2 HA故障处理经验
Part01-基础概念与理论知识
1.1 HDFS HA架构概述
HDFS高可用(High Availability,HA)架构是为了解决NameNode单点故障问题而设计的。更多视频教程www.fgedu.net.cn 在HA架构中,存在两个NameNode:Active NameNode和Standby NameNode,它们通过JournalNode集群共享编辑日志,实现元数据同步。
1.2 NameNode单点故障问题
在非HA架构中,NameNode是单点故障(SPOF)。学习交流加群风哥微信: itpux-com 一旦NameNode宕机,整个HDFS集群将不可用,直到NameNode重启恢复。这对于生产环境是不可接受的。
– 集群无法提供文件读写服务
– 所有DataNode心跳中断
– 运行中的MapReduce任务失败
– 数据恢复时间长,影响业务连续性
1.3 HA解决方案对比
HDFS HA主要有两种实现方案:基于NFS共享存储和基于Quorum Journal Manager(QJM)。from bigdata视频:www.itpux.com QJM方案更加成熟稳定,是生产环境的首选方案。
– NFS方案:依赖NFS共享存储,配置复杂,存在单点风险
– QJM方案:基于JournalNode集群,无单点故障,推荐生产使用
– ZooKeeper方案:配合ZKFC实现自动故障转移
Part02-生产环境规划与建议
2.1 HA集群硬件规划
HDFS HA集群需要合理规划硬件资源。更多学习教程公众号风哥教程itpux_com 建议至少3台JournalNode、2台NameNode、3台以上DataNode。
cat /bigdata/app/hadoop/etc/hadoop/workers
fgedu02.net.cn
fgedu03.net.cn
fgedu04.net.cn
fgedu05.net.cn
2.2 HA架构设计原则
设计HDFS HA架构需要遵循以下原则:学习交流加群风哥QQ113257174
1. JournalNode数量必须为奇数,至少3个
2. NameNode主备节点硬件配置应一致
3. ZooKeeper集群独立部署,至少3节点
4. 网络延迟要低,建议万兆网络
5. 共享存储EditLog要保证高可靠
2.3 HA集群网络规划
HA集群网络规划需要考虑心跳检测、数据同步、故障转移等场景。风哥提示:建议使用独立的心跳网络和数据网络。
cat /etc/hosts
192.168.1.101 fgedu02.net.cn fgedu02
192.168.1.102 fgedu03.net.cn fgedu03
192.168.1.103 fgedu04.net.cn fgedu04
192.168.1.104 fgedu05.net.cn fgedu05
Part03-生产环境项目实施方案
3.1 JournalNode集群配置
3.1.1 配置hdfs-site.xml
cat /bigdata/app/hadoop/etc/hadoop/hdfs-site.xml
<!– Nameservice名称 –>
<property>
<name>dfs.nameservices</name>
<value>fgeduns</value>
</property>
<!– NameNode标识 –>
<property>
<name>dfs.ha.namenodes.fgeduns</name>
<value>nn1,nn2</value>
</property>
<!– NameNode RPC地址 –>
<property>
<name>dfs.namenode.rpc-address.fgeduns.nn1</name>
<value>fgedu01.net.cn:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.fgeduns.nn2</name>
<value>fgedu02.net.cn:8020</value>
</property>
<!– NameNode HTTP地址 –>
<property>
<name>dfs.namenode.http-address.fgeduns.nn1</name>
<value>fgedu01.net.cn:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.fgeduns.nn2</name>
<value>fgedu02.net.cn:9870</value>
</property>
<!– JournalNode地址 –>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://fgedu03.net.cn:8485;fgedu04.net.cn:8485;fgedu05.net.cn:8485/fgeduns</value>
</property>
<!– JournalNode数据目录 –>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/bigdata/fgdata/journalnode</value>
</property>
</configuration>
3.1.2 启动JournalNode服务
hdfs –daemon start journalnode
# 验证JournalNode状态
jps | grep JournalNode
25840 JournalNode
# 查看JournalNode日志
tail -f /bigdata/app/hadoop/logs/hadoop-hdfs-journalnode-fgedu03.log
2024-01-15 14:00:00,123 INFO journal.JournalNode: JournalNode started on port 8485
2024-01-15 14:00:00,456 INFO server.JournalNodeHttpServer: JournalNode Web server started on port 8480
3.2 NameNode主备配置
3.2.1 格式化NameNode
hdfs namenode -format -clusterId fgeduns
# 启动主NameNode
hdfs –daemon start namenode
2024-01-15 14:10:00,000 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = fgedu01.net.cn/192.168.1.100
STARTUP_MSG: args = [-format, -clusterId, fgeduns]
************************************************************/
2024-01-15 14:10:05,123 INFO namenode.FSImage: Allocated new BlockPoolId: BP-1234567890
2024-01-15 14:10:10,456 INFO common.Storage: Storage directory /bigdata/fgdata/namenode has been successfully formatted.
# 格式化成功
# NameNode启动成功
jps | grep NameNode
26510 NameNode
3.2.2 同步Standby NameNode
hdfs namenode -bootstrapStandby
# 启动备NameNode
hdfs –daemon start namenode
2024-01-15 14:15:00,000 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = fgedu02.net.cn/192.168.1.101
STARTUP_MSG: args = [-bootstrapStandby]
************************************************************/
2024-01-15 14:15:05,123 INFO ha.BootstrapStandby: Found NameNode: fgedu01.net.cn:8020
2024-01-15 14:15:10,456 INFO ha.BootstrapStandby: Successfully synced storage directory
# 同步成功
# 备NameNode启动成功
jps | grep NameNode
25890 NameNode
3.3 ZooKeeper故障转移配置
3.3.1 配置自动故障转移
cat /bigdata/app/hadoop/etc/hadoop/hdfs-site.xml | grep -A5 “ha.automatic”
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!– ZooKeeper集群地址 –>
<property>
<name>ha.zookeeper.quorum</name>
<value>fgedu03.net.cn:2181,fgedu04.net.cn:2181,fgedu05.net.cn:2181</value>
</property>
<!– 故障转移代理配置 –>
<property>
<name>dfs.client.failover.proxy.provider.fgeduns</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>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
3.3.2 初始化ZooKeeper
hdfs zkfc -formatZK
# 启动ZKFC服务
hdfs –daemon start zkfc
2024-01-15 14:20:00,000 INFO ha.ZKFailoverController: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting ZKFailoverController
************************************************************/
2024-01-15 14:20:05,123 INFO ha.ZKFailoverController: Successfully created /hadoop-ha/fgeduns in ZK.
# 格式化成功
# ZKFC启动成功
jps | grep ZKFC
27100 DFSZKFailoverController
3.4 HA集群启动与验证
3.4.1 启动HA集群
start-dfs.sh
# 查看集群状态
hdfs haadmin -getAllServiceState
Starting namenodes on [fgedu01 fgedu02]
Starting datanodes
Starting journal nodes [fgedu03 fgedu04 fgedu05]
Starting ZKFC
# 查看NameNode状态
fgedu01.net.cn:8020 active
fgedu02.net.cn:8020 standby
3.4.2 验证HA功能
hdfs haadmin -transitionToActive –forcemanual nn2
# 查看切换后状态
hdfs haadmin -getAllServiceState
2024-01-15 14:30:00,000 INFO ha.HAAdmin: Successfully transitioned nn2 to active state
# 验证状态
fgedu01.net.cn:8020 standby
fgedu02.net.cn:8020 active
Part04-生产案例与实战讲解
4.1 HA集群故障切换案例
模拟Active NameNode故障,验证自动故障转移功能。更多视频教程www.fgedu.net.cn
# 在Active NameNode上停止服务
hdfs –daemon stop namenode
# 查看集群状态
hdfs haadmin -getAllServiceState
# 自动故障转移日志
2024-01-15 14:35:00,000 INFO ha.ZKFailoverController: Active NameNode fgedu01.net.cn appears to have failed
2024-01-15 14:35:01,123 INFO ha.ZKFailoverController: Trying to make NameNode fgedu02.net.cn active
2024-01-15 14:35:02,456 INFO ha.ZKFailoverController: Successfully transitioned fgedu02.net.cn to active state
# 验证切换结果
fgedu01.net.cn:8020 standby (or unavailable)
fgedu02.net.cn:8020 active
4.2 HA集群运维管理案例
4.2.1 查看HA状态信息
hdfs haadmin -checkHealth nn1
hdfs haadmin -checkHealth nn2
# 查看NameNode状态
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
Health report for nn1: healthy
Health report for nn2: healthy
# 状态查询
standby
active
4.2.2 JournalNode运维
hdfs getconf -journalNodes
# 检查EditLog同步状态
hdfs dfsadmin -report | grep “Last Block”
fgedu03.net.cn:8485
fgedu04.net.cn:8485
fgedu05.net.cn:8485
# EditLog同步正常
Last Block: blk_1073741825_1001
4.3 HA集群性能优化案例
HA集群性能优化主要关注NameNode内存、JournalNode同步性能、ZooKeeper响应速度等方面。学习交流加群风哥微信: itpux-com
cat /bigdata/app/hadoop/etc/hadoop/hadoop-env.sh | grep “Xmx”
export HADOOP_NAMENODE_OPTS=”-Xmx32g -Xms32g -XX:+UseG1GC”
# JournalNode同步优化
cat /bigdata/app/hadoop/etc/hadoop/hdfs-site.xml | grep -A3 “journalnode.sync”
<property>
<name>dfs.journalnode.sync.interval</name>
<value>5</value>
</property>
Part05-风哥经验总结与分享
5.1 HA架构最佳实践
在实际生产环境中,HDFS HA架构部署需要注意以下几点:from bigdata视频:www.itpux.com
1. JournalNode至少部署3个,且分布在不同机架
2. NameNode主备节点配置要完全一致
3. ZooKeeper集群独立部署,避免资源竞争
4. 定期演练故障切换,确保HA功能正常
5. 监控NameNode内存使用,及时扩容
5.2 HA故障处理经验
5.2.1 脑裂问题处理
hdfs haadmin -getAllServiceState
# 如果发现脑裂,手动恢复
hdfs haadmin -transitionToStandby –forcemanual nn1
fgedu01.net.cn:8020 active
fgedu02.net.cn:8020 standby
# 如果出现脑裂,强制切换
2024-01-15 15:00:00,000 INFO ha.HAAdmin: Successfully transitioned nn1 to standby state
5.2.2 JournalNode故障处理
– JournalNode故障不超过半数时,HA集群仍可正常工作
– 故障JournalNode恢复后,会自动同步数据
– 所有JournalNode故障时,需要重新格式化
hdfs –daemon stop journalnode
hdfs –daemon start journalnode
# 验证JournalNode状态
jps | grep JournalNode
28500 JournalNode
# 同步日志
2024-01-15 15:05:00,000 INFO journal.JournalNode: JournalNode started
2024-01-15 15:05:05,123 INFO journal.JournalNode: Syncing edits from other JournalNodes
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
