后
Namenode两大功能:
1、接收客户端读写服务
2、存放元数据(元数据包括fsimage和edits,其中fsimage是namenode格式化时候产生的;edits是运行中实时产生、修改的)
问题一:
上图中NN Active和NN Standby是两个Namenode,其中NN Active为活动的Namenode,NN Standby是备份。
但是两个Namenode都有各自的元数据fsimage,当活动Namenode挂掉之后,由于元数据不一致,NN Standby不能直接接管NN Active
解决方案:
让其中一个Namenode格式化得到元数据后,另一个不要在格式化,直接将之前的元数据拷贝过来。
问题二:
当NN Active挂掉后,直接切换到NN Standby时候,NN Standby并没有edits文件,此时NN Active已经挂掉,无法从NN Active拷贝,这也决定了NN Standby切换过来后不可以直接使用。
解决方案:
方案一:将edits保存至一个共享磁盘中,不再保存至NN Active。但这个方案的不足点在于共享机器挂掉后集群还是挂掉。所以一般不用。
方案二:将edits放入一个内部集群中,其有多副本。(其内部集群就是图中的JournalNodes,一般情况下为两至三台以上服务器组成。其中对edits和fsimage文件的合并也是JournalNodes帮我们做的,其会同时合并NN Active和NN Standby中的fsimage)
注意:datanode给NameNode汇报块消息时需要同时对两个NameNode汇报。
上述问题其实描述的都是接管的条件,最终我们还是需要一个接管的控制者,这就是zookeeper