hdfs 文件一致性实现
HDFS对于同一个文件支持一写多读(write-once-read-many)。为了保持数据一致性,当一个客户端往HDFS某个文件写数据时, 其他客户端不允许同时写入。HDFS引入Lease(租约)机制来实现“独写”控制。
1、Lease是client对某些文件是否具有可写权限的凭着,Lease是针对某个client的,一个Lease包含该client所有可写文件的信息。
2、Lease的管理及校验(文件可写权限校验)只发生在client与NameNode之间,与DataNode无关联
3、client续租Lease是对整个Lease进行续租,不是针对某个文件的可写权限进行续租。一次续租Lease,究竟续租了client对哪些文件的可写权限,完全是依赖于NameNode记录的这份Lease中包括了哪些文件。如果通过一定手段(recoverLease)强行剥夺了clientA对file1的lease权限,即使clientA在不断的续租lease,由于NameNode记录的clientA的lease中,已不包含file1信息,因此clientA也不再拥有对file1的写权限(租约)
4、recoverLease只保证能立即剥夺原持有者clientA对file1的写权限,但不能保证file1立马进入最终状态(closed),在某些情况下(最后一个Block有数据写入时),需要执行最后一个Block的恢复(Block Recovery),这个过程主要是完成最后一个Block的长度判定,并最终在NameNode上完成file的关闭。
5、一个文件可写,就处于UnderConstruction,对应的,这个文件是未关闭的(isClosed == false),对应的一定具有某个Lease包含这个文件。换句话说不存在某个文件可写,但是却没有任何一个Lease包括这个文件。