总体思路
HDFS通过引入Active/Standby 双 NameNode、基于ZooKeeper与ZKFC的自动故障转移、使用JournalNode/QJM共享并同步编辑日志,以及DataNode 多副本与机架感知等机制,消除单点故障并实现服务连续性与数据可靠性。需要特别说明的是,HDFS是分布式文件系统而非数据库,但其高可用方法论与分布式数据库有共通之处。
核心机制
- 元数据高可用:部署Active/Standby 两个 NameNode,只有 Active 处理写请求;Standby 持续回放共享的编辑日志,随时可接管。借助ZooKeeper与ZKFC(DFSZKFailoverController)进行健康探测、会话管理与自动主备切换,避免脑裂。编辑日志由JournalNode 集群(QJM)持久化,采用多数派写入保证一致性。DataNode 会同时向两台 NameNode 发送心跳与块报告,保证块映射在两端一致。客户端通过ConfiguredFailoverProxyProvider等机制实现透明的故障切换。
- 数据高可用:文件被切分为块并默认以3 副本存储(可配置),结合机架感知将副本分布在不同机架以提升容错与可用性。NameNode 依据心跳机制检测 DataNode 失效,并在副本数低于阈值时自动触发块复制以恢复冗余。
关键配置示例
- 启用命名服务与双 NameNode
- dfs.nameservices=cluster
- dfs.ha.namenodes.cluster=nn1,nn2
- dfs.namenode.rpc-address.cluster.nn1=nn1-host:9000
- dfs.namenode.rpc-address.cluster.nn2=nn2-host:9000
- 配置共享编辑日志(QJM)
- dfs.namenode.shared.edits.dir=qjournal://jn1:8485;jn2:8485;jn3:8485
- dfs.journalnode.edits.dir=/opt/data/journal
- 配置 ZooKeeper 与故障转移代理
- ha.zookeeper.quorum=zk1:2181,zk2:2181,zk3:2181
- dfs.client.failover.proxy.provider.cluster=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
- 客户端默认文件系统
- fs.defaultFS=hdfs://cluster
- 副本数(示例)
- dfs.replication=3
以上为常见最小可用 HA 配置项,生产环境需结合机架拓扑、容量与安全策略细化。
运维与最佳实践
- 不要用 SecondaryNameNode 替代 HA:在 HA 架构中,SecondaryNameNode 仅用于检查点合并,不承担自动故障转移职责;应使用Active/Standby + ZKFC实现自动切换。
- 保障 JournalNode 的可靠性:JournalNode 以多数派持久化编辑日志,部署为奇数节点(如 3/5/7)并跨机架分布,避免共享存储成为新的单点。
- 机架感知与副本策略:正确配置机架感知脚本,遵循跨机架多副本放置,兼顾容错性与网络性能;在节点或磁盘故障后,及时监控并验证块复制是否恢复到目标副本数。
- 客户端容错:应用侧使用支持 HA 的Failover Proxy,在 Active 切换期间实现无感或低感知的重连与重试,减少业务中断时间。