1. 首页 > Hadoop教程 > 正文

大数据教程FG009-HDFS QJM集群部署实战

内容简介:本文详细介绍HDFS QJM(Quorum Journal Manager)集群部署实战,包括QJM架构原理、JournalNode集群部署、EditLog同步机制、QJM运维管理等核心内容。风哥教程参考Hadoop官方文档HDFS QJM、JournalNode配置等内容。

目录大纲

Part01-基础概念与理论知识
  1.1 QJM架构原理
  1.2 JournalNode角色说明
  1.3 EditLog同步机制
Part02-生产环境规划与建议
  2.1 QJM集群规划
  2.2 JournalNode硬件配置
  2.3 QJM网络规划
Part03-生产环境项目实施方案
  3.1 JournalNode集群部署
  3.2 QJM配置详解
  3.3 QJM集群验证
  3.4 QJM运维管理
Part04-生产案例与实战讲解
  4.1 QJM故障恢复案例
  4.2 QJM性能优化案例
  4.3 QJM监控告警案例
Part05-风哥经验总结与分享
  5.1 QJM最佳实践
  5.2 QJM常见问题解决

Part01-基础概念与理论知识

1.1 QJM架构原理

QJM(Quorum Journal Manager)是HDFS HA的核心组件,负责管理NameNode的EditLog共享存储。更多视频教程www.fgedu.net.cn QJM通过JournalNode集群实现EditLog的分布式存储,保证数据的一致性和可靠性。

风哥提示:QJM采用Paxos算法思想,通过多数派写入机制保证数据一致性,至少需要3个JournalNode。

1.2 JournalNode角色说明

JournalNode是QJM的核心服务进程,每个JournalNode存储一份EditLog副本。学习交流加群风哥微信: itpux-com Active NameNode写入EditLog时,需要获得多数JournalNode的确认。

JournalNode核心功能:
– 接收并存储Active NameNode的EditLog
– 提供EditLog读取服务给Standby NameNode
– 参与EditLog写入的多数派确认
– 支持EditLog的恢复和同步

1.3 EditLog同步机制

EditLog是HDFS元数据的修改日志,记录了所有文件系统操作。from bigdata视频:www.itpux.com QJM通过以下机制保证EditLog的同步:

# 查看EditLog文件
ls -la /bigdata/fgdata/journalnode/fgeduns/current/

total 1048576
-rw-r–r– 1 hdfs hdfs 1048576 Jan 15 16:00 edits_0000000000000000001-0000000000000001000
-rw-r–r– 1 hdfs hdfs 1048576 Jan 15 16:05 edits_0000000000000001001-0000000000000002000
-rw-r–r– 1 hdfs hdfs 1048576 Jan 15 16:10 edits_0000000000000002001-0000000000000003000
-rw-r–r– 1 hdfs hdfs 32 Jan 15 16:10 seen_txid

Part02-生产环境规划与建议

2.1 QJM集群规划

QJM集群规划需要考虑可用性、性能和成本。更多学习教程公众号风哥教程itpux_com 生产环境建议部署3个或5个JournalNode。

QJM集群规划建议:
– 3节点集群:允许1个节点故障,适合中小规模集群
– 5节点集群:允许2个节点故障,适合大规模生产集群
– 7节点集群:允许3个节点故障,适合超大规模集群

2.2 JournalNode硬件配置

JournalNode对硬件要求相对较低,但需要保证磁盘IO性能。学习交流加群风哥QQ113257174

# 查看JournalNode服务器配置
cat /proc/meminfo | grep MemTotal
df -h /bigdata/fgdata/journalnode

MemTotal: 16384000 kB
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 500G 50G 450G 10% /bigdata/fgdata

2.3 QJM网络规划

QJM网络规划需要保证JournalNode之间的低延迟通信。风哥提示:建议JournalNode部署在同一网络交换机下。

# 测试网络延迟
ping -c 3 fgedu03.net.cn

PING fgedu03.net.cn (192.168.1.102) 56(84) bytes of data.
64 bytes from fgedu03.net.cn (192.168.1.102): icmp_seq=1 ttl=64 time=0.123 ms
64 bytes from fgedu03.net.cn (192.168.1.102): icmp_seq=2 ttl=64 time=0.098 ms
64 bytes from fgedu03.net.cn (192.168.1.102): icmp_seq=3 ttl=64 time=0.105 ms
— fgedu03.net.cn ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.098/0.108/0.123/0.015 ms

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

3.1 JournalNode集群部署

3.1.1 创建JournalNode数据目录

# 在所有JournalNode节点创建目录
mkdir -p /bigdata/fgdata/journalnode
chown -R hdfs:hdfs /bigdata/fgdata/journalnode
chmod 755 /bigdata/fgdata/journalnode

# 目录创建成功
ls -la /bigdata/fgdata/ | grep journalnode
drwxr-xr-x 2 hdfs hdfs 4096 Jan 15 16:20 journalnode

3.1.2 配置hdfs-site.xml

# 配置JournalNode相关参数
vi /bigdata/app/hadoop/etc/hadoop/hdfs-site.xml

<!– 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>

<!– JournalNode RPC端口 –>
<property>
<name>dfs.journalnode.rpc-address</name>
<value>0.0.0.0:8485</value>
</property>

<!– JournalNode HTTP端口 –>
<property>
<name>dfs.journalnode.http-address</name>
<value>0.0.0.0:8480</value>
</property>

<!– JournalNode HTTPS端口 –>
<property>
<name>dfs.journalnode.https-address</name>
<value>0.0.0.0:8481</value>
</property>

3.1.3 启动JournalNode服务

# 在所有JournalNode节点启动服务
hdfs –daemon start journalnode
# 验证服务状态
jps | grep JournalNode
netstat -tlnp | grep 8485

# 启动成功
29500 JournalNode

# 端口监听正常
tcp6 0 0 :::8485 :::* LISTEN 29500/java
tcp6 0 0 :::8480 :::* LISTEN 29500/java

3.2 QJM配置详解

3.2.1 核心配置参数

# 查看QJM核心配置
hdfs getconf -confKey dfs.namenode.shared.edits.dir

qjournal://fgedu03.net.cn:8485;fgedu04.net.cn:8485;fgedu05.net.cn:8485/fgeduns

QJM核心配置说明:
– dfs.namenode.shared.edits.dir:JournalNode集群地址
– dfs.journalnode.edits.dir:JournalNode本地存储目录
– dfs.journalnode.rpc-address:JournalNode RPC服务地址
– dfs.journalnode.http-address:JournalNode Web UI地址

3.2.2 性能优化配置

# 配置JournalNode性能参数
cat /bigdata/app/hadoop/etc/hadoop/hdfs-site.xml | grep -A3 “journalnode”

<!– JournalNode同步间隔 –>
<property>
<name>dfs.journalnode.sync.interval</name>
<value>5</value>
</property>

<!– EditLog写入超时 –>
<property>
<name>dfs.qjournal.write-txns.timeout</name>
<value>60000</value>
</property>

<!– JournalNode请求超时 –>
<property>
<name>dfs.qjournal.rpc-timeout.ms</name>
<value>30000</value>
</property>

3.3 QJM集群验证

3.3.1 验证JournalNode状态

# 访问JournalNode Web UI
curl http://fgedu03.net.cn:8480/journalstatus
# 查看JournalNode日志
tail -50 /bigdata/app/hadoop/logs/hadoop-hdfs-journalnode-fgedu03.log

# JournalNode状态正常
{“state”:”running”,”lastWrittenTxId”:3000,”formatted”:true}

# 日志输出
2024-01-15 16:30:00,000 INFO journal.JournalNode: JournalNode started
2024-01-15 16:30:05,123 INFO journal.Journal: Formatting journal fgeduns
2024-01-15 16:30:10,456 INFO server.JournalNodeHttpServer: JournalNode Web server started

3.3.2 验证EditLog同步

# 在NameNode上执行操作
hdfs dfs -mkdir /bigdata/test_qjm
hdfs dfs -ls /bigdata/ | grep test_qjm
# 检查EditLog同步
hdfs dfsadmin -printTopology

# 目录创建成功
drwxr-xr-x – hdfs hdfs 0 2024-01-15 16:35 /bigdata/test_qjm

# 拓扑信息正常
Rack: /default-rack
192.168.1.101:9866 (fgedu01.net.cn)
192.168.1.102:9866 (fgedu02.net.cn)
192.168.1.103:9866 (fgedu03.net.cn)

3.4 QJM运维管理

3.4.1 JournalNode启停管理

# 停止JournalNode
hdfs –daemon stop journalnode
# 启动JournalNode
hdfs –daemon start journalnode
# 重启JournalNode
hdfs –daemon restart journalnode

# 停止成功
no JournalNode to stop
# 启动成功
starting journalnode, logging to /bigdata/app/hadoop/logs/hadoop-hdfs-journalnode-fgedu03.out
# 进程验证
jps | grep JournalNode
30100 JournalNode

3.4.2 JournalNode数据恢复

# 从其他JournalNode同步数据
# 首先停止目标JournalNode
hdfs –daemon stop journalnode
# 清理损坏的数据
rm -rf /bigdata/fgdata/journalnode/fgeduns/*
# 从正常JournalNode复制数据
scp -r fgedu04.net.cn:/bigdata/fgdata/journalnode/fgeduns /bigdata/fgdata/journalnode/
# 启动JournalNode
hdfs –daemon start journalnode

# 数据复制成功
fgeduns/ 100% 1024MB 50.0MB/s 00:20
# JournalNode启动成功
starting journalnode, logging to /bigdata/app/hadoop/logs/hadoop-hdfs-journalnode-fgedu03.out
# 验证数据同步
ls /bigdata/fgdata/journalnode/fgeduns/current/
edits_0000000000000000001-0000000000000003000 seen_txid

Part04-生产案例与实战讲解

4.1 QJM故障恢复案例

JournalNode故障是生产环境常见问题。更多视频教程www.fgedu.net.cn 以下是JournalNode故障恢复的实战案例。

# 检测JournalNode故障
hdfs haadmin -getServiceState nn1
# 查看JournalNode集群状态
hdfs getconf -journalNodes

# NameNode状态正常
active

# JournalNode列表
fgedu03.net.cn:8485
fgedu04.net.cn:8485
fgedu05.net.cn:8485

# 测试JournalNode连接
nc -zv fgedu03.net.cn 8485
Connection to fgedu03.net.cn 8485 port [tcp/*] succeeded!

4.1.1 单节点故障恢复

# 单JournalNode故障恢复流程
# 1. 检查故障节点
ssh fgedu03.net.cn “jps | grep JournalNode”
# 2. 查看故障日志
tail -100 /bigdata/app/hadoop/logs/hadoop-hdfs-journalnode-fgedu03.log
# 3. 重启服务
hdfs –daemon start journalnode

# 故障检测
# 无JournalNode进程

# 日志分析
2024-01-15 17:00:00,000 ERROR journal.JournalNode: JournalNode crashed due to disk full

# 清理磁盘空间后重启
starting journalnode, logging to /bigdata/app/hadoop/logs/hadoop-hdfs-journalnode-fgedu03.out
# 恢复成功
jps | grep JournalNode
30500 JournalNode

4.2 QJM性能优化案例

QJM性能优化主要关注磁盘IO和网络传输。学习交流加群风哥微信: itpux-com

# 优化JournalNode磁盘IO
# 使用独立磁盘存储EditLog
cat /etc/fstab | grep journalnode
# 调整磁盘调度算法
echo deadline > /sys/block/sdb/queue/scheduler

# 独立磁盘挂载
/dev/sdb1 /bigdata/fgdata/journalnode ext4 defaults,noatime 0 0

# 调度算法设置成功
cat /sys/block/sdb/queue/scheduler
noop [deadline] cfq

4.3 QJM监控告警案例

4.3.1 JournalNode监控脚本

#!/bin/bash
# jn_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

JN_NODES=”fgedu03.net.cn fgedu04.net.cn fgedu05.net.cn”
PORT=8485

for node in ${JN_NODES}; do
if nc -zv ${node} ${PORT} &>/dev/null; then
echo “$(date) – ${node}:${PORT} is UP”
else
echo “$(date) – ${node}:${PORT} is DOWN – ALERT!”
# 发送告警
echo “JournalNode ${node} is down!” | mail -s “JN Alert” admin@fgedu.net.cn
fi
done

# 执行监控脚本
./jn_monitor.sh
Mon Jan 15 17:30:00 CST 2024 – fgedu03.net.cn:8485 is UP
Mon Jan 15 17:30:00 CST 2024 – fgedu04.net.cn:8485 is UP
Mon Jan 15 17:30:00 CST 2024 – fgedu05.net.cn:8485 is UP

Part05-风哥经验总结与分享

5.1 QJM最佳实践

在实际生产环境中,QJM部署需要注意以下几点:from bigdata视频:www.itpux.com

风哥经验总结:
1. JournalNode数量必须是奇数,推荐3或5个
2. JournalNode应分布在不同机架,提高可用性
3. 使用独立磁盘存储EditLog,避免IO竞争
4. 定期检查EditLog文件大小,及时清理历史日志
5. 配置监控告警,及时发现JournalNode故障

5.2 QJM常见问题解决

5.2.1 EditLog文件过大

风哥提示:当EditLog文件过大时,会影响JournalNode性能,建议定期执行checkpoint。

# 手动触发checkpoint
hdfs dfsadmin -safemode enter
hdfs dfsadmin -saveNamespace
hdfs dfsadmin -safemode leave
# 检查EditLog文件
ls -lh /bigdata/fgdata/journalnode/fgeduns/current/

# checkpoint执行成功
Safe mode is ON
Save namespace successful
Safe mode is OFF

# EditLog文件已合并
total 100M
-rw-r–r– 1 hdfs hdfs 100M Jan 15 17:45 edits_0000000000000003001-0000000000000005000
-rw-r–r– 1 hdfs hdfs 32 Jan 15 17:45 seen_txid

5.2.2 JournalNode时钟不同步

注意事项:
– JournalNode之间时钟必须同步,否则会导致EditLog写入失败
– 建议配置NTP服务,保持时钟一致
– 时钟偏差超过阈值会导致HA切换失败

# 检查时钟同步
ntpstat
# 手动同步时间
ntpdate -u pool.ntp.org

# 时钟同步状态
synchronised to NTP server (192.168.1.1) at stratum 3
time correct to within 50 ms
polling server every 1024 s

# 手动同步成功
15 Jan 18:00:00 ntpdate[31000]: adjust time server 192.168.1.1 offset 0.001234 sec

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

联系我们

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

微信号:itpux-com

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