java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2173|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66105

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

    发表于 2017-3-3 20:25:48 | 显示全部楼层 |阅读模式
    4.3 Facebook Haystack: u% X  }+ B" _
    Facebook目前存储了2600亿张照片,总大小为20PB,通过计算可以得出每张照
    3 Q4 I( u9 X- W& L片的平均大小为20PB/260GB,约为80KB。用户每周新增照片数为10亿(总大小为
    4 ]7 |' H' H* w! _4 `/ E  {5 u+ y60TB),平均每秒新增的照片数为10 9 /7/40000(按每天40000s计),约为每秒3500
    0 f; y" Z1 `: I& R次写操作,读操作峰值可以达到每秒百万次。  L1 o6 W3 V! q& a1 A, O& r
    Facebook相册后端早期采用基于NAS的存储,通过NFS挂载NAS中的照片文件来
    - w7 A% d( j. E% I提供服务。后来出于性能和成本考虑,自主研发了Facebook Haystack存储相册数据。
    5 q1 e* j- w* r8 X2 a4.3.1 系统架构
    & z/ L( {" }5 _4 f7 j' G& dFacebook Haystack的思路与TFS类似,也是多个逻辑文件共享一个物理文件。
    9 ~7 n. r1 r" bHaystack架构及读请求处理流程如图4-6所示。, a4 _! }! s& d0 V& @
    图 4-6 Haystack架构图
    . M9 t2 x& A( bHaystack系统主要包括三个部分:目录(Directory)、存储(Store)以及缓存' l7 c0 v. j/ i0 S5 ]! I; U+ L' f! o
    (Cache)。Haystack存储是物理存储节点,以物理卷轴(physical volume)的形式组$ M8 W; d2 A9 l
    织存储空间,每个物理卷轴一般都很大,比如100GB,这样10TB的数据也只需100个
    * t9 ]8 [+ G( F6 F* F5 k物理卷轴。每个物理卷轴对应一个物理文件,因此,每个存储节点上的物理文件元
    8 O+ L7 n, W1 S0 h数据都很小。多个物理存储节点上的物理卷轴组成一个逻辑卷轴(logical
    / B1 m1 g9 C4 Y' h! \* y* i" ovolume),用于备份。Haystack目录存放逻辑卷轴和物理卷轴的对应关系,以及照片( r3 J6 Y/ N  `: T' u
    id到逻辑卷轴之间的映射关系。Haystack缓存主要用于解决对CDN提供商过于依赖的' M; ^) s- W& v* N
    问题,提供最近增加的照片的缓存服务。, y! g, M: o1 E2 e- ^" X9 P
    Haystack照片读取请求大致流程为:用户访问一个页面时,Web服务器请求
    , P3 k% i  s! a6 j& LHaystack目录构造一个URL:http://<CDN>/<Cache>/<Machine id>/<Logical
    , l2 a! o! U4 a7 R8 p  Dvolume,Photo>,后续根据各个部分的信息依次访问CDN、Haystack缓存和后端的
    2 \8 p9 T2 r6 ^1 {$ Q$ o5 }  WHaystack存储节点。Haystack目录构造URL时可以省略<CDN>部分从而使得用户直
    $ S: ^  G  b8 t% |8 O1 M+ J接请求Haystack缓存而不必经过CDN。Haystack缓存收到的请求包含两个部分:用户. m5 i, {, s) r# M
    浏览器的请求及CDN的请求,Haystack缓存只缓存用户浏览器发送的请求且要求请求8 T/ _4 k4 t/ F8 N9 W
    的Haystack存储节点是可写的。一般来说,Haystack后端的存储节点写一段时间以后
    # j! @) X5 c4 c$ I8 u达到容量上限变为只读,因此,可写节点的照片为最近增加的照片,是热点数据。6 n: }8 A3 {: N6 h
    本节暂不讨论CDN,只讨论Haystack后端存储系统,包括Haystack目录和Haystack缓, S% a6 N  p( I$ z
    存两个部分。
    ; c8 D0 D  d( o3 R, n1.写流程7 N2 v9 w! ?) ^& r: _6 B8 }
    如图4-7所示,Haystack的写请求(照片上传)处理流程为:Web服务器首先请求, h  X9 u# e. P1 \4 V
    Haystack目录获取可写的逻辑卷轴,接着生成照片唯一id并将数据写入每一个对应的
    6 |& m+ m2 q8 Q9 |物理卷轴(备份数一般为3)。写操作成功要求所有的物理卷轴都成功,如果中间出6 n) f9 R$ \0 T0 v
    现故障,需要重试。
    ( F( B/ y, L9 d  m9 N1 R+ c图 4-7 Haystack写流程$ H5 a& L3 ?+ d% Z
    Haystack的一致性模型保证只要写操作成功,逻辑卷轴对应的所有物理卷轴都存
    ' I6 L% r3 t$ e2 F, h1 O( _: k( [0 t在一个有效的照片文件,但有效照片文件在不同物理卷轴中的偏移(offset)可能不
    & Y7 X, q' \+ c3 h4 {同。
    . g: j; b' N" T( \- LHaystack存储节点只支持追加操作,如果需要更新一张照片,可以新增一张编号( Q# P7 w8 h+ A) Y
    相同的照片到系统中,如果新增照片和原有的照片在不同的逻辑卷轴,Haystack目录: Z5 J5 r+ b  |: z( W* \
    的元数据会更新为最新的逻辑卷轴;如果新增照片和原有的照片在相同的逻辑卷+ l0 j9 `4 o0 D4 r) e: b8 k
    轴,Haystack存储会以偏移更大的照片文件为准。' L6 x; v/ g; R/ h
    2.容错处理  K0 y2 `/ _- {; b
    (1)Haystack存储节点容错) \% i9 m3 L# t  C
    检测到存储节点故障时,所有物理卷轴对应的逻辑卷轴都被标记为只读。存储" [5 E- D/ j: F
    节点上的未完成的写操作全部失败,写操作将重试;如果发生故障的存储节点不可
    + U/ `8 g8 \' g+ I0 Z恢复,需要执行一个拷贝任务,从其他副本所在的存储节点拷贝丢失的物理卷轴的7 l" P# h( `$ G: C  e
    数据;由于物理卷轴一般很大,比如100GB,所以拷贝的过程会很长,一般为小时
    , r" t+ m+ M! ~0 x3 ]) C7 e级别。8 ~/ q$ Q8 p3 Y. s
    (2)Haystack目录容错
    9 b' I3 }" ?  n) kHaystack目录采用主备数据库(Replicated Database)做持久化存储,由主备数据
    2 f4 o9 ]! }( E" I8 d) e! z/ `库提供容错机制。' Y5 J- K% l. r# g+ _! |% t4 v
    3.Haystack目录
    ) l# E) F3 @& |* V, C3 oHaystack目录的功能如下:
    % i  k* \: B) }, r1)提供逻辑卷轴到物理卷轴的映射,维护照片id到逻辑卷轴的映射;
    / H8 T+ ]5 @( n2)提供负载均衡,为写操作选择逻辑卷轴,读操作选择物理卷轴;+ I0 \; P) x0 w2 W/ J
    3)屏蔽CDN服务,可以选择某些图片请求直接走Haystack缓存;$ _3 [/ H: A- i
    4)标记某些逻辑卷轴为只读。  W, S! `2 v3 ~3 J
    根据前面的计算结果可知,Facebook相册系统每秒的写操作大约为3500次,每# \+ M" i/ l# T. N
    秒的读请求大约为100万次。每个写请求都需要通过Haystack缓存获取可写的卷轴,
    7 k: u- H4 `. U  V5 b每个读请求需要通过Haystack缓存构造读取URL。这里需要注意,照片id到逻辑卷轴. B( f. o( `2 I$ n7 I3 y$ N
    的映射的数据量太大,单机内存无法存放,笔者猜测内部使用了MySQL Sharding集
    / \7 |/ p  `+ q( n; C群,另外,还增加了一个Memcache集群满足查询需求。' R& t' Q- ~+ `) g6 o! S
    4.Haystack存储/ P" ^/ T& `' E5 n5 }
    Haystack存储保存物理卷轴,每个物理卷轴对应文件系统中的一个物理文件,每. s. H$ I& z) J6 n2 ^$ R
    个物理文件的格式如图4-8所示。5 Q" ]: A7 ?5 g% T
    图 4-8 Haystack数据块格式
    - T$ z( _% `  ?4 Y1 p0 d* C多个照片文件存放在一个物理卷轴中,每个照片文件是一个Needle,包含实际
    6 |3 J6 ^& g. k, U( k# }数据及逻辑照片文件的元数据。部分元数据需要装载到内存中用于照片查找,包括7 y0 I7 W9 r3 }# ^# M/ Z
    Key(照片id,8字节),Alternate Key(照片规格,包括Thumbnail、Small、Medium
    4 {- p9 L  V' [5 w5 K9 N4 z1 B及Large,4字节),照片在物理卷轴的偏移Offset(4字节),照片的大小Size(4字
    6 m! x( v7 @* y# O节),每张照片占用8+8+4=20字节的空间,假设每台机器的可用磁盘为8TB,照片; D8 |' c0 g- X$ J
    平均大小为80KB,单机存储的照片数为8TB/80KB=100MB,占用内存
    ( d! q) K. s+ u' S, J& D  L2 y100MB×20=2GB。* I- w* Z" `5 K7 H& I. ]
    存储节点宕机时,需要恢复内存中的逻辑照片查找表,扫描整个物理卷轴耗时: }: Q" p) `% g4 t5 C9 L
    太长,因此,对每个物理卷轴维护了一个索引文件(Index File),保存每个Needle- E) n7 H8 Y" k+ M+ l4 A' f
    查找相关的元数据。写操作首先更新物理卷轴文件,然后异步更新索引文件。由于. X5 _2 C+ H& _4 A" P7 T
    更新索引文件是异步的,所以可能出现索引文件和物理卷轴文件不一致的情况,不
    3 ?9 b5 `- T! L& X; z过由于对物理卷轴文件和索引文件的操作都是追加操作,只需要扫描物理卷轴文件
    4 G8 b# }7 ?& j. S最后写入的几个Needle,然后补全索引文件即可。这种技术在仅支持追加的文件系* C. j7 i% |( a- D* ?- k. z
    统很常见。9 K  C1 ]8 N4 c5 P/ l
    Haystack Store存储节点采用延迟删除的回收策略,删除照片只是向卷轴中追加
    ' J2 H0 y+ F% l3 |一个带有删除标记的Needle,定时执行Compaction任务回收已删除空间。所谓
    ( k+ g8 G; f) ?- {2 Z2 {2 M) U2 W2 i7 PCompaction操作,即将所有老数据文件中的数据扫描一遍,以保留最新一个照片的原
    . i3 w/ Z- |1 H' c则进行删除,并生成新的数据文件。) Y9 M+ }" n/ H& u4 R/ s
    4.3.2 讨论) ]# D  w/ Y% j. t
    相比TFS,Haystack的一大特色就是磁盘空间回收。Blob文件在TFS中通过<Block
    2 l. o0 c0 h! F+ G2 Did,Block offset>标识,因此,不能对TFS中的数据块进行重整操作;而Haystack中的
    * A1 t" j+ c- n3 K* N元信息只能定位到Blob文件所在的逻辑卷轴,Haystack存储节点可以根据情况对物理
    ) m7 @$ I4 q" `+ W. Z卷轴进行Compaction操作以回收磁盘空间。* r$ M- V$ _3 \  s
    Facebook Haystack中每个逻辑卷轴的大小为100GB,这样减少了元信息,但是增
    0 F$ t% G# ]* ?! q* O$ x加了迁移的时间。假设限制内部网络带宽为20MB/s,那么迁移100GB的数据需要的0 e/ m: m8 U1 F0 ~
    时间为100GB/20MB/s=5000s,大约是一个半小时。而TFS设计的数据规模相比$ T- n6 C6 r. x0 I- w& E- J& E/ O
    Haystack要小,因此,可以选择64MB的块大小,有利于负载均衡。
    5 Q' |  q3 }# K7 C8 ]2 P, H另外,Haystack使用RAID 6,并且底层文件系统使用性能更好的XFS,淘宝TFS* N$ B- a; D( W. A3 D: {% t! m
    不使用RAID机制,文件系统使用Ext3,由应用程序负责管理多个磁盘。Haystack使用
    # r1 F3 }5 h! U$ I+ R7 S了Akamai&Limelight的CDN服务,而淘宝已经使用自建的CDN,当然,Facebook也在( x# \5 C) h4 [: G9 p
    考虑自建CDN。4 O& W1 L* l/ F7 B# q

    ! K  M) ~- F' p0 h/ Q$ Q) U* S0 G+ I) j8 v8 z
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-7 02:55 , Processed in 0.058254 second(s), 29 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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