上次分享了写数据的过程,那么有个问题:NameNode是怎么处理高并发的客户端的请求的,NameNode响应为什么这么快?
带着问题思考:①,如果数据放到内存中,那么当断电的时候,数据就没有办法恢复了,这一种肯定不是hdfs保存数据,更不是NameNode保存元数据的策略
②,如果写入硬盘,那怎么可能响应快呢,这一种也pass
③,内存+硬盘【redis集群数据也是这样的,在分布式的文件系统中这种思想是相通的】
那么,画一个图来说明内存+硬盘的这种存储策略
1,向NameNode申请写资源
2,NameNode将数据暂时记录到edits log中
3,NameNode返回可用的DataNode
4,客户端向DataNode写入文件
5,客户端通知NameNode已经写完了
6,NameNode将之间记录到edits log中的数据同步到内存中
这里已经结束了,但是edits log如果满了怎么办呢?
接下下就是NameNode的同步数据的问题,要保证在断电的时候,数据可以完整的恢复?
当edits log文件满了【64M】或者是间隔3600秒,也就是1个小时,(这两个参数都是可以配置的),就会进行合并,就是将edits log中的数据,追加到fsimage文件之后,【这里其实是产生了新的文件,暂时可以理解为追加】,并把edits log中的数据清除。
这样即使断电可以一通过fsimage+edits log进行恢复,正常情况客户端读取的是内存中的数据,所以快,这就是高并发,响应支持的原因。
那么NameNode是怎么做到高可用的呢?这个问题留着明天分享,早早休息
望指正,不吝赐教!