GFS杂项
为什么分布式存储很难实现?
Performance -> Sharding
Fault -> Tolerance
Tolerance -> Replication
Replication -> Consistency
Consistency -> Low Performance
GFS 简介
aim | feature |
---|---|
BIG & FAST | single data center |
Global | 内部使用 |
sharding | Big Sequential access |
automatic recovery |
Master: 管理文件元信息, 管理 Chunk server
Client: 读写请求
Chunk server: 存储 chunk
- 每个大文件拆分多个为 64MB 大小的块,可以保存在不同的 chunk 节点中
- 每个块在三台 chunk 节点上进行备份 [跨机房, 跨机架]
master 节点的元数据
- 用来管理 chunk 信息的表
- 用来记录每个 chunk 节点和其上的数据块之间的映射
|list of chunk servers |[ v 易失]|
version [ nv 非易失]
primary [ v ]
lease [ v ] - log 文件,用来记录数据的变更,并会生成 checkpoint 用来恢复 master 节点(使用log记录会更加快速,而不是使用 b-tree 会存在寻找插入位置的过程导致较慢,有趣的角度)
客户端读取一个文件的步骤
- client 发送文件名称和偏移量给主服务器 master
- master 根据偏移量找到第一个需要的数据块的句柄;
master 把保存了该数据块的 chunk 服务器列表发送给 client - client 缓存 chunk 服务器列表,用以多次重复访问
client 从最近的 chunk 服务器请求数据块 - [数据信息] chunk 服务器从磁盘读取文件并返回给 client
如何保证 GFS 的强一致性:GFS 并没有实现,成本过于高昂
- primary 节点需要过滤重复的写入请求,防止数据出现多次
- 从节点必须正确执行 primary 节点给与的任务
- 使用两阶段提交保证任务被每个节点成功执行了
GFS 存在的缺陷
只有一个 master 节点,并且不支持自动回复,出错需要人工干预 [ Raft 可以]
由于他可能会执行重复的追加操作,有些客户端不能很好地处理这种情况
单个 master 节点需要处理大量的请求,这是很困难的
GFS的写入流程
- client 向 master 请求持有 lease 的 chunk(primary replica)位置和其他 replicas 的位置(如果没有 chunk 持有 lease,那么 master 会授予其中一个 replica 一个 lease)
- master 返回 primary 的信息和其他 replicas 的位置,然后 client 将这些信息缓存起来(只有当 primary 无法通信或者该 primary replica 没有 lease 了,client 才会向 master 再次请求)
- client 会将数据发送到所有的 replicas,每个 chunkserver 会把数据存在 LRU 缓存中
- 在所有的 replicas 都收到了数据之后,client 会向 primary 发送写请求。primary 会给它所收到的所有 mutation 分配序列号(这些 mutation 有可能不是来自于同一个 client),它会在自己的机器上按序列号进行操作
- primary 给 secondaries 发送写请求,secondaries 会按相同的序列执行操作
- secondaries 告知 primary 操作执行完毕
- primary 向 client 应答,期间的错误也会发送给 client,client 错误处理程序(error handler)会重试失败的 mutation
课程(mit 6.824 gfs) Summary
case study of performance, fault-tolerance, consistency
specialized for MapReduce applications
good ideas:
global cluster file system as universal infrastructure 通用基础设施:全局集群文件系统
separation of naming (master) from storage (chunkserver) 命名和存储分离
sharding for parallel throughput 分片以实现并行吞吐量
huge files/chunks to reduce overheads 大 文件/块 以减少额外开销
primary to sequence writes 主机 顺序写
leases to prevent split-brain chunkserver primaries 租约
not so great:
single master performance
ran out of RAM and CPU
chunkservers not very efficient for small files
lack of automatic fail-over to master replica
maybe consistency was too relaxed