NameNode同样也是做了这个事:修改内存中的元数据,然后把修改的信息Append(追加)到一个名为editlog的文件上 。
【什么是HDFS?】由于append是顺序IO,所以效率也不会低 。现在我们增删改查都是走内存,只不过增删改的时候往磁盘文件editlog里边追加一条 。这样我们即便重启了NameNode,还是可以通过editlog文件将元数据恢复 。
文章插图
现在也有个问题:如果NameNode一直长期运行的话,那editlog文件应该会越来越大(因为所有的修改元数据信息都需要在这追加一条) 。重启的时候需要依赖editlog文件来恢复数据,如果文件特别大,那启动的时候不就特别慢了吗?
的确是如此的,那HDFS是怎么做的呢?为了防止editlog过大,导致在重启的时候需要较长的时间恢复数据,所以NameNode会有一个内存快照,叫做fsimage
说到快照,有没有想起redis的RDB!!这样一来,重启的时候只需要加载内存快照fsimage+部分的editlog就可以了 。
想法很美好,现实还需要解决一些事:我什么时候生成一个内存快照fsimage?我怎么知道加载哪一部分的editlog?
问题看起来好像复杂,其实我们就只需要一个定时任务 。HDFS也是类似上面这样干的,只不过它不是在NameNode起个定时的任务跑,而是用了一个新的角色:SecondNameNode 。至于为什么?可能HDFS觉得合并所耗费的资源太大了,不同的工作交由不同的服务器来完成,也符合分布式的理念 。
如果让我自己做的话,我可能会想:我们加一份配置,设置个时间就OK了
如果editlog大到什么程度或者隔了多长时间,我们就把editlog文件的数据跟内存快照fsiamge给合并起来 。然后生成一个新的fsimage,把editlog给清空,覆盖旧的fsimage内存快照这样一来,NameNode每次重启的时候,拿到的都是最新的fsimage文件,editlog里边的都是没合并到fsimage的 。根据这两个文件就可以恢复最新的元数据信息了 。
文章插图
现在问题还是来了,此时的架构NameNode是单机的 。SecondNameNode的作用只是给NameNode合并editlog和fsimage文件,如果NameNode挂了,那client就请求不到了,而所有的请求都需要走NameNode,这导致整个HDFS集群都不可用了 。
于是我们需要保证NameNode是高可用的 。一般现在我们会通过Zookeeper来实现 。架构图如下:
文章插图
主NameNode和从NameNode需要保持元数据的信息一致(因为如果主NameNode挂了,那从NameNode需要顶上,这时从NameNode需要有主NameNode的信息) 。
所以,引入了Shared Edits来实现主从NameNode之间的同步,Shared Edits也叫做JournalNode 。实际上就是主NameNode如果有更新元数据的信息,它的editlog会写到JournalNode,然后从NameNode会在JournalNode读取到变化信息,然后同步 。从NameNode也实现了上面所说的SecondNameNode功能(合并editlog和fsimage)
文章插图
稍微总结一下:
- NameNode需要处理client请求,它是存储元数据的地方
- NameNode的元数据操作都在内存中,会把增删改以editlog持续化到硬盘中(因为是顺序io,所以不会太慢)
- 由于editlog可能存在过大的问题,导致重新启动NameNode过慢(因为要依赖editlog来恢复数据),引出了fsimage内存快照 。需要跑一个定时任务来合并fsimage和editlog,引出了SecondNameNode
- 又因为NameNode是单机的,可能存在单机故障的问题 。所以我们可以通过Zookeeper来维护主从NameNode,通过JournalNode(Share Edits)来实现主从NameNode元数据的一致性 。最终实现NameNode的高可用 。
如果某个DataNode掉线了,那HDFS是怎么知道的呢?
DataNode启动的时候会去NameNode上注册,他俩会维持心跳,如果超过时间阈值没有收到DataNode的心跳,那HDFS就认为这个DataNode挂了 。
还有一个问题就是:我们将Block存到DataNode上,那还是有可能这个DataNode的磁盘损坏了部分,而我们DataNode没有下线,但我们也不知道损坏了 。
推荐阅读
- 美国为什么不吞并墨西哥知乎 美国为什么不吞并墨西哥的全部领土?
- 爬虫原理与数据抓取
- 喝黑茶需要注意什么,小满节气喝什么茶养生
- 三国关羽败走麦城是现在哪里
- 梁山好汉征方腊为什么会损失大半
- 乐毅攻陷齐国七十城 乐毅为什么没有灭了齐国
- 芬兰在二战中扮演什么角色
- 为什么隋唐后期秦琼武力第一 秦琼武功排名第几
- 为什么古代一打仗就缺粮
- 刘秀是如何建立东汉的