0-5 分布式文件系统

分布式文件系统 (GFS)

设计流程

文件位置

一个 chunk 备份到三个 chunk server 中

|---------------------------|
|          Master           |
|---------------------------|
| filename                  |
| chunk-01 -> CS1, CS3, CS4 |
| chunk-02 -> CS2, CS3, CS5 |
| chunk-03 -> CS1, CS2, CS3 | 
| filesize                  |
|---------------------------|
| ...                       |
|                           |
|                           |
|-------------------------------|
|      CS(Chunk Server)         |
|-------------------------------|
| filename chunk-xx -> offset1  | 
| filename chunk-xx -> offset2  | 
| ...                           |
|-------------------------------|
| offset1        64MB           |
| offset2        64MB           |
| ...                           |

写入

graph LR A(Client) --> | 1 write request | B B(Master) --> | 2 assign chunk servers | A A --> | 3 write | C(chunk server) A --> | 3 write | D(chunk server) A --> | 3 write | E(chunk server) C --> | 4 write finished | B D --> | 4 write finished | B E --> | 4 write finished | B

修改(非追加)

同写入

读取

graph LR A(Client) --> | 1 read request | B(Master) B --> | 2 chunk server's offset list | A A --> | 3 read | C(chunk server) A --> | 3 read | D(chunk server) A --> | 3 read | E(chunk server) C --> | 4 part of file | A D --> | 4 part of file | A E --> | 4 part of file | A

读完之后在 Client 将它们合并在一起.

扩展

Master

一般来说, 工业界 90% 是一个 Master.

双 Master

https://research.facebook.com/publications/apache-hadoop-goes-realtime-at-facebook/

多 Master

https://lamport.azurewebsites.net/pubs/paxos-simple.pdf

Chunk Server

判断磁盘是否损坏的方法, 在写入文件的时候就计算文章的 MD5 的值, 然后在读数据的时候重新计算文件的 MD5, 如果有变化, 则文件被修改了, 说明磁盘损坏.

MD5 的值直接写入到文件的最后就行, 写在一个 chunk (块) 的最后.

备份

一个文件有三个备份, 三个备份的地理位置选择: 同城2个放在一个机架上, 跨城1个.

如果一个 chunk 坏掉了, 那么就问一下 master 这个 chunk 的备份在哪里. 然后用同城的备份来恢复.

Master 使用心跳机制来确保 chunk server 可用.

写瓶颈的解决方案

Client 需要将每一个文件的每一个块都传输三次, 因为有三个备份. 这样就会导致 Client 出现写瓶颈. 解决方案是将一个文件传递给一个备份, 然后让这个备份复制到另外两个备份上.

怎么选择这个快备份的机器呢: 比较 Master 对于这个 chunk 给的三个 chunk server, 选择近的, 选择不忙的.

传输的时候 chunk server 挂了

告诉 Master, Master 会为这个文件块重新分配三个 Chunk Server.

面试

设计一个只读的 lookup service, 后台的数据是 10 billion 个 key-value pair, 服务形式是接收用户输入的 key, 返回对应的 value. 已知每个 key 的 size 是 0.1KB, 每个 value 的 size 是 1KB. 要求系统 QPS >= 5000, latency <= 200ms.

server 性能参数: 8X CPU cores, 32G memory, 6T disk. 任意数量的 server.

硬盘询道时间大概: 10ms. 磁盘读 1MB 的数据大概需要 30ms.

在硬盘中读取一次 value 的时间为: 10ms x 1KB/1MB x 30ms == 10ms, 在磁盘中读取一次 key 的时间为 10ms x 0.1KB/1MB x 30ms == 1ms. 在内存中读取的时间忽略不计. 10 billion 的 value 的大小: 10 billion x 1KB = 10TB, 10 billion 的 key 的大小: 10 billion x 0.1KB = 1TB.

这样我们假设每一台 server 都有全部的数据, 有两个 disk. 一个 server 有 32 G 的内存, 用来存放 key -- position, position 大概需要 8bit 就可以. 这样 40 台机器就有 1TB 内存, 就够了.

posted @ 2023-02-04 10:56  kohn  阅读(31)  评论(0)    收藏  举报