如何实现CentOS HDFS高可用
导读:一、前期准备 集群规划:至少需要3台CentOS服务器(建议奇数台,如3或5台),分别部署NameNode(2台,一主一备)、JournalNode(3台,奇数台保证多数派)、ZooKeeper(3台,用于故障转移协调)、DataNode...
一、前期准备
- 集群规划:至少需要3台CentOS服务器(建议奇数台,如3或5台),分别部署NameNode(2台,一主一备)、JournalNode(3台,奇数台保证多数派)、ZooKeeper(3台,用于故障转移协调)、DataNode(根据存储需求配置)。所有节点需处于同一局域网,确保网络互通(延迟< 100ms)。
- 基础环境配置:
- 安装Java JDK 8+:
sudo yum install java-1.8.0-openjdk-devel
,配置JAVA_HOME
环境变量(/etc/profile.d/java.sh
)并生效。 - 下载并解压Hadoop(建议3.x版本):
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
,解压至/opt/
,配置HADOOP_HOME
环境变量(/etc/profile.d/hadoop.sh
)并生效。 - 配置SSH免密登录:在所有节点间生成密钥(
ssh-keygen -t rsa
),并将公钥(id_rsa.pub
)追加到~/.ssh/authorized_keys
,实现无密码远程操作。
- 安装Java JDK 8+:
二、配置JournalNode(共享编辑日志存储) JournalNode用于存储NameNode的edits log(操作日志),确保Active与Standby NameNode的元数据同步。
- 在
hdfs-site.xml
中添加JournalNode配置:< property> < name> dfs.journalnode.edits.dir< /name> < value> /var/hadoop/hdfs/journal< /value> < !-- 日志存储路径,需提前创建并授权(chown -R hadoop:hadoop /var/hadoop/hdfs/journal) --> < /property>
- 启动JournalNode服务:在所有JournalNode节点上执行
hadoop-daemon.sh start journalnode
,通过jps
命令检查JournalNode
进程是否运行。
三、配置ZooKeeper(故障转移协调) ZooKeeper用于监控NameNode状态,触发自动故障转移(ZKFC,ZooKeeper Failover Controller)。
- 在所有ZooKeeper节点上解压并配置ZooKeeper(建议3.4+版本):
- 创建数据目录:
mkdir -p /var/lib/zookeeper
。 - 配置
zoo.cfg
(/opt/zookeeper/conf/zoo.cfg
):tickTime=2000 initLimit=10 syncLimit=5 dataDir=/var/lib/zookeeper clientPort=2181 server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
- 在
dataDir
下创建myid
文件(内容为节点ID,如zoo1节点写入1
)。
- 创建数据目录:
- 启动ZooKeeper服务:在所有ZooKeeper节点上执行
zkServer.sh start
,通过zkServer.sh status
检查Leader状态。
四、配置HDFS高可用(NameNode与ZKFC)
- 修改
core-site.xml
(全局配置):< property> < name> fs.defaultFS< /name> < value> hdfs://mycluster< /value> < !-- 集群名称,需与hdfs-site.xml中的dfs.nameservices一致 --> < /property> < property> < name> ha.zookeeper.quorum< /name> < value> zoo1:2181,zoo2:2181,zoo3:2181< /value> < !-- ZooKeeper集群地址 --> < /property>
- 修改
hdfs-site.xml
(HDFS高可用核心配置):< property> < name> dfs.nameservices< /name> < value> mycluster< /value> < !-- 集群名称 --> < /property> < property> < name> dfs.ha.namenodes.mycluster< /name> < value> nn1,nn2< /value> < !-- NameNode标识(逗号分隔) --> < /property> < property> < name> dfs.namenode.rpc-address.mycluster.nn1< /name> < value> namenode1:8020< /value> < !-- Active NameNode RPC地址 --> < /property> < property> < name> dfs.namenode.rpc-address.mycluster.nn2< /name> < value> namenode2:8020< /value> < !-- Standby NameNode RPC地址 --> < /property> < property> < name> dfs.namenode.http-address.mycluster.nn1< /name> < value> namenode1:50070< /value> < !-- Active NameNode HTTP地址 --> < /property> < property> < name> dfs.namenode.http-address.mycluster.nn2< /name> < value> namenode2:50070< /value> < !-- Standby NameNode HTTP地址 --> < /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> /home/hadoop/.ssh/id_rsa< /value> < !-- SSH私钥路径(用于隔离) --> < /property> < property> < name> dfs.namenode.shared.edits.dir< /name> < value> qjournal://journalnode1:8485; journalnode2:8485; journalnode3:8485/mycluster< /value> < !-- JournalNode共享日志地址 --> < /property>
- 格式化NameNode:在Active NameNode(如namenode1)上执行
hdfs namenode -format
,初始化元数据。 - 启动JournalNode:在所有JournalNode节点上执行
hadoop-daemon.sh start journalnode
,确保服务正常。 - 启动NameNode:在Active NameNode上执行
hadoop-daemon.sh start namenode
,格式化完成后,将元数据同步到Standby NameNode(hdfs namenode -bootstrapStandby
)。 - 启动ZKFC:在所有NameNode节点上执行
hadoop-daemon.sh start zkfc
,ZKFC会监控NameNode状态,自动触发故障转移。 - 启动DataNode:在所有DataNode节点上执行
hadoop-daemon.sh start datanode
,注册到NameNode。
五、验证高可用性
- 检查集群状态:执行
hdfs dfsadmin -report
,查看NameNode状态(应显示active
和standby
)。 - 测试故障转移:
- 手动停止Active NameNode(
hadoop-daemon.sh stop namenode
)。 - 观察Standby NameNode是否自动切换为Active(通过
hdfs dfsadmin -report
或Web界面http://namenode1:50070
查看)。
- 手动停止Active NameNode(
- 测试客户端访问:使用
hdfs dfs -put
命令上传文件,停止Active NameNode后,再次上传,验证客户端是否自动连接到Standby NameNode。
六、后续维护
- 监控告警:部署Prometheus+Grafana监控集群状态(如NameNode心跳、DataNode块数量、ZooKeeper连接数),设置异常告警(如邮件、短信)。
- 数据备份:定期备份NameNode元数据(
hdfs namenode -backup
)和JournalNode数据,防止数据丢失。 - 安全加固:启用Kerberos认证(
kinit
命令获取票据),配置HDFS权限(hdfs dfs -chmod
),限制防火墙端口(仅开放必要端口,如8020、50070、2181)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何实现CentOS HDFS高可用
本文地址: https://pptw.com/jishu/732003.html