1. 从单点故障到高可用:为什么我们需要JournalNode?
如果你用过早期的HDFS,或者搭建过非高可用的Hadoop集群,一定对NameNode的单点故障(SPOF)问题印象深刻。那时候,NameNode一挂,整个集群就“瞎”了,所有数据都无法访问。为了解决这个问题,社区引入了高可用(HA)架构,而JournalNode就是这个架构里最核心、也最容易被忽视的“无名英雄”。
简单来说,JournalNode就是一个专门用来存“账本”的分布式小集群。这个“账本”就是EditLog,记录了HDFS文件系统所有的元数据变更,比如创建了一个文件、删除了一个目录。在HA模式下,有两个NameNode:一个Active(干活的主节点),一个Standby(待命的备节点)。Active NameNode负责处理所有客户端请求,它产生的EditLog不能只写在自己本地,否则Standby NameNode就没办法同步最新状态,一旦主节点挂了,备节点上位也是一脸懵。
所以,需要一个所有NameNode都能访问的、高可用的共享存储来放这个EditLog。这就是JournalNode的使命。你可以把它想象成一个分布式的、带投票机制的“日志保险箱”。Active NameNode把操作日志存进去,Standby NameNode定时从里面读出来,在自己的内存里“重放”这些操作,从而保持和Active节点几乎一致的状态。
我刚开始接触HA部署时,觉得ZooKeeper才是核心,JournalNode只是个存东西的配角。后来踩过坑才发现,JournalNode的稳定性和写入机制,直接决定了HA切换是否平滑、数据是否一致。它的设计非常巧妙,用相对简单的“多数派”(Quorum)写入原则,就实现了高可用和高一致性,这也是我们今天要深入剖析的重点。
2. Quorum写入机制:分布式系统中的“少数服从多数”
Quorum机制是分布式系统里解决一致性问题的经典套路,JournalNode的写入逻辑就是它的一个典型应用。理解了这个,你就能明白HDFS HA的元数据一致性是怎么保障的。
2.1 Quorum的核心规则:如何才算“写入成功”?
假设我们部署了3个JournalNode节点,分别叫JN1、JN2、JN3。Active NameNode每次要写一条EditLog记录时,它会同时向这3个节点发起写入请求。那么,到底几个节点成功回复,我们才能认为这次写入是成功的呢?
这里就引入了Quorum(法定人数)的概念。它的规则很简单:必须有过半数的节点(N/2 + 1)确认写入成功,这次写操作才算真正完成。
对于3个节点,过半数是 3/2 + 1 = 2(取整后)。也就是说,3个JournalNode里,只要有任意2个成功写入了这条EditLog,Active NameNode就会向客户端返回成功。哪怕第三个节点因为网络延迟、短暂故障等原因写入慢了或者失败了,这次写操作在集群层面也已经被认定为有效。
这个规则带来了两大好处:
- 高可用性:允许部分节点(少于半数)故障,系统依然可写。3个节点允许挂1个,5个节点允许挂2个。
- 强一致性:因为任何成功的写入都保证在多数节点上存在,所以Standby NameNode无论从哪个活着的、包含最新数据的节点去读取,都能拿到一份一致的、最新的日志视图,不会出现数据分歧。
我画个简单的时序图帮你理解:
Active NN -> JN1: 写入EditLog#100
Active NN -> JN2: 写入EditLog#100
Active NN -> JN3: 写入EditLog#100
JN1 -> Active NN: 写入成功
JN2 -> Active NN: 写入成功
(此时,已有2个成功,达到Quorum)
Active NN -> 客户端: 操作成功!
(JN3可能稍后返回成功或超时失败,但已不影响大局)
2.2 容错能力计算:你的集群能承受几次“暴击”?
Quorum机制决定了集群的容错能力。公式很直观:一个由N个节点(N为奇数)组成的JournalNode集群,最多可以容忍 (N-1)/2 个节点同时故障。
我们来算笔账:
- 3节点集群:N=3,容错 = (3-1)/2 = 1。可以挂1个节点,剩下2个还能形成多数派(2 > 3/2),集群依然可读写。
- 5节点集群:N=5,容错 = (5-1)/2 = 2。可以同时挂2个节点,剩下3个节点仍能正常工作。
- 2节点集群?:不行!因为N必须是奇数。如果是2个节点,过半数是2(2/



被折叠的 条评论
为什么被折叠?



