java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2399|回复: 0

《大规模分布式存储系统》 第4章 分布式文件系统【4.3】

[复制链接]
  • TA的每日心情
    开心
    2021-5-25 00:00
  • 签到天数: 1917 天

    [LV.Master]出神入化

    2096

    主题

    3754

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66788

    宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2017-3-3 20:25:48 | 显示全部楼层 |阅读模式
    4.3 Facebook Haystack0 H4 s! Z2 C8 _
    Facebook目前存储了2600亿张照片,总大小为20PB,通过计算可以得出每张照
    9 e/ S8 d9 D; M9 u3 `* |片的平均大小为20PB/260GB,约为80KB。用户每周新增照片数为10亿(总大小为. {. s0 d/ I6 J; K
    60TB),平均每秒新增的照片数为10 9 /7/40000(按每天40000s计),约为每秒3500
    1 p* }% }% f- u  Q# ~4 l. P2 T4 D( D次写操作,读操作峰值可以达到每秒百万次。
    & f! I9 h  |5 C0 g2 R* oFacebook相册后端早期采用基于NAS的存储,通过NFS挂载NAS中的照片文件来' k& g$ z& E, j" X* n, S& n' O# U
    提供服务。后来出于性能和成本考虑,自主研发了Facebook Haystack存储相册数据。
    8 I( \; t" C/ j4.3.1 系统架构
    4 g1 S5 ~+ f" P  C; uFacebook Haystack的思路与TFS类似,也是多个逻辑文件共享一个物理文件。9 ~/ ^2 P) k) a5 @& O
    Haystack架构及读请求处理流程如图4-6所示。
    . ^. N8 }& P3 N% c# k" O$ z/ W: I: w图 4-6 Haystack架构图
    % a! S2 |( |. MHaystack系统主要包括三个部分:目录(Directory)、存储(Store)以及缓存; _0 R6 ~$ t8 U2 ]5 `  o
    (Cache)。Haystack存储是物理存储节点,以物理卷轴(physical volume)的形式组' w9 L" J+ K9 m4 ]
    织存储空间,每个物理卷轴一般都很大,比如100GB,这样10TB的数据也只需100个
    2 U  c. m1 d' ]: G物理卷轴。每个物理卷轴对应一个物理文件,因此,每个存储节点上的物理文件元
    1 C# e7 w- ?5 T3 M数据都很小。多个物理存储节点上的物理卷轴组成一个逻辑卷轴(logical# `: X# C4 D$ t% f
    volume),用于备份。Haystack目录存放逻辑卷轴和物理卷轴的对应关系,以及照片
    ; ]! z/ z& s) y. b7 wid到逻辑卷轴之间的映射关系。Haystack缓存主要用于解决对CDN提供商过于依赖的5 G9 Y6 M1 ]5 G2 o; E2 Q4 ~! K
    问题,提供最近增加的照片的缓存服务。/ b4 s3 a" v8 Q; P& c0 u* Y/ Q
    Haystack照片读取请求大致流程为:用户访问一个页面时,Web服务器请求+ G3 k5 R9 Z  j
    Haystack目录构造一个URL:http://<CDN>/<Cache>/<Machine id>/<Logical
    " q/ B  V& d* O7 z5 e% Tvolume,Photo>,后续根据各个部分的信息依次访问CDN、Haystack缓存和后端的: {+ x9 Y9 ~: {' u8 i3 ~5 [
    Haystack存储节点。Haystack目录构造URL时可以省略<CDN>部分从而使得用户直
    8 x7 N5 j( `/ I2 _  h: f. H接请求Haystack缓存而不必经过CDN。Haystack缓存收到的请求包含两个部分:用户
      M! h+ Z/ w8 |( M- B* ^1 r( d浏览器的请求及CDN的请求,Haystack缓存只缓存用户浏览器发送的请求且要求请求5 ?. d9 S& Z$ o& y2 O& d
    的Haystack存储节点是可写的。一般来说,Haystack后端的存储节点写一段时间以后  Y5 o2 z# K+ N0 \$ ]- p% ~* D& I
    达到容量上限变为只读,因此,可写节点的照片为最近增加的照片,是热点数据。% D; p9 o0 a% p9 P' ]1 r
    本节暂不讨论CDN,只讨论Haystack后端存储系统,包括Haystack目录和Haystack缓
    ! n0 y" K! E  N$ {2 H$ _存两个部分。
      x) V# Z" z/ P2 Z( j3 b1.写流程
    ' o  `4 v. s/ N+ E如图4-7所示,Haystack的写请求(照片上传)处理流程为:Web服务器首先请求6 A+ |' X% J% a6 K) y
    Haystack目录获取可写的逻辑卷轴,接着生成照片唯一id并将数据写入每一个对应的4 Z& L- j4 I% Z2 f) M) `) [. D
    物理卷轴(备份数一般为3)。写操作成功要求所有的物理卷轴都成功,如果中间出5 A9 r  T' I: c* p: c
    现故障,需要重试。/ @0 f! S6 h1 x( x$ g
    图 4-7 Haystack写流程- m* N  @0 ], p! b# M8 t- k
    Haystack的一致性模型保证只要写操作成功,逻辑卷轴对应的所有物理卷轴都存
    , H) O) `# p/ F1 i8 H) Q在一个有效的照片文件,但有效照片文件在不同物理卷轴中的偏移(offset)可能不. g0 j) h% Y* e% m
    同。
    ; h1 D& E6 a* j4 M$ Y+ u! l4 KHaystack存储节点只支持追加操作,如果需要更新一张照片,可以新增一张编号9 O- z+ e7 q' K- K  y) _1 B" C
    相同的照片到系统中,如果新增照片和原有的照片在不同的逻辑卷轴,Haystack目录
    9 l5 U0 x2 q7 _8 ~* G' N的元数据会更新为最新的逻辑卷轴;如果新增照片和原有的照片在相同的逻辑卷3 O! V6 F# i- y' V( ^. x+ {1 r' {3 A
    轴,Haystack存储会以偏移更大的照片文件为准。) V; w0 n+ S; J) S
    2.容错处理2 K! f3 ?2 _0 P
    (1)Haystack存储节点容错* h# d% |2 o8 D* y% @4 n) K3 z
    检测到存储节点故障时,所有物理卷轴对应的逻辑卷轴都被标记为只读。存储
    / A4 h4 M$ x& s' I节点上的未完成的写操作全部失败,写操作将重试;如果发生故障的存储节点不可
    7 J5 U) U: Z8 {: ?9 {恢复,需要执行一个拷贝任务,从其他副本所在的存储节点拷贝丢失的物理卷轴的: w: A2 w( [. U* }" X  u5 c: T
    数据;由于物理卷轴一般很大,比如100GB,所以拷贝的过程会很长,一般为小时; X- W, V; |" y& |' Z
    级别。
    ( Y+ n% y0 F/ K+ x2 G(2)Haystack目录容错
    ! j: ^0 T' n: p  i. HHaystack目录采用主备数据库(Replicated Database)做持久化存储,由主备数据
    6 x7 ?( g  h0 m' I1 ^. Z# R0 [+ s库提供容错机制。
    7 i' J$ y. {( P/ l/ j9 M) F! H3.Haystack目录, m# {* d! |% Q/ s
    Haystack目录的功能如下:
    - q. e4 k8 h1 R1 I$ N$ s" q1)提供逻辑卷轴到物理卷轴的映射,维护照片id到逻辑卷轴的映射;
    9 ^; d3 W5 B" s5 l' j2)提供负载均衡,为写操作选择逻辑卷轴,读操作选择物理卷轴;
    3 X# r. H& D6 Y" e, C% \  w3)屏蔽CDN服务,可以选择某些图片请求直接走Haystack缓存;
    ! l$ H: ^6 E/ P4)标记某些逻辑卷轴为只读。
    ; E: i7 B6 L( F+ j! Z$ W根据前面的计算结果可知,Facebook相册系统每秒的写操作大约为3500次,每/ ?7 D' d' h9 @: T
    秒的读请求大约为100万次。每个写请求都需要通过Haystack缓存获取可写的卷轴,+ `2 U& y- H% S2 f1 }4 h8 a' Y
    每个读请求需要通过Haystack缓存构造读取URL。这里需要注意,照片id到逻辑卷轴
    , R6 w6 p( i/ I" O- Y的映射的数据量太大,单机内存无法存放,笔者猜测内部使用了MySQL Sharding集
    0 @0 @! c' A2 h. W$ p5 w" @群,另外,还增加了一个Memcache集群满足查询需求。$ n" B7 i9 e0 d4 S( f
    4.Haystack存储
    . a! ?- m( w0 }$ fHaystack存储保存物理卷轴,每个物理卷轴对应文件系统中的一个物理文件,每
    * M2 Y* ^' t: S' G# b* |个物理文件的格式如图4-8所示。
    & K' m8 q, H9 w图 4-8 Haystack数据块格式4 L* `, U* k9 m
    多个照片文件存放在一个物理卷轴中,每个照片文件是一个Needle,包含实际- a! a: ^# m9 ?: n, t4 w
    数据及逻辑照片文件的元数据。部分元数据需要装载到内存中用于照片查找,包括
    + E) v5 S8 [5 A& bKey(照片id,8字节),Alternate Key(照片规格,包括Thumbnail、Small、Medium
    & N0 l" j" n7 g1 `1 l及Large,4字节),照片在物理卷轴的偏移Offset(4字节),照片的大小Size(4字
    : D! F* t5 V% C, U0 y5 i; h* @" M节),每张照片占用8+8+4=20字节的空间,假设每台机器的可用磁盘为8TB,照片  P& P! m6 N. c. ~/ C
    平均大小为80KB,单机存储的照片数为8TB/80KB=100MB,占用内存. S: f- N/ @8 I( Q) I
    100MB×20=2GB。) F+ f9 w. `: G$ L
    存储节点宕机时,需要恢复内存中的逻辑照片查找表,扫描整个物理卷轴耗时
    4 k- ?" @) N9 q3 n* N0 ^3 ?; j太长,因此,对每个物理卷轴维护了一个索引文件(Index File),保存每个Needle9 g% e9 P& {5 I2 d' X
    查找相关的元数据。写操作首先更新物理卷轴文件,然后异步更新索引文件。由于: k1 N- t" ~7 s! K) x4 ]" i
    更新索引文件是异步的,所以可能出现索引文件和物理卷轴文件不一致的情况,不( t: t* r9 o  ]+ N
    过由于对物理卷轴文件和索引文件的操作都是追加操作,只需要扫描物理卷轴文件) V' g9 n$ |8 P
    最后写入的几个Needle,然后补全索引文件即可。这种技术在仅支持追加的文件系5 U9 r& D1 u. x! X+ |
    统很常见。
    3 h: c/ G! M  pHaystack Store存储节点采用延迟删除的回收策略,删除照片只是向卷轴中追加+ ~; j% Y4 A# D+ z  I! n
    一个带有删除标记的Needle,定时执行Compaction任务回收已删除空间。所谓
    " [5 j1 F& l4 P" z3 w/ V; |Compaction操作,即将所有老数据文件中的数据扫描一遍,以保留最新一个照片的原+ k( p+ V% `1 s7 o7 J1 k+ `0 l
    则进行删除,并生成新的数据文件。
    " {1 y. g! m+ M1 j4.3.2 讨论
    ( v9 e2 Y: f" _: |相比TFS,Haystack的一大特色就是磁盘空间回收。Blob文件在TFS中通过<Block% B; S% n% ^+ y, S7 A  a) C
    id,Block offset>标识,因此,不能对TFS中的数据块进行重整操作;而Haystack中的
    8 U  {2 I& [6 Q+ i元信息只能定位到Blob文件所在的逻辑卷轴,Haystack存储节点可以根据情况对物理( J  x5 g" \  c. G' D5 F
    卷轴进行Compaction操作以回收磁盘空间。4 E- m) t- u2 Q+ \. P
    Facebook Haystack中每个逻辑卷轴的大小为100GB,这样减少了元信息,但是增
    % Q+ N# T* l& B6 E4 q! t/ Y加了迁移的时间。假设限制内部网络带宽为20MB/s,那么迁移100GB的数据需要的5 M( l1 ?% ]) z: ^: ]( @) f
    时间为100GB/20MB/s=5000s,大约是一个半小时。而TFS设计的数据规模相比+ E5 Q7 a8 U1 J/ B- ^3 W9 B0 e
    Haystack要小,因此,可以选择64MB的块大小,有利于负载均衡。& ~* s& L7 H* W1 e) g' `6 E& Q
    另外,Haystack使用RAID 6,并且底层文件系统使用性能更好的XFS,淘宝TFS% R. Z6 R& P& Y
    不使用RAID机制,文件系统使用Ext3,由应用程序负责管理多个磁盘。Haystack使用
    3 W4 I; z: V; C* E1 L  A" O了Akamai&Limelight的CDN服务,而淘宝已经使用自建的CDN,当然,Facebook也在# F: N# B" v- ^- o
    考虑自建CDN。/ e9 o  f, s1 j" ~' ?; ]. ?

    , a1 R& @9 f8 H! L6 j) s( f5 _( t' t1 B7 ?: [7 I
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Java自学网

    GMT+8, 2025-4-1 14:18 , Processed in 0.285477 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

    快速回复 返回顶部 返回列表