本文详细介绍Hadoop网络隔离故障演练实战,包括故障模拟、故障处理、故障恢复、网络分区脑裂等内容,适合大数据运维工程师使用。学习交流加群风哥微信: itpux-com
Part01-基础概念与理论知识
1.1 网络隔离概述
网络隔离是指节点之间网络不通,但节点本身还在运行。更多视频教程www.fgedu.net.cn
- 交换机故障
- 网线故障
- 防火墙规则变更
- 网络配置错误
- 网络分区
1.2 故障影响
故障影响:
1. DataNode网络隔离
– 该DataNode被标记为Dead
– 副本不足
– 触发复制
– 影响:可用,性能下降
2. NameNode网络隔离
– 如果是Active,触发脑裂
– 如果是Standby,可能选主
– 影响:严重,可能数据不一致
3. ZooKeeper网络隔离
– 无法选主
– 无法更新状态
– 影响:严重
4. 网络分区
– 脑裂风险
– 数据不一致
– 影响:非常严重
1.3 检测机制
检测机制:
Part02-生产环境规划与建议
2.1 网络架构设计
网络架构设计:
1. 网络冗余
– 双网卡
– 双交换机
– bonding
– 多路径
2. 网络分区
– VLAN划分
– 安全隔离
– 流量控制
3. 网络质量
– 低延迟
– 高带宽
– 低丢包
2.2 网络监控
网络监控:
- 连通性:ping、telnet
- 带宽:流量统计
- 延迟:ping延迟
- 丢包:丢包率
from bigdata视频:www.itpux.com
2.3 高可用设计
高可用设计:
1. 节点HA
– NameNode HA
– ResourceManager HA
– HBase Master HA
2. 网络HA
– 双网卡
– 双交换机
– 冗余路由
3. 数据HA
– 多副本
– 跨机架
– 异地备份
Part03-生产环境项目实施方案
3.1 故障模拟
3.1.1 iptables模拟网络隔离
# 警告:仅在测试环境执行!
# 1. 模拟DataNode网络隔离
# 在NameNode上执行,阻断与某DataNode的通信
ssh fgedu-nn01 “iptables -A INPUT -s 192.168.1.11 -j DROP”
ssh fgedu-nn01 “iptables -A OUTPUT -d 192.168.1.11 -j DROP”
# 2. 验证网络隔离
ping 192.168.1.11
# 应该ping不通
# 3. 观察HDFS状态
sleep 60
hdfs dfsadmin -report
# 该DataNode应该被标记为Dead
# 4. 恢复网络
ssh fgedu-nn01 “iptables -D INPUT -s 192.168.1.11 -j DROP”
ssh fgedu-nn01 “iptables -D OUTPUT -d 192.168.1.11 -j DROP”
# 5. 验证恢复
ping 192.168.1.11
sleep 60
hdfs dfsadmin -report
3.1.2 ifdown模拟网络隔离
# 警告:仅在测试环境执行!
# 1. 在目标节点上禁用网卡
ssh fgedu-dn01 “ifdown eth0”
# 2. 验证
ping fgedu-dn01
# 应该ping不通
# 3. 观察HDFS
sleep 60
hdfs dfsadmin -report
# 4. 恢复
ssh fgedu-dn01 “ifup eth0”
# 5. 验证
ping fgedu-dn01
sleep 60
hdfs dfsadmin -report
3.2 故障处理
3.2.1 DataNode网络隔离处理
# 1. 发现问题
hdfs dfsadmin -report
# 输出示例:
# Dead datanodes (1):
# fgedu-dn01
# 2. 检查网络
ping fgedu-dn01
telnet fgedu-dn01 9866
# 3. 检查节点
ssh fgedu-dn01
# 如果能ssh,说明网络部分通
jps
# 检查DataNode进程
# 4. 检查日志
tail -n 100 /bigdata/app/hadoop/logs/hadoop-hdfs-datanode-*.log
tail -n 100 /bigdata/app/hadoop/logs/hadoop-hdfs-namenode-*.log
# 5. 恢复网络
# 根据原因修复
# 修复网线
# 修复交换机
# 修复防火墙
# 修复路由
# 6. 恢复服务
# 如果DataNode进程还在,等待自动重连
# 如果不在,启动DataNode
hdfs –daemon start datanode
3.3 故障恢复
3.3.1 恢复验证
# 1. 网络验证
ping fgedu-dn01
telnet fgedu-dn01 9866
telnet fgedu-dn01 8040
# 2. 服务验证
jps
hdfs dfsadmin -report
yarn node -list
# 3. 数据验证
hdfs fsck /
hdfs dfs -ls /
hdfs dfs -put /etc/hosts /test/
# 4. 功能验证
hadoop jar /bigdata/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar pi 2 100
Part04-生产案例与实战讲解
4.1 DataNode网络隔离
4.1.1 实战案例
# 场景:DataNode网络隔离
# 1. 模拟故障
echo “=== Simulating Network Isolation ===”
# 在NameNode上阻断DataNode
ssh fgedu-nn01 “iptables -A INPUT -s 192.168.1.11 -j DROP”
ssh fgedu-nn01 “iptables -A OUTPUT -d 192.168.1.11 -j DROP”
# 2. 等待超时
echo “Waiting for heartbeat timeout…”
sleep 600
# 3. 检查状态
echo “=== Checking HDFS Status ===”
hdfs dfsadmin -report
# 输出示例:
# Live datanodes (2):
# …
# Dead datanodes (1):
# fgedu-dn01
# 4. 检查块复制
hdfs fsck /
# 应该看到Under-replicated blocks
# 5. 恢复网络
echo “=== Recovering Network ===”
ssh fgedu-nn01 “iptables -D INPUT -s 192.168.1.11 -j DROP”
ssh fgedu-nn01 “iptables -D OUTPUT -d 192.168.1.11 -j DROP”
# 6. 观察恢复
echo “=== Watching Recovery ===”
sleep 300
hdfs dfsadmin -report
hdfs fsck /
4.2 NameNode网络隔离
4.2.1 实战案例
# 场景:Active NameNode网络隔离
# 1. 初始状态
echo “=== Initial State ===”
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
# 输出示例:
# nn1: active
# nn2: standby
# 2. 模拟网络隔离
echo “=== Simulating Network Isolation for nn1 ===”
# 阻断nn1与ZK、JN、其他NN的通信
ssh fgedu-nn01 “iptables -A INPUT -s 192.168.1.12 -j DROP”
ssh fgedu-nn01 “iptables -A OUTPUT -d 192.168.1.12 -j DROP”
for zk in fgedu-zk01 fgedu-zk02 fgedu-zk03; do
ssh fgedu-nn01 “iptables -A INPUT -s $zk -j DROP”
ssh fgedu-nn01 “iptables -A OUTPUT -d $zk -j DROP”
done
# 3. 等待故障转移
echo “Waiting for failover…”
sleep 120
# 4. 检查新状态
echo “=== New State ===”
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
# 输出示例(如果成功):
# nn1: standby
# nn2: active
# 5. 验证
echo “=== Verifying HDFS ===”
hdfs dfs -ls /
# 6. 恢复网络
echo “=== Recovering Network ===”
ssh fgedu-nn01 “iptables -F”
# 7. 最终检查
sleep 60
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
4.3 网络分区脑裂
4.3.1 实战案例
# 警告:有风险,仅在测试环境执行!
# 1. 初始状态
echo “=== Initial State ===”
/bigdata/app/zookeeper/bin/zkServer.sh status
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
# 2. 模拟网络分区
echo “=== Simulating Network Partition ===”
# 将集群分成两部分
# 假设:
# Zone A: fgedu-zk01, fgedu-nn01
# Zone B: fgedu-zk02, fgedu-zk03, fgedu-nn02
# 在Zone A阻断Zone B
ssh fgedu-zk01 “iptables -A INPUT -s 192.168.1.22 -j DROP”
ssh fgedu-zk01 “iptables -A INPUT -s 192.168.1.23 -j DROP”
ssh fgedu-zk01 “iptables -A OUTPUT -d 192.168.1.22 -j DROP”
ssh fgedu-zk01 “iptables -A OUTPUT -d 192.168.1.23 -j DROP”
# 在Zone B阻断Zone A
ssh fgedu-zk02 “iptables -A INPUT -s 192.168.1.21 -j DROP”
ssh fgedu-zk02 “iptables -A OUTPUT -d 192.168.1.21 -j DROP”
# 3. 观察结果
echo “=== Observing ===”
sleep 120
# 检查各分区
echo “=== Zone A ===”
ssh fgedu-zk01 “/bigdata/app/zookeeper/bin/zkServer.sh status”
echo “=== Zone B ===”
ssh fgedu-zk02 “/bigdata/app/zookeeper/bin/zkServer.sh status”
ssh fgedu-zk03 “/bigdata/app/zookeeper/bin/zkServer.sh status”
# Zone B应该能选出Leader(因为有2个节点,超过半数)
# Zone A应该不能选出Leader(只有1个节点,不满足半数)
# 4. 恢复网络
echo “=== Recovering Network ===”
ssh fgedu-zk01 “iptables -F”
ssh fgedu-zk02 “iptables -F”
# 5. 最终检查
sleep 60
/bigdata/app/zookeeper/bin/zkServer.sh status
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
Part05-风哥经验总结与分享
5.1 最佳实践
最佳实践:
- 网络冗余:双网卡、双交换机
- ZK部署:奇数个节点,跨机架
- 网络监控:全面监控网络状态
- 快速发现:及时发现网络故障
- 快速恢复:快速定位和恢复
5.2 经验教训
1. 忽视网络冗余
– 教训:单交换机故障导致全集群不可用
– 改进:双交换机、网卡bonding
2. ZK节点太少
– 教训:网络分区导致无法选主
– 改进:至少3个ZK节点
3. 网络监控不足
– 教训:故障发现晚
– 改进:完善网络监控
5.3 检查清单
## 网络检查
– [ ] 网络冗余配置
– [ ] 网络连通性正常
– [ ] 网络延迟正常
– [ ] 网络丢包率低
– [ ] 网络带宽充足
## ZK检查
– [ ] ZK节点数量(奇数)
– [ ] ZK状态正常
– [ ] ZK跨机架部署
## 监控检查
– [ ] 网络监控配置
– [ ] 连通性监控
– [ ] 流量监控
– [ ] 告警配置
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
