1. 首页 > Hadoop教程 > 正文

大数据教程FG099-Hadoop集群高可用运维

本文档风哥主要介绍Hadoop集群高可用运维,包括HA架构、故障转移、日常运维等内容,风哥教程参考Hadoop官方文档High Availability等内容,适合大数据运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 高可用概述

Hadoop集群高可用是保障服务连续性的重要架构,通过冗余和自动故障转移实现。学习交流加群风哥微信: itpux-com

高可用核心要素:

  • 冗余设计:关键组件多实例部署
  • 自动故障转移:故障时自动切换
  • 数据同步:保证数据一致性
  • 健康检查:实时监控组件状态
# Hadoop高可用简介

高可用是保障服务连续性的重要架构,
通过冗余和自动故障转移实现。

主要目标:
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架构介绍:

# NameNode 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组件介绍:

# JournalNode

功能: 存储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+ 高

风哥提示:高可用架构是保障服务连续性的重要措施。建议生产环境部署HA架构,定期进行故障切换演练。

Part02-生产环境规划与建议

2.1 环境规划建议

环境规划建议:

# HA集群规划

节点 角色 配置
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规划建议:

# 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服务正常 [ ]
网络连通性正常 [ ]
监控告警配置 [ ]

生产环境建议:生产环境建议部署完整的HA架构,包括NameNode HA和YARN HA。定期进行故障切换演练,确保故障转移正常工作。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 HDFS HA部署实战

# 1. 安装ZooKeeper集群

# 解压安装
$ 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'
fs.defaultFS
hdfs://fgeduns
ha.zookeeper.quorum
fgedu-node1:2181,fgedu-node2:2181,fgedu-node3:2181

EOF

# 配置hdfs-site.xml
$ cat > /bigdata/app/hadoop/etc/hadoop/hdfs-site.xml << 'EOF'
dfs.nameservices
fgeduns
dfs.ha.namenodes.fgeduns
nn1,nn2
dfs.namenode.rpc-address.fgeduns.nn1
fgedu-node1:8020
dfs.namenode.rpc-address.fgeduns.nn2
fgedu-node2:8020
dfs.namenode.http-address.fgeduns.nn1
fgedu-node1:9870
dfs.namenode.http-address.fgeduns.nn2
fgedu-node2:9870
dfs.namenode.shared.edits.dir
qjournal://fgedu-node3:8485;fgedu-node4:8485;fgedu-node5:8485/fgeduns
dfs.client.failover.proxy.provider.fgeduns
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/root/.ssh/id_rsa
dfs.ha.automatic-failover.enabled
true
dfs.journalnode.edits.dir
/bigdata/fgdata/journalnode

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部署实战

# 1. 配置YARN HA

# 配置yarn-site.xml
$ cat > /bigdata/app/hadoop/etc/hadoop/yarn-site.xml << 'EOF'
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
fgeducluster
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
fgedu-node1
yarn.resourcemanager.hostname.rm2
fgedu-node2
yarn.resourcemanager.webapp.address.rm1
fgedu-node1:8088
yarn.resourcemanager.webapp.address.rm2
fgedu-node2:8088
yarn.resourcemanager.zk-address
fgedu-node1:2181,fgedu-node2:2181,fgedu-node3:2181
yarn.resourcemanager.recovery.enabled
true
yarn.resourcemanager.store.class
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
yarn.nodemanager.aux-services
mapreduce_shuffle

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运维实战

# 1. 状态检查脚本
$ 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

风哥提示:高可用运维需要定期检查HA状态,确保故障转移正常工作。建议定期进行故障切换演练,验证HA功能。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 故障转移案例

# 案例:NameNode自动故障转移

# 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故障处理案例

# 案例: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同步失败

# 问题现象: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:日志同步
  • 监控工具:状态监控
风哥提示:高可用运维是保障服务连续性的重要工作。建议部署完整的HA架构,定期进行故障演练,确保故障转移正常工作。from bigdata视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息