creat delete open close read write snapshot record append
snapshot :creates a copy of a file or directory tree at low cost [copy-on-write]record append:allowmutiple clients to append data to the same file concurrently [producer-consumer queues]
组成
chunk: 文件被分解成固定大小的chunks——由全局唯一的64bit chunk handle标识(在创建文件的时候由master分配)
chunkserver:
master:
client:
tips: client和chunkserver都不会缓存文件数据
reason:
读取流程:
操作日志:
写 记录追加
串行成功 已定义 已定义
并行成功 一致但未定义 部分不一致
失败 不一致 不一致
已定义:对文件修改之后,各副本是一致的,并且客户端能够看到写入操作的全部内容(隐含了一致性)
一致:无论从哪个副本读取,读到的数据都是一样的
一致未定义:所有客户端看到同样的数据,但是无法读到任何一次写入操作写入的数据
不一致:不同客户端在不同的时间看到不同的数据(也是未定义的)
数据修改操作包括:
写入:把数据写在应用程序指定的文件偏移位置上。
追加:并行执行时,记录追加操作至少可以把数据原子性的追加到文件中一次,偏移位置由GFS返回
GFS追加流程的特色: 链式复制 + 分离数据流与控制流(如下图所示)
链式复制:减少延迟
分离数据流与控制流:前提是每次追加的数据都比较大
重要原则:最小化所有操作和Master节点的交互
客户端、Master服务器、chunk服务器之间的交互,以实现数据修改操作、原子的记录追加操作、快照功能
1. 租约机制
GFS的追加操作每次为几十KB到几MB不等,每次追加都请求Master的话会使Master成为系统性能瓶颈,GFS通过lease机制将chunk的写操作授权给chunk,在租约有效期内,对该chunk的写操作都由主chunk负责,减轻master的负载,主chunk对chunk的所有更改操作进行序列化,所有副本都遵从这个序列进行修改操作。
总的来说,对于修改操作,首先由master节点选择的租约的顺序决定,然后由租约中主chunk分配的序列号决定!
上面的追加流程为:
如果应用程序一次写入的数据量很大,或者跨越了多个chunk,client会把它们分成多个写操作。这就可能会被其他client同时进行的操作打断或者覆盖。因此共享文件可能包含来自不同client的数据。但是这些分解后的写入操作是以相同的顺序在chunk上执行的,chunk所有副本都是一致的,这就使得文件处于一致的、但是未定义的状态。
2. snapshot
snapshot操作是对源文件/目录进行snapshot,生成该时刻源文件/目录的一个瞬间状态存放在目标文件/目录中。GFS使用copy on write技术(只增加GFS中chunk的引用技术,表示这个chunk被快照文件引用了,等到客户端修改这个chunk时,才需要在chunkserver中拷贝chunk的数据生成新的chunk,后续的修改操作落到新生成的chunk上)
对某个文件做快照:
1. namespace management and locking
逻辑上,GFS的namespace是一个全路径和元数据映射关系的查找表。利用前缀压缩这个表可以高效的存储在内存中。
每个绝对路径的文件名或绝对路径的目录名都有一个关联的读写锁。
2. 副本位置的选择
策略目标:最大化数据可靠性和可用性,最大化网络带宽利用率
3. 创建、重新复制、负载均衡
creation:把chunk副本分布在多个机架之间(考虑硬盘的使用率,限制每台chunk上“最近”的创建操作次数)
re-replication:chunk的有效副本数量少于用户指定复制因数的时候,master节点重新复制它
rebalance:周期性地对副本进行重新负载均衡
4. GC
GC采用延迟删除机制。删除文件后,GFS不要求立即归还物理内存,在元数据中将文件改名为一个隐藏的名字,并且包含一个删除时间戳。
GC一般在服务低峰期执行
master定期检查,发现删除文件超过一段时间:
1. Master容错
2. chunk server容错
网易云大礼包:https://www.163yun.com/gift
本文来自网易实践者社区,经作者李小翠授权发布。