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           |
| ...                           |

写入

1 write request

2 assign chunk servers

3 write

3 write

3 write

4 write finished

4 write finished

4 write finished

Client

Master

chunk server

chunk server

chunk server

修改(非追加)

同写入

读取

1 read request

2 chunk server's offset list

3 read

3 read

3 read

4 part of file

4 part of file

4 part of file

Client

Master

chunk server

chunk server

chunk server

读完之后在 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 内存, 就够了.

作者:Kohn

出处:https://www.cnblogs.com/geraldkohn/p/17091088.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   kohn  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示