阅读量:0
一、前期准备
- 节点规划:至少需要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.dirname> <value>/path/to/journalnode/datavalue> 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.defaultFSname> <value>hdfs://myclustervalue> property> <property> <name>ha.zookeeper.quorumname> <value>zk1:2181,zk2:2181,zk3:2181value> property> - hdfs-site.xml(配置NameNode高可用参数):
<property> <name>dfs.nameservicesname> <value>myclustervalue> property> <property> <name>dfs.ha.namenodes.myclustername> <value>nn1,nn2value> property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1name> <value>nn1:8020value> property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2name> <value>nn2:8020value> property> <property> <name>dfs.namenode.http-address.mycluster.nn1name> <value>nn1:50070value> property> <property> <name>dfs.namenode.http-address.mycluster.nn2name> <value>nn2:50070value> property> <property> <name>dfs.namenode.shared.edits.dirname> <value>qjournal://zk1:8485;zk2:8485;zk3:8485/myclustervalue> property> <property> <name>dfs.client.failover.proxy.provider.myclustername> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue> property> <property> <name>dfs.ha.fencing.methodsname> <value>sshfencevalue> property> <property> <name>dfs.ha.fencing.ssh.private-key-filesname> <value>/path/to/private/keyvalue> property> <property> <name>dfs.journalnode.edits.dirname> <value>/path/to/journalnode/datavalue> 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 -reportactive,另一个为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版本以修复安全漏洞。
以上就是关于“怎样在Linux上实现HDFS的高可用”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm