HDFS Editlog写机制(双缓冲+分段锁)
在HA下,客户端的每一条事务都会首先写入缓冲区,然后近可能马上写入磁盘Editlog和journalNode(保证可靠性)。
即HDFS应该尽可能保证客户端写的写操作返回成功时,磁盘和JournalNode中Editlog中有该记录。
如何保证上述要求:
- 客户端将记录写入磁盘或网络后才返回成功。
- 客户端将记录写入内存后返回,后台线程将内存记录写入磁盘和网络。
在高并发环境下
采用1:多线程对于共享资源(磁盘/网络)的互斥访问,和磁盘/网络本身速度较慢,导致客户端响应较慢。
采用2:可能内存中数据还没有写入磁盘和/网络,但是返回写成功,导致数据不一致。
HDFS采用分阶段锁+双缓冲提高了高并发下的性能。
大体原理:
- 因为将记录互斥写入内存,等待时间较短,并且在写磁盘和网络时,不需要持有锁,不影响其他线程的互斥写内存。
- 在某线程写磁盘和网络时,其他线程只要判断出其对应的事务已经在被写出了,则可以直接返回。
- 两次获取到的锁是同一把锁,都是加在对象(FSEditLog)上的锁。第一次竞争锁为了互斥写缓冲,第二次竞争锁为了交换缓冲。
- 通过上述的双缓冲和对线程2阶段加锁,大大提高了性能,并且可以保证返回成功时,该事务已在被写入磁盘和网络;类似于使用一个缓冲区来ack整个缓冲区中的事务,而不是对事务一个接一个ack。