java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2351|回复: 0

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

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

    [LV.Master]出神入化

    2040

    主题

    3698

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66476

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

    发表于 2017-3-3 20:25:48 | 显示全部楼层 |阅读模式
    4.3 Facebook Haystack, A: F6 g5 y- s4 N" G. `0 V
    Facebook目前存储了2600亿张照片,总大小为20PB,通过计算可以得出每张照0 }  u0 _5 k0 n" }0 \/ c0 ^
    片的平均大小为20PB/260GB,约为80KB。用户每周新增照片数为10亿(总大小为
    & x( J6 F5 z" c3 n; j! z60TB),平均每秒新增的照片数为10 9 /7/40000(按每天40000s计),约为每秒3500
    3 @, ~. X) b* u" O) M6 x8 [次写操作,读操作峰值可以达到每秒百万次。
    ( a+ v2 a! Y. J+ Q; i& LFacebook相册后端早期采用基于NAS的存储,通过NFS挂载NAS中的照片文件来5 B( C# I% b  T+ \+ A2 H: f1 j* t
    提供服务。后来出于性能和成本考虑,自主研发了Facebook Haystack存储相册数据。8 R' @5 N: o" B2 V& t
    4.3.1 系统架构
    - A# I4 a# u8 A7 c+ `Facebook Haystack的思路与TFS类似,也是多个逻辑文件共享一个物理文件。% e* G! Y) K: \2 s5 l
    Haystack架构及读请求处理流程如图4-6所示。! m$ d  z9 R# M8 e$ H- [
    图 4-6 Haystack架构图9 @, X& G0 {8 e$ T
    Haystack系统主要包括三个部分:目录(Directory)、存储(Store)以及缓存5 R8 q' t% W: X% D3 O' o- y' Z# {5 a
    (Cache)。Haystack存储是物理存储节点,以物理卷轴(physical volume)的形式组
    : q: I# J3 ?0 {6 e织存储空间,每个物理卷轴一般都很大,比如100GB,这样10TB的数据也只需100个: Y) v% ^9 I% `$ J9 l- S
    物理卷轴。每个物理卷轴对应一个物理文件,因此,每个存储节点上的物理文件元
    6 C) ?5 u) o; r. Q- O% A, B数据都很小。多个物理存储节点上的物理卷轴组成一个逻辑卷轴(logical) K; a+ Q# k$ Z9 T' }
    volume),用于备份。Haystack目录存放逻辑卷轴和物理卷轴的对应关系,以及照片
      o  F* {2 J! d! B) ]0 Gid到逻辑卷轴之间的映射关系。Haystack缓存主要用于解决对CDN提供商过于依赖的
    % V& ~) g. g7 T3 r$ f问题,提供最近增加的照片的缓存服务。
    * F. @2 g4 W0 z; [# y$ M: THaystack照片读取请求大致流程为:用户访问一个页面时,Web服务器请求8 Z! v. `* m8 g4 I  F' P
    Haystack目录构造一个URL:http://<CDN>/<Cache>/<Machine id>/<Logical
    : v( d9 m: t) `8 i( n. i7 Tvolume,Photo>,后续根据各个部分的信息依次访问CDN、Haystack缓存和后端的9 Q. |( M2 h, [# G/ i3 z0 l+ S
    Haystack存储节点。Haystack目录构造URL时可以省略<CDN>部分从而使得用户直
    # I! t3 S' I1 {4 D1 `  n接请求Haystack缓存而不必经过CDN。Haystack缓存收到的请求包含两个部分:用户
    5 O6 R9 Q( H2 K浏览器的请求及CDN的请求,Haystack缓存只缓存用户浏览器发送的请求且要求请求, ~; N) ], w' E4 U, A  `: k( [5 y
    的Haystack存储节点是可写的。一般来说,Haystack后端的存储节点写一段时间以后
    . ]9 H, m7 m5 k7 X' b. `6 x4 w达到容量上限变为只读,因此,可写节点的照片为最近增加的照片,是热点数据。
    + T2 Y# |+ T& C4 x2 G% r/ k本节暂不讨论CDN,只讨论Haystack后端存储系统,包括Haystack目录和Haystack缓3 O3 Z; [( e1 I& ], `+ ^
    存两个部分。$ q; @$ Z6 A5 v0 b+ R' n
    1.写流程: \! o7 m; P/ u
    如图4-7所示,Haystack的写请求(照片上传)处理流程为:Web服务器首先请求8 \( v+ C' ?/ r
    Haystack目录获取可写的逻辑卷轴,接着生成照片唯一id并将数据写入每一个对应的) ?- A% f$ k2 x. T! c# X
    物理卷轴(备份数一般为3)。写操作成功要求所有的物理卷轴都成功,如果中间出2 [# c% W3 l. K/ I, S
    现故障,需要重试。
    9 `9 {4 p! T+ W. I图 4-7 Haystack写流程; {4 b) ?& j) m" [. B
    Haystack的一致性模型保证只要写操作成功,逻辑卷轴对应的所有物理卷轴都存
    ' @2 u7 W$ p% Q$ |在一个有效的照片文件,但有效照片文件在不同物理卷轴中的偏移(offset)可能不
    8 Q' ^9 z3 B/ U, @4 x1 H同。
      [* a6 h5 o; I6 W* N0 p% sHaystack存储节点只支持追加操作,如果需要更新一张照片,可以新增一张编号7 m$ `- M$ t% g; Y% a
    相同的照片到系统中,如果新增照片和原有的照片在不同的逻辑卷轴,Haystack目录5 u2 c- V5 u  S
    的元数据会更新为最新的逻辑卷轴;如果新增照片和原有的照片在相同的逻辑卷
    * w* p! B9 d' I* [轴,Haystack存储会以偏移更大的照片文件为准。
    5 h) B! C# ]5 B! c2.容错处理
    / _# I* L  h8 H1 D(1)Haystack存储节点容错* d# s/ ^5 l4 Z; R2 E/ o
    检测到存储节点故障时,所有物理卷轴对应的逻辑卷轴都被标记为只读。存储) W. Q# G2 T. W& X8 Z  G
    节点上的未完成的写操作全部失败,写操作将重试;如果发生故障的存储节点不可& k' p0 R; p3 R- l2 g9 @- s3 H, L
    恢复,需要执行一个拷贝任务,从其他副本所在的存储节点拷贝丢失的物理卷轴的
      O& R; g$ i* m- K数据;由于物理卷轴一般很大,比如100GB,所以拷贝的过程会很长,一般为小时( }; V- ^( S  J  V! i
    级别。
    9 @+ }1 ?9 h# V7 y(2)Haystack目录容错
    ( Q3 f4 ^3 y& {" |  _Haystack目录采用主备数据库(Replicated Database)做持久化存储,由主备数据" Y' n3 Y" M" {  e
    库提供容错机制。( P& G5 F0 F6 I! s
    3.Haystack目录
    , o2 {9 T" V" D& X( lHaystack目录的功能如下:; ^& Y/ s4 X3 [! m) c/ P4 q! T
    1)提供逻辑卷轴到物理卷轴的映射,维护照片id到逻辑卷轴的映射;8 G, e2 y$ Y& p5 H1 \7 D$ |9 e! q
    2)提供负载均衡,为写操作选择逻辑卷轴,读操作选择物理卷轴;, M- J) z8 e7 s$ b) X  p* A9 W4 {
    3)屏蔽CDN服务,可以选择某些图片请求直接走Haystack缓存;- d+ \( q* \0 N2 ~+ `" s. [
    4)标记某些逻辑卷轴为只读。
    ; ^, |$ y( H9 _$ n$ g. G根据前面的计算结果可知,Facebook相册系统每秒的写操作大约为3500次,每
    5 a. N: j# t( ~& u; w( p秒的读请求大约为100万次。每个写请求都需要通过Haystack缓存获取可写的卷轴,
    " J; A* E/ @8 M7 ~, h每个读请求需要通过Haystack缓存构造读取URL。这里需要注意,照片id到逻辑卷轴
    8 U% q2 [/ j( p  |5 Y( }  z的映射的数据量太大,单机内存无法存放,笔者猜测内部使用了MySQL Sharding集; P3 A/ `+ Q  O7 t4 U/ E
    群,另外,还增加了一个Memcache集群满足查询需求。
      T  U. d5 i* w5 Y$ [9 F) m4.Haystack存储% u6 ]  s+ N5 f/ S" k* v7 n" A
    Haystack存储保存物理卷轴,每个物理卷轴对应文件系统中的一个物理文件,每
      F. p$ r5 W4 a9 X+ `个物理文件的格式如图4-8所示。4 ~! ]; h$ \7 L/ i/ P
    图 4-8 Haystack数据块格式
    6 G3 V. h+ e' T多个照片文件存放在一个物理卷轴中,每个照片文件是一个Needle,包含实际
    ( a- F; ?5 S0 s( |/ u3 R: U. ?数据及逻辑照片文件的元数据。部分元数据需要装载到内存中用于照片查找,包括$ A: K) _: u& O! q' c3 h  a
    Key(照片id,8字节),Alternate Key(照片规格,包括Thumbnail、Small、Medium
    4 m5 o/ i  O4 G6 M( {  p及Large,4字节),照片在物理卷轴的偏移Offset(4字节),照片的大小Size(4字
    2 f3 `8 a6 w  _0 k3 F节),每张照片占用8+8+4=20字节的空间,假设每台机器的可用磁盘为8TB,照片
    & Q: P. J+ D  }7 M7 _平均大小为80KB,单机存储的照片数为8TB/80KB=100MB,占用内存
    8 z; E/ a& v( o8 W100MB×20=2GB。
    ( K8 n* q2 @* n1 x存储节点宕机时,需要恢复内存中的逻辑照片查找表,扫描整个物理卷轴耗时9 o6 T4 ?- m' o( n+ w
    太长,因此,对每个物理卷轴维护了一个索引文件(Index File),保存每个Needle
    6 H' U+ z. W, S) E查找相关的元数据。写操作首先更新物理卷轴文件,然后异步更新索引文件。由于( r& Z+ g  a9 E) J) U
    更新索引文件是异步的,所以可能出现索引文件和物理卷轴文件不一致的情况,不
    $ c9 ?- j; I' i2 E; z# C过由于对物理卷轴文件和索引文件的操作都是追加操作,只需要扫描物理卷轴文件8 ^+ }( }, b  U' d+ H7 _
    最后写入的几个Needle,然后补全索引文件即可。这种技术在仅支持追加的文件系
    + h1 D3 H( D8 p统很常见。* K8 |& D1 A' e! O) B/ T  y
    Haystack Store存储节点采用延迟删除的回收策略,删除照片只是向卷轴中追加
    9 q% U" V$ q, a9 a! L) i一个带有删除标记的Needle,定时执行Compaction任务回收已删除空间。所谓; }% ]2 q) k4 d3 p  W* P% r
    Compaction操作,即将所有老数据文件中的数据扫描一遍,以保留最新一个照片的原
    1 X0 ?+ N8 ^$ f5 t3 f. ~# G% B则进行删除,并生成新的数据文件。, h: ?& ~8 X$ S% Q
    4.3.2 讨论6 d1 M' |+ @2 v9 N7 h
    相比TFS,Haystack的一大特色就是磁盘空间回收。Blob文件在TFS中通过<Block
    6 A. F" c+ c) sid,Block offset>标识,因此,不能对TFS中的数据块进行重整操作;而Haystack中的2 e8 ~5 }4 Q7 W8 [0 b* ~- W
    元信息只能定位到Blob文件所在的逻辑卷轴,Haystack存储节点可以根据情况对物理
    . P* g' \+ F. @$ y6 q卷轴进行Compaction操作以回收磁盘空间。
    3 ~5 U( e. W) o- {Facebook Haystack中每个逻辑卷轴的大小为100GB,这样减少了元信息,但是增' A# M; ]% n6 d& E: E3 [
    加了迁移的时间。假设限制内部网络带宽为20MB/s,那么迁移100GB的数据需要的
    7 u; ^# H( ^0 \. V4 p时间为100GB/20MB/s=5000s,大约是一个半小时。而TFS设计的数据规模相比
    4 @" m2 z- @6 ~: `2 |+ _9 rHaystack要小,因此,可以选择64MB的块大小,有利于负载均衡。
    % _0 O: E6 V3 e/ H6 O另外,Haystack使用RAID 6,并且底层文件系统使用性能更好的XFS,淘宝TFS  x2 k7 e$ L2 w5 V
    不使用RAID机制,文件系统使用Ext3,由应用程序负责管理多个磁盘。Haystack使用8 w: L  _; m% k. t/ X, ?
    了Akamai&Limelight的CDN服务,而淘宝已经使用自建的CDN,当然,Facebook也在' X( N- }2 t3 n/ F8 E, E8 Y5 M2 h0 U3 T
    考虑自建CDN。
    ) ^) R$ o- w2 [/ A6 l1 r/ o1 y  L7 O2 w4 s* ?* H1 |. l/ v, K: X! X/ u  \

    % M" X1 ?9 Y% b0 {
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-1-22 14:41 , Processed in 0.476181 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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