The Google File System
架构
一些名词
- chunk:在GFS中,文件被分割成大小固定的块进行储存,chunk就是指这样的块,一般大小为64MB,每一个chunk都被一个独特的64位的chunk handle标识。
- replica:为了保证储存可靠性,每个chunk都会被复制一定的数量,分散储存。这些包含相同数据的块也称为replica。系统默认储存3个replica。
- master:不储存chunk,而是保存文件系统的元数据,单个。
- chunkserver:保存chunk,多个组成集群。
master中保存了namespace,访问控制信息,文件和chunk的对应表,每个chunk在系统中当前的位置。master还负责管理chunk租约,回收系统中孤立的chunk所占的空间,将chunk在chunkserver中进行迁移。master定期的与所有chunkserver通信,来获取他们的状态,给予他们指令。
客户端从GFS中读取文件过程
- 根据已知的chunk的大小和文件的大小,客户端计算出需要的chunk属于文件的第几个chunk。然后将文件名,chunk的序号发送给master
- master把对应的chunk handle和所有replicas的地址发回给客户端,客户端将缓存这些数据
- 客户端向众多保存了replica的chunkserver中的一个发起请求,请求参数包括了chunk handle和该chunk的一段字节范围。chunk返回相应的数据
并发模型
客户端向GFS写数据的过程
GFS采用租约的形式对chunk进行修改,持有租约的chunkserver被称作primary。具体过程如下:
1. 客户端询问master,哪一个chunkserver持有对目标chunk的租约,以及其他replica的地址。如果当前没有chunkserver持有租约,master会随机选择一个replica,并将租约赋给对应的chunkserver
2. master将primary的地址,以及其他包含replica的chunkserver的地址返回给客户端。客户端将缓存这些数据,直到primary的租约过期,或者其中的replica不可达
3. 客户端将数据推送个所有的replica,每个chunkserver将数据保存在LRU buffer cache中直到数据被使用或者过期。
4. 当所有relica确认收到数据以后,客户端向primary发送写请求。primary会对收到的修改操作(可能有多个客户端)进行编号,然后按照编号串行执行。
5. 执行完之后,primary按照顺序把这些修改操作转发给所有其他的replica,每一个secondary replica按照顺序执行修改操作
6. 所有的secondary replica回应primary,表示它们完成修改操作
7. primary回应客户端。中间任何一个replica修改遇到的错误都会返回给客户端