如果大量客户端对 NameNode 发起高并发(比如每秒上千次)访问来修改元数据,此时 NameNode 该如何抗住?
一、问题分析
以大量add新文件到DataNode为例,NameNode需要将【add文件】record写入到编辑日志edits log文件(磁盘文件)中,并将edits log同步到JournalNode中。
- 【写磁盘】+【网络传输】都是非常耗时的操作,是制约系统性能的主要因素;
- 若采用【多线程 + 加锁 + 每次写磁盘和网络传输】,那么NameNode肯定承受不住1000次/s的高并发请求;
二、解决方案
2.1 解决思路
方案【多线程 + 加锁 + 每次写磁盘和网络传输】的问题在于,线程会出现阻塞,极大影响了效率。那么解决问题的方向就在于【如何让线程不阻塞】。
2.2 HDFS的方案:【加锁 + 内存双缓冲 + 批量写磁盘和网络传输】
2.2.1 加锁 + 内存双缓冲
- 多线程抢占锁🔒,抢到的将record先写入到内存buffer中,随后释放🔒;
- 写buffer和读buffer分离:内存缓冲区分为两部分,某一时刻,一部分用于写record到buffer中,另一部分用于将其中的records批量写入磁盘文件edits log或通过网络传输到JournalNode,互不阻塞;
- 一个读写周期后,两部分的buffer会交换位置;
- 将record写入内存buffer是非常快的,微秒级别吧;
2.2.2 批量写磁盘和网络传输
- 当buffer中的records累积到一定数量后,再将它们batch写入磁盘文件edits log或通过网络传输到JournalNode;
- 减少磁盘IO和网络传输频次,以提高效率;
网友评论