本文档风哥主要介绍Hadoop集群高可用运维,包括HA架构、故障转移、日常运维等内容,风哥教程参考Hadoop官方文档High Availability等内容,适合大数据运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 高可用概述
Hadoop集群高可用是保障服务连续性的重要架构,通过冗余和自动故障转移实现。学习交流加群风哥微信: itpux-com
- 冗余设计:关键组件多实例部署
- 自动故障转移:故障时自动切换
- 数据同步:保证数据一致性
- 健康检查:实时监控组件状态
高可用是保障服务连续性的重要架构,
通过冗余和自动故障转移实现。
主要目标:
1. 服务连续性
– 消除单点故障
– 自动故障转移
– 最小化停机时间
2. 数据可靠性
– 数据多副本
– 实时同步
– 数据一致性
3. 业务连续性
– 无感知切换
– 快速恢复
– 业务不中断
# 高可用指标
指标 说明 目标值
可用性 服务可用时间比例 99.99%
RTO 恢复时间目标 < 5分钟
RPO 恢复点目标 0
# 单点故障分析
组件 单点故障影响 HA方案
NameNode 集群不可用 NameNode HA
ResourceManager 调度不可用 RM HA
ZooKeeper 选主失败 ZK集群
# 高可用架构
┌─────────────────────────────────────────┐
│ 客户端层 │
│ 客户端自动故障转移 │
├─────────────────────────────────────────┤
│ 服务层 │
│ NameNode HA、ResourceManager HA │
├─────────────────────────────────────────┤
│ 协调层 │
│ ZooKeeper集群 │
├─────────────────────────────────────────┤
│ 存储层 │
│ JournalNode、共享存储 │
└─────────────────────────────────────────┘
# 高可用原则
1. 消除单点
关键组件多实例部署
2. 自动切换
故障自动检测和转移
3. 数据一致
保证数据实时同步
4. 监控告警
实时监控HA状态
5. 定期演练
定期进行故障切换演练
1.2 HA架构介绍
HA架构介绍:
组件 说明
Active NN 主节点,处理请求
Standby NN 备节点,同步状态
JournalNode 编辑日志同步
ZKFC 故障检测和转移
ZooKeeper 选主协调
架构图:
┌──────────────────────────────────────────────┐
│ ZooKeeper集群 │
│ (选主、状态存储) │
└────────────────────┬─────────────────────────┘
│
┌────────────┴────────────┐
│ │
┌───────▼───────┐ ┌───────▼───────┐
│ Active NN │ │ Standby NN │
│ (fgedu-node1)│ │ (fgedu-node2)│
│ ZKFC │ │ ZKFC │
└───────┬───────┘ └───────┬───────┘
│ │
└────────────┬────────────┘
│
┌────────────┼────────────┐
│ │ │
┌───────▼───┐ ┌──────▼───┐ ┌──────▼───┐
│ JournalNode│ │JournalNode│ │JournalNode│
└───────────┘ └──────────┘ └──────────┘
# YARN HA架构
组件 说明
Active RM 主节点,资源调度
Standby RM 备节点,状态同步
ZooKeeper 选主协调
架构图:
┌──────────────────────────────────────────────┐
│ ZooKeeper集群 │
└────────────────────┬─────────────────────────┘
│
┌────────────┴────────────┐
│ │
┌───────▼───────┐ ┌───────▼───────┐
│ Active RM │ │ Standby RM │
│ (fgedu-node1)│ │ (fgedu-node2)│
└───────────────┘ └───────────────┘
# ZooKeeper架构
ZooKeeper是分布式协调服务,
用于选主和状态管理。
特点:
– 集群部署(奇数节点)
– 一致性协议(ZAB)
– 高可用性
角色:
– Leader: 处理写请求
– Follower: 处理读请求
– Observer: 扩展读能力
# 故障转移流程
1. Active节点故障
– ZKFC检测到故障
– 断开ZooKeeper连接
– 释放Active锁
2. 选主过程
– Standby节点竞争锁
– 获得锁成为Active
– 通知其他节点
3. 状态切换
– 新Active开始服务
– 客户端自动重连
– 服务恢复
# 故障转移时间
阶段 时间
故障检测 5-10秒
选主 1-2秒
状态切换 5-10秒
总计 10-20秒
1.3 HA组件介绍
HA组件介绍:
功能: 存储NameNode编辑日志
部署: 至少3个节点(奇数)
特点: 高可用、一致性
工作原理:
1. Active NN写入编辑日志到JN
2. 多数JN确认后返回成功
3. Standby NN从JN读取日志同步
# ZKFC (ZooKeeper Failover Controller)
功能: NameNode故障检测和转移
部署: 每个NameNode节点
特点: 自动故障转移
工作原理:
1. 监控NameNode健康状态
2. 维护ZooKeeper会话
3. 触发故障转移
# ZooKeeper
功能: 分布式协调服务
部署: 至少3个节点
特点: 高可用、一致性
用途:
– 选主协调
– 状态存储
– 配置管理
# 共享存储
类型:
– JournalNode(推荐)
– NFS(不推荐)
– Quorum Journal Manager
选择建议:
– 生产环境使用JournalNode
– 至少3个节点
– 与NameNode分开部署
# 组件对比
组件 功能 部署数量 重要性
JournalNode 日志同步 3+ 高
ZKFC 故障转移 2 高
ZooKeeper 协调服务 3+ 高
Part02-生产环境规划与建议
2.1 环境规划建议
环境规划建议:
节点 角色 配置
fgedu-node1 NameNode、RM、ZKFC、ZK 32C/64G/2T
fgedu-node2 NameNode、RM、ZKFC、ZK 32C/64G/2T
fgedu-node3 JournalNode、ZK、DataNode 16C/32G/10T
fgedu-node4 JournalNode、ZK、DataNode 16C/32G/10T
fgedu-node5 JournalNode、DataNode 16C/32G/10T
fgedu-node6+ DataNode、NodeManager 16C/32G/10T
# 网络规划
端口 用途
8020 NameNode RPC
9870 NameNode HTTP
8032 ResourceManager
8088 ResourceManager HTTP
8485 JournalNode RPC
8480 JournalNode HTTP
2181 ZooKeeper
2888 ZK Leader
3888 ZK Election
# 存储规划
目录 用途
/bigdata/fgdata/namenode NameNode数据
/bigdata/fgdata/journalnode JournalNode数据
/bigdata/fgdata/zookeeper ZooKeeper数据
/bigdata/fgdata/datanode DataNode数据
# 高可用要求
要求 说明
至少2个NameNode Active和Standby
至少3个JournalNode 保证多数成功
至少3个ZooKeeper 保证选主可用
网络稳定 保证心跳和同步
2.2 ZooKeeper规划建议
ZooKeeper规划建议:
节点数: 3、5、7(奇数)
建议: 生产环境至少5个节点
# 配置建议
参数 默认值 建议值
tickTime 2000 2000
initLimit 10 10
syncLimit 5 5
maxClientCnxns 60 1024
autopurge.snapRetainCount 3 5
autopurge.purgeInterval 0 24
# 目录规划
目录 用途
/bigdata/fgdata/zookeeper 数据目录
/bigdata/logs/zookeeper 日志目录
# 性能优化
1. 独立磁盘
使用独立磁盘存储数据
2. 内存配置
根据数据量调整内存
3. 网络优化
低延迟网络环境
# 监控指标
指标 说明 告警阈值
zk_server_state 服务状态 非Leader/Follower
zk_packets_received 包接收速率 异常波动
zk_packets_sent 包发送速率 异常波动
2.3 故障转移规划建议
故障转移规划建议:
策略 说明
自动故障转移 ZKFC自动检测和切换
手动故障转移 管理员手动触发
# 故障检测配置
参数 默认值 建议值
ha.zookeeper.session-timeout.ms 5000 10000
ha.failover-controller.newactive.rpc.timeout.ms 60000 120000
# 故障转移演练
演练类型 频率 内容
计划内切换 每月 维护窗口切换
模拟故障 每季度 模拟节点故障
全面演练 每年 灾难恢复演练
# 故障转移检查清单
检查项 状态
ZooKeeper集群正常 [ ]
JournalNode集群正常 [ ]
NameNode状态正常 [ ]
ZKFC服务正常 [ ]
网络连通性正常 [ ]
监控告警配置 [ ]
Part03-生产环境项目实施方案
3.1 HDFS HA部署实战
# 解压安装
$ tar -xzf apache-zookeeper-3.8.0-bin.tar.gz -C /bigdata/app/
$ ln -s /bigdata/app/apache-zookeeper-3.8.0-bin /bigdata/app/zookeeper
# 配置zoo.cfg
$ cat > /bigdata/app/zookeeper/conf/zoo.cfg << 'EOF'
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/bigdata/fgdata/zookeeper
clientPort=2181
server.1=fgedu-node1:2888:3888
server.2=fgedu-node2:2888:3888
server.3=fgedu-node3:2888:3888
autopurge.snapRetainCount=5
autopurge.purgeInterval=24
EOF
# 创建myid文件
$ echo "1" > /bigdata/fgdata/zookeeper/myid # node1
$ echo “2” > /bigdata/fgdata/zookeeper/myid # node2
$ echo “3” > /bigdata/fgdata/zookeeper/myid # node3
# 启动ZooKeeper
$ /bigdata/app/zookeeper/bin/zkServer.sh start
$ /bigdata/app/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Mode: leader
# 2. 配置HDFS HA
# 配置core-site.xml
$ cat > /bigdata/app/hadoop/etc/hadoop/core-site.xml << 'EOF'
EOF
# 配置hdfs-site.xml
$ cat > /bigdata/app/hadoop/etc/hadoop/hdfs-site.xml << 'EOF'
EOF
# 3. 启动JournalNode
$ hdfs –daemon start journalnode
# 4. 格式化NameNode
# 在node1执行
$ hdfs namenode -format
# 5. 启动NameNode(node1)
$ hdfs –daemon start namenode
# 6. 同步NameNode(node2)
$ hdfs namenode -bootstrapStandby
# 7. 启动NameNode(node2)
$ hdfs –daemon start namenode
# 8. 格式化ZKFC
$ hdfs zkfc -formatZK
# 9. 启动ZKFC
$ hdfs –daemon start zkfc
# 10. 启动DataNode
$ hdfs –daemon start datanode
# 11. 验证HA
$ hdfs haadmin -getAllServiceState
fgedu-node1:8020 active
fgedu-node2:8020 standby
3.2 YARN HA部署实战
# 配置yarn-site.xml
$ cat > /bigdata/app/hadoop/etc/hadoop/yarn-site.xml << 'EOF'
EOF
# 2. 启动ResourceManager
$ yarn –daemon start resourcemanager
# 3. 启动NodeManager
$ yarn –daemon start nodemanager
# 4. 验证YARN HA
$ yarn rmadmin -getServiceState rm1
active
$ yarn rmadmin -getServiceState rm2
standby
# 5. 测试故障转移
# 手动切换
$ yarn rmadmin -transitionToStandby rm1
$ yarn rmadmin -transitionToActive rm2
# 验证状态
$ yarn rmadmin -getServiceState rm1
standby
$ yarn rmadmin -getServiceState rm2
active
3.3 HA运维实战
$ cat > /bigdata/scripts/ha/check_ha_status.sh << 'EOF' #!/bin/bash # check_ha_status.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn LOG_FILE="/bigdata/logs/automation/ha_status.log" log_info() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1" | tee -a $LOG_FILE; } # 检查ZooKeeper check_zookeeper() { log_info "检查ZooKeeper状态..." for node in fgedu-node1 fgedu-node2 fgedu-node3; do status=$(ssh $node "/bigdata/app/zookeeper/bin/zkServer.sh status 2>&1 | grep Mode”)
log_info “$node: $status”
done
}
# 检查NameNode HA
check_namenode_ha() {
log_info “检查NameNode HA状态…”
hdfs haadmin -getAllServiceState | while read line; do
log_info “NameNode: $line”
done
}
# 检查YARN HA
check_yarn_ha() {
log_info “检查YARN HA状态…”
rm1_state=$(yarn rmadmin -getServiceState rm1)
rm2_state=$(yarn rmadmin -getServiceState rm2)
log_info “RM1: $rm1_state”
log_info “RM2: $rm2_state”
}
# 主函数
main() {
log_info “========== HA状态检查 ==========”
check_zookeeper
check_namenode_ha
check_yarn_ha
log_info “========== 检查完成 ==========”
}
main
EOF
$ chmod +x /bigdata/scripts/ha/check_ha_status.sh
$ /bigdata/scripts/ha/check_ha_status.sh
[2026-04-08 10:00:00] INFO: ========== HA状态检查 ==========
[2026-04-08 10:00:01] INFO: 检查ZooKeeper状态…
[2026-04-08 10:00:02] INFO: fgedu-node1: Mode: leader
[2026-04-08 10:00:03] INFO: fgedu-node2: Mode: follower
[2026-04-08 10:00:04] INFO: fgedu-node3: Mode: follower
[2026-04-08 10:00:05] INFO: 检查NameNode HA状态…
[2026-04-08 10:00:06] INFO: NameNode: fgedu-node1:8020 active
[2026-04-08 10:00:06] INFO: NameNode: fgedu-node2:8020 standby
[2026-04-08 10:00:07] INFO: 检查YARN HA状态…
[2026-04-08 10:00:08] INFO: RM1: active
[2026-04-08 10:00:08] INFO: RM2: standby
[2026-04-08 10:00:08] INFO: ========== 检查完成 ==========
# 2. 故障转移脚本
$ cat > /bigdata/scripts/ha/failover.sh << 'EOF'
#!/bin/bash
# failover.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
if [ "$#" -ne 2 ]; then
echo "用法: $0
echo “component: namenode|resourcemanager”
echo “action: status|switch”
exit 1
fi
COMPONENT=$1
ACTION=$2
case $COMPONENT in
namenode)
case $ACTION in
status)
hdfs haadmin -getAllServiceState
;;
switch)
current_active=$(hdfs haadmin -getAllServiceState | grep active | cut -d: -f1)
if [ “$current_active” = “fgedu-node1” ]; then
hdfs haadmin -failover nn1 nn2
else
hdfs haadmin -failover nn2 nn1
fi
hdfs haadmin -getAllServiceState
;;
esac
;;
resourcemanager)
case $ACTION in
status)
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
;;
switch)
current_active=$(yarn rmadmin -getServiceState rm1)
if [ “$current_active” = “active” ]; then
yarn rmadmin -transitionToStandby rm1
yarn rmadmin -transitionToActive rm2
else
yarn rmadmin -transitionToStandby rm2
yarn rmadmin -transitionToActive rm1
fi
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
;;
esac
;;
esac
EOF
$ chmod +x /bigdata/scripts/ha/failover.sh
# 查看状态
$ /bigdata/scripts/ha/failover.sh namenode status
fgedu-node1:8020 active
fgedu-node2:8020 standby
# 手动切换
$ /bigdata/scripts/ha/failover.sh namenode switch
fgedu-node2:8020 active
fgedu-node1:8020 standby
Part04-生产案例与实战讲解
4.1 故障转移案例
# 1. 故障场景
Active NameNode节点fgedu-node1宕机
# 2. 故障转移过程
# ZKFC检测到故障
$ tail -f /bigdata/app/hadoop/logs/hadoop-*-zkfc-*.log
2026-04-08 10:00:00,000 INFO ha.ZKFailoverController: NameNode health check failed
2026-04-08 10:00:00,100 INFO ha.ZKFailoverController: Trying to failover
# Standby NameNode成为Active
$ hdfs haadmin -getAllServiceState
fgedu-node2:8020 active
# 3. 验证服务
$ hdfs dfs -ls /
Found 5 items
drwxr-xr-x – hdfs hadoop 0 2026-04-08 10:00 /apps
drwxr-xr-x – hdfs hadoop 0 2026-04-08 10:00 /tmp
drwxr-xr-x – hdfs hadoop 0 2026-04-08 10:00 /user
# 4. 恢复原Active节点
# 修复fgedu-node1
$ hdfs –daemon start namenode
$ hdfs –daemon start zkfc
# 检查状态
$ hdfs haadmin -getAllServiceState
fgedu-node1:8020 standby
fgedu-node2:8020 active
# 5. 切换回原Active(可选)
$ hdfs haadmin -failover nn2 nn1
$ hdfs haadmin -getAllServiceState
fgedu-node1:8020 active
fgedu-node2:8020 standby
4.2 HA故障处理案例
# 1. 故障现象
两个NameNode都显示为Active
$ hdfs haadmin -getAllServiceState
fgedu-node1:8020 active
fgedu-node2:8020 active
# 2. 故障原因
– 网络分区
– ZKFC异常
– ZooKeeper异常
# 3. 处理步骤
# 步骤1: 确认真正的Active
# 查看哪个能正常服务
$ hdfs dfs -ls hdfs://fgedu-node1:8020/
$ hdfs dfs -ls hdfs://fgedu-node2:8020/
# 步骤2: 强制设置一个为Standby
$ hdfs haadmin -transitionToStandby -forcemanual nn2
# 步骤3: 验证状态
$ hdfs haadmin -getAllServiceState
fgedu-node1:8020 active
fgedu-node2:8020 standby
# 步骤4: 检查ZooKeeper
$ zkCli.sh -server fgedu-node1:2181
ls /hadoop-ha/fgeduns
# 步骤5: 重启ZKFC
$ hdfs –daemon stop zkfc
$ hdfs –daemon start zkfc
# 4. 预防措施
– 检查网络稳定性
– 配置fencing方法
– 监控ZooKeeper状态
4.3 常见问题处理
4.3.1 自动故障转移失败
# 排查步骤
# 1. 检查ZooKeeper
$ zkCli.sh -server fgedu-node1:2181
ls /hadoop-ha/fgeduns
# 2. 检查ZKFC日志
$ tail -f /bigdata/app/hadoop/logs/hadoop-*-zkfc-*.log
# 3. 检查ZKFC进程
$ jps | grep ZKFC
# 常见原因
– ZooKeeper不可用
– ZKFC进程异常
– 网络问题
– 配置错误
4.3.2 JournalNode同步失败
# 排查步骤
# 1. 检查JournalNode状态
$ jps | grep JournalNode
# 2. 检查JournalNode日志
$ tail -f /bigdata/app/hadoop/logs/hadoop-*-journalnode-*.log
# 3. 检查磁盘空间
$ df -h /bigdata/fgdata/journalnode
# 解决方案
# 重启JournalNode
$ hdfs –daemon stop journalnode
$ hdfs –daemon start journalnode
Part05-风哥经验总结与分享
5.1 高可用运维最佳实践
高可用运维最佳实践建议:
1. 部署完整HA架构
2. 定期检查HA状态
3. 定期进行故障演练
4. 监控告警配置
5. 文档记录完善
5.2 使用建议
使用建议:
- HA架构要完整部署
- 故障演练要定期进行
- 监控告警要配置完善
- 文档记录要详细完整
5.3 工具推荐
高可用运维工具推荐:
- ZooKeeper:协调服务
- ZKFC:故障转移控制器
- JournalNode:日志同步
- 监控工具:状态监控
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
