在HA的集群里头,两台独立的机器会被个配置成为一个NameNode。在任何时刻,只能有一个namenode是active的,另外一个是standby状态。active的namenode是负责来自client的所有请求操作,而standby则在待命随时准备成为active的namenode。
为了保持namenode active和namenode standby 之间的同步,两个namenode之间通过一个叫做JournalNodes的守护进程来保持同步的。当namenode active的namespace有被修改的时候,namenode active会把这些操作日志记录在journalnodes上。然后namenode standby就会从journalnodes的edits上读取这些操作日志。当namenode拿到edits操作日志之后,它就会把日志的操作应用到自己的namespace里头。一旦namenode active出现问题,namenode standby就可以确保自己在成为namenode active之前,自己已经读取了所有的edits操作日志。
为了提供一个快速的热备切换,就需要namenode standby时刻知道block的位置信息,要实现这一点,datanode节点配置了namenode的信息,然后datanode主动把block的位置信息和心跳数据发送给两个namenode。
确保任何时候只有一个active的namenode是至关重要的,否则,可能导致数据丢失和一些严重后果。journalnodes会保证同一时刻只有一个namenode active。在热备切换的时候,即将成为active的namenode standby会接管writer的角色。