前言
众所周知,HDFS在启用HA模式下时,会有一个ANN(Active NameNode),以及一个SBN(Standby NameNode)。它们之间在通过QJM机制实现元数据的信息同步,简单的来说就是ANN将改动的元数据消息记录(editlog)写到JNN(JournalNode)上,然后SBN再从这些JNN上去读这些信息,再apply到自己的内存空间中。以此达到两边元数据的最终一致。其实从这里,我们能够很容易发现一个同步延时的问题,也就是说SBN内的元数据会略微延时于ANN。举个简单的例子,用户在HDFS内创建一个新的文件,然后立即去查询此文件的信息,在ANN上很显然我们能查到结果,但是从SBN上,可能就查不到。我们用一个专业的术语来描述这种现象:Stale Read,译为延时读。换个层面来说,这是一种读不一致性的问题,也是本文所讨论的一个核心问题点。
SBN实现一致性读的需求场景
针对SBN与ANN因为更新延时的造成的读不一致性问题,这是不是一个需要去解决的问题呢?毕竟元数据最终还是会一致的。但是有的时候,我们不能把问题想的这么简单,如果SBN真的能够做到与ANN的一致性读,那么相当于我们多了一个Read-Only的ANN,可以把SBN的RPC处理能力也给利用起来了。至少目前来看,SBN平时基本用不上,就等着failover切换时备着。下面是SBN实现一致性读更加具体化的应用场景:
- 充分利用SBN的处理能力,将所有读请求转向SNN处理,而让ANN只处理写请求,以此大大增强集群