怎样在Linux上实现HDFS的高可用
导读:一、前期准备 节点规划:至少需要3台服务器(用于部署NameNode、JournalNode、ZooKeeper),建议采用奇数台JournalNode(如3台)以保证多数派原则(避免脑裂)。所有节点需安装相同版本的Hadoop,并配置好...
一、前期准备
- 节点规划:至少需要3台服务器(用于部署NameNode、JournalNode、ZooKeeper),建议采用奇数台JournalNode(如3台)以保证多数派原则(避免脑裂)。所有节点需安装相同版本的Hadoop,并配置好JDK环境(建议JDK 1.8及以上)。
- 网络与权限:确保所有节点间IP可达,关闭防火墙或开放必要端口(如HDFS默认端口8020、JournalNode端口8485、ZooKeeper端口2181等)。配置节点间SSH免密登录(使用
ssh-keygen
生成密钥并分发至所有节点),便于后续元数据同步和故障转移。
二、配置核心组件
1. 配置JournalNode(共享存储层)
JournalNode是HDFS高可用的关键组件,用于在Active和Standby NameNode之间同步编辑日志(EditLog),确保元数据一致性。
- 在所有JournalNode节点上,编辑
hdfs-site.xml
,添加以下配置:< property> < name> dfs.journalnode.edits.dir< /name> < value> /path/to/journalnode/data< /value> < !-- JournalNode数据存储路径,需提前创建 --> < /property>
- 启动JournalNode服务(在所有JournalNode节点上执行):
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
- 格式化JournalNode(在任意一个JournalNode节点上执行,仅需一次):
hdfs namenode -formatJournalNode
2. 配置ZooKeeper(故障转移协调层)
ZooKeeper用于监控NameNode状态,实现自动故障转移(需提前安装ZooKeeper并配置集群)。
- 编辑ZooKeeper配置文件
zoo.cfg
(所有ZooKeeper节点一致):server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
- 在每个ZooKeeper节点的
dataDir
目录下创建myid
文件,内容为对应服务器ID(如zk1节点的myid
内容为1
)。 - 启动ZooKeeper集群(在所有ZooKeeper节点上执行):
zkServer.sh start
3. 配置HDFS高可用(NameNode层)
在所有NameNode节点上,修改core-site.xml
和hdfs-site.xml
:
- core-site.xml(指定HDFS默认文件系统和ZooKeeper集群):
< property> < name> fs.defaultFS< /name> < value> hdfs://mycluster< /value> < !-- HDFS集群名称 --> < /property> < property> < name> ha.zookeeper.quorum< /name> < value> zk1:2181,zk2:2181,zk3:2181< /value> < !-- ZooKeeper集群地址 --> < /property>
- hdfs-site.xml(配置NameNode高可用参数):
< property> < name> dfs.nameservices< /name> < value> mycluster< /value> < !-- 与core-site.xml中的fs.defaultFS一致 --> < /property> < property> < name> dfs.ha.namenodes.mycluster< /name> < value> nn1,nn2< /value> < !-- NameNode标识(Active为nn1,Standby为nn2) --> < /property> < property> < name> dfs.namenode.rpc-address.mycluster.nn1< /name> < value> nn1:8020< /value> < !-- Active NameNode RPC地址 --> < /property> < property> < name> dfs.namenode.rpc-address.mycluster.nn2< /name> < value> nn2:8020< /value> < !-- Standby NameNode RPC地址 --> < /property> < property> < name> dfs.namenode.http-address.mycluster.nn1< /name> < value> nn1:50070< /value> < !-- Active NameNode HTTP地址 --> < /property> < property> < name> dfs.namenode.http-address.mycluster.nn2< /name> < value> nn2:50070< /value> < !-- Standby NameNode HTTP地址 --> < /property> < property> < name> dfs.namenode.shared.edits.dir< /name> < value> qjournal://zk1:8485; zk2:8485; zk3:8485/mycluster< /value> < !-- JournalNode共享存储路径 --> < /property> < property> < name> dfs.client.failover.proxy.provider.mycluster< /name> < value> org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider< /value> < !-- 客户端故障转移代理 --> < /property> < property> < name> dfs.ha.fencing.methods< /name> < value> sshfence< /value> < !-- 故障转移隔离方法(防止脑裂) --> < /property> < property> < name> dfs.ha.fencing.ssh.private-key-files< /name> < value> /path/to/private/key< /value> < !-- SSH私钥路径(用于隔离) --> < /property> < property> < name> dfs.journalnode.edits.dir< /name> < value> /path/to/journalnode/data< /value> < !-- JournalNode数据目录(与之前一致) --> < /property>
4. 同步NameNode元数据
在其中一个NameNode节点(如nn1)上执行格式化操作,生成元数据:
hdfs namenode -format
将格式化后的元数据同步到另一个NameNode节点(如nn2):
hdfs namenode -bootstrapStandby
三、启动HDFS高可用集群
- 启动JournalNode:已在前面完成(所有JournalNode节点执行
hadoop-daemon.sh start journalnode
)。 - 启动NameNode:在Active NameNode节点(如nn1)上启动NameNode:
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
- 启动Standby NameNode:在Standby NameNode节点(如nn2)上启动NameNode(会自动同步Active节点的元数据):
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
- 启动DataNode:在所有DataNode节点上启动DataNode服务:
$HADOOP_HOME/sbin/start-dfs.sh
四、验证高可用功能
- 检查集群状态:使用以下命令查看NameNode状态,确认Active和Standby节点正常:
输出应显示两个NameNode,其中一个为hdfs dfsadmin -report
active
,另一个为standby
。 - 测试故障转移:模拟Active NameNode故障(如在nn1上执行
stop-dfs.sh
停止NameNode),等待1-2分钟后,检查Standby NameNode(nn2)是否自动切换为Active状态:hdfs dfsadmin -getServiceState nn2 # 应返回"active"
- 客户端访问测试:在客户端节点上配置
core-site.xml
(fs.defaultFS
指向hdfs://mycluster
),执行HDFS操作(如hdfs dfs -ls /
),确认能正常访问。故障转移后,客户端应自动连接新的Active NameNode。
注意事项
- 数据副本:配置HDFS数据副本因子(
dfs.replication
,默认3),确保数据冗余。 - 监控告警:使用Prometheus+Grafana等工具监控NameNode、JournalNode、ZooKeeper的状态,设置告警规则(如节点宕机、元数据同步延迟)。
- 定期维护:定期备份JournalNode数据,更新Hadoop版本以修复安全漏洞。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 怎样在Linux上实现HDFS的高可用
本文地址: https://pptw.com/jishu/716372.html