【笔记】读 JeffDean 分布式系统

今天听了一门课, 讲的 Jeff Dean 在09年的一份PPT: Designs, Lessons and Advice from Building Large Distributed System.

五年前的内容, 现在看仍然收获很大(除了后一半吹水的部分), 做一些笔记.

Computing shifting to really small and really big devices.

计算迁移的方向: big device 即服务器端, small device 即便携设备.

The Machinery

服务器(server)->机柜(racks)->集群(clusters), 共用swicth的racks称之为一个cluster, 一个IDC机房可能有多个cluster.

Architectual view of the storage hierarchy

  • 单server: DRAM 16GB 100ns 20GB/s, Disk 2TB 10ms 200MB/s
  • 单rack: DRAM 1TB 300us 100MB/s, Disk 160TB 11ms 100MB/s
  • 单cluster: DRAM 30TB 500us 10MB/s, Disk 4.8PB 12ms 10MB/s

server->rack->cluster, 容量增大, 通信的开销增加.

Reliability & Availability

举例: MTBF(mean time before failure) 30年的机器, 构建10k的集群, 每天都会有机器fail.

经验: 一个新的cluster头一年内, 平均会碰到0.5次过热关机, 1次电源故障, 1次机架迁移, 20次机架故障, 12次路由重启, 1000次机器故障, blabla, 总之thousands of failures.

downtime behavior matters: 大概55%的failure会在6分钟之内恢复, 80%会在12分钟内恢复.

fault statics matters: 是雪崩类型的故障恢复的统计.

本篇的核心思想之一: 必须做容错设计!

Google Cluster Environment

1000+机器组成的集群.

GFS & sheduler是core service, 扮演了infrastructure的角色.

上层是各种调度任务job task.

chubby提供lock service.

Most systems are Distributed Systems.

必须条件: 隔离问题的设计(容错), 异地的数据中心, 大量的内部service.

break large complex systems down into many services, with few dependencies.

Designing Efficient Systems

本篇的核心思想之二: 面向物理的量化设计.

必须知道的参数:

  • 0.5ns: L1 cache reference
  • 5ns: branch mispredict, 是指cache未命中
  • 7ns: L2 cache reference
  • 25ns: mutex lock & unlock
  • 100ns: main memory reference
  • 3000ns: compress 1Kb with Zippy(这个东东是google在传输时做压缩大量使用的)
  • 0.02ms: send 2Kb over 1Gbps network
  • 0.25ms: read 1MB sequentially from memory
  • 0.5ms: round trip within same datacenter
  • 10ms: disk seek
  • 20ms: read 1MB sequentially from disk
  • 150ms: send packet 加州->冰岛->加州

这里补充一下关于SSD的相关数据(在这篇ppt出来之时ssd还没有广泛应用).

  • read a page(4k) 0.025ms
  • write a page(4k) 0.2ms
  • erase a block(64 or 128 pages) 1.5ms, 生命周期内最多擦出5k到20k次.

Back of the Envelope Calculations

"信封背面"是个口语, 指纯经验的毛估性能.

一个好的架构师, 应该在东西做出来之前, 对系统的性能有一个靠谱的估算, 这是一项很重要的能力.

  • write microbenchmarks, 这样能更好的理解性能.
  • know your basic building blocks, not just their interfaces, but understand their implementations.
  • encoding your data: CPU最快, 内存和带宽有限, 压缩编码对大部分系统很重要, etc.
  • designing & building infrastructure, infrastructure是指相对底层的基础组件, 例如GFS, 设计时保持KISS.
  • design for growth: 预估增长, 设计时做预留.
  • interactive apps: design for low latency. 涉及到交互的app需要尽量低延迟.
  • making applications robust against failures: 容错设计的鲁棒性.
  • add sufficent monitoring/status/debugging hooks: 监控,debug的工具要保证.

Google Infrastructure

GFS, 设计理念源自abstract leaky: 直接利用了磁盘的顺序读和顺序写特性, 面向裸设备, 抛弃中间层.

  • master保有meta信息.
  • 文件按chunk存储(64M).
  • 每个chunk存储三份, 分布于不同节点.
  • 磁盘碎片过多时做一次整理, 直接顺序拷贝至新节点.

Google Protobuf, protocol description language is a must. protobuf在语言设计, 效率, 版本兼容上做的都不错.

Google MapReduce, 输入数据->map分解问题->打乱排序->reduce合并借->输出结果.

Google BitTable, 大量的半结构化的数据(稀疏矩阵), blabla ...

重要参考文献

  1. Ghemawat, Gobioff, & Leung. Google File System, SOSP 2003.
  2. Barroso, Dean, & Hölzle . Web Search for a Planet: The Google Cluster Architecture, IEEE Micro, 2003.
  3. Dean & Ghemawat. MapReduce: Simplified Data Processing on Large Clusters, OSDI 2004.
  4. Chang, Dean, Ghemawat, Hsieh, Wallach, Burrows, Chandra, Fikes, & Gruber. Bigtable: A Distributed Storage System for Structured Data, OSDI 2006.
  5. Burrows. The Chubby Lock Service for Loosely-Coupled Distributed Systems. OSDI 2006.