java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2336|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66375

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

    发表于 2017-3-3 20:25:48 | 显示全部楼层 |阅读模式
    4.3 Facebook Haystack+ ?9 \8 f7 ~2 X& g
    Facebook目前存储了2600亿张照片,总大小为20PB,通过计算可以得出每张照8 s5 I7 _+ i% d; C; b
    片的平均大小为20PB/260GB,约为80KB。用户每周新增照片数为10亿(总大小为5 T5 u/ D, ~: U: a+ }7 I) z2 T
    60TB),平均每秒新增的照片数为10 9 /7/40000(按每天40000s计),约为每秒3500
    - B" h* Z" H: U1 W次写操作,读操作峰值可以达到每秒百万次。
    + F) F' b9 S: O* T7 e5 J) LFacebook相册后端早期采用基于NAS的存储,通过NFS挂载NAS中的照片文件来
    " t' \. q2 H' O  C提供服务。后来出于性能和成本考虑,自主研发了Facebook Haystack存储相册数据。# Y, M2 `) v; v( X2 D" P- F+ i5 T
    4.3.1 系统架构7 y$ \' ?: {, z% w" r; t5 d  C
    Facebook Haystack的思路与TFS类似,也是多个逻辑文件共享一个物理文件。
    7 u% N: t7 ^3 P0 q2 f. N4 eHaystack架构及读请求处理流程如图4-6所示。+ O$ Y: \8 ]* y( T: _' d
    图 4-6 Haystack架构图
    % c& r5 x1 @! A7 e7 e! HHaystack系统主要包括三个部分:目录(Directory)、存储(Store)以及缓存
    ; p" V; l3 E& C1 _(Cache)。Haystack存储是物理存储节点,以物理卷轴(physical volume)的形式组
    9 m& r' `) ~. `% h% z" P9 n) y织存储空间,每个物理卷轴一般都很大,比如100GB,这样10TB的数据也只需100个  \' \4 z* g5 T1 l. x2 j
    物理卷轴。每个物理卷轴对应一个物理文件,因此,每个存储节点上的物理文件元6 j7 R& O( _  q
    数据都很小。多个物理存储节点上的物理卷轴组成一个逻辑卷轴(logical2 V- k  U* }) X5 z9 C0 M. _% g
    volume),用于备份。Haystack目录存放逻辑卷轴和物理卷轴的对应关系,以及照片% i7 [& e: d$ n, x8 w  `5 S, c- U
    id到逻辑卷轴之间的映射关系。Haystack缓存主要用于解决对CDN提供商过于依赖的# t. b# L4 M' s
    问题,提供最近增加的照片的缓存服务。% F& @1 w" P3 _- |- F% k
    Haystack照片读取请求大致流程为:用户访问一个页面时,Web服务器请求# `. M5 B- l: R* G9 v# l
    Haystack目录构造一个URL:http://<CDN>/<Cache>/<Machine id>/<Logical
    - }6 X/ U6 X9 Q0 @volume,Photo>,后续根据各个部分的信息依次访问CDN、Haystack缓存和后端的
    1 {3 _9 |/ P7 |3 YHaystack存储节点。Haystack目录构造URL时可以省略<CDN>部分从而使得用户直
    ) n3 d* Q, t; \4 {! m9 |# f0 e接请求Haystack缓存而不必经过CDN。Haystack缓存收到的请求包含两个部分:用户
    9 C4 A8 Z; X5 w! j1 k: O浏览器的请求及CDN的请求,Haystack缓存只缓存用户浏览器发送的请求且要求请求/ {3 ^1 N- i/ A. W2 I3 m
    的Haystack存储节点是可写的。一般来说,Haystack后端的存储节点写一段时间以后' N3 Z7 v! C, V" n6 @% J
    达到容量上限变为只读,因此,可写节点的照片为最近增加的照片,是热点数据。) ]- C! N" [% Z6 \
    本节暂不讨论CDN,只讨论Haystack后端存储系统,包括Haystack目录和Haystack缓' E! U9 y  q( Q+ A
    存两个部分。+ v* [. S$ O9 K% R5 T( e
    1.写流程
    , r8 q, n; w$ Y如图4-7所示,Haystack的写请求(照片上传)处理流程为:Web服务器首先请求
    2 Y7 H' p9 e1 q+ i7 {6 FHaystack目录获取可写的逻辑卷轴,接着生成照片唯一id并将数据写入每一个对应的
    7 V4 p# i3 O6 h' z物理卷轴(备份数一般为3)。写操作成功要求所有的物理卷轴都成功,如果中间出9 r* u4 f. j+ {4 u0 a# E- i2 i
    现故障,需要重试。. ]+ C6 V. _! t! b& g
    图 4-7 Haystack写流程
    ! h! h/ _) k1 G" @; c* fHaystack的一致性模型保证只要写操作成功,逻辑卷轴对应的所有物理卷轴都存* G- K% R( [" Q6 y
    在一个有效的照片文件,但有效照片文件在不同物理卷轴中的偏移(offset)可能不
    ; s5 o2 Q; r  l" K同。3 w4 X. y  k; J: i  W
    Haystack存储节点只支持追加操作,如果需要更新一张照片,可以新增一张编号
    6 i$ o! S; r) V5 {7 |7 K; H6 O相同的照片到系统中,如果新增照片和原有的照片在不同的逻辑卷轴,Haystack目录
    2 m& \: l' L+ z* U; _) Q的元数据会更新为最新的逻辑卷轴;如果新增照片和原有的照片在相同的逻辑卷2 d6 M7 N4 A& }' S6 t% K
    轴,Haystack存储会以偏移更大的照片文件为准。. s/ k& `! w7 c' x3 L. L
    2.容错处理1 }! r; @# S+ D; a4 Q& y" K
    (1)Haystack存储节点容错# N& O& B, [, m+ M: p# R/ g
    检测到存储节点故障时,所有物理卷轴对应的逻辑卷轴都被标记为只读。存储
    0 T6 L( \3 d* x. C/ C+ a* C节点上的未完成的写操作全部失败,写操作将重试;如果发生故障的存储节点不可& O; X  h, O3 l( R  Z& n; t- L, g
    恢复,需要执行一个拷贝任务,从其他副本所在的存储节点拷贝丢失的物理卷轴的
    - e+ n8 I/ B& j数据;由于物理卷轴一般很大,比如100GB,所以拷贝的过程会很长,一般为小时8 D* V, P7 I9 \
    级别。
    ( G; P3 }. V. E(2)Haystack目录容错
    7 I, b+ o. Z, O) zHaystack目录采用主备数据库(Replicated Database)做持久化存储,由主备数据
    6 a; B" r1 O& l( G( }# |; u库提供容错机制。4 |0 d5 s/ J5 r% o6 D6 K7 |4 f$ }
    3.Haystack目录
    7 y2 _. e6 O: p) N' NHaystack目录的功能如下:# P/ o$ U% u/ X
    1)提供逻辑卷轴到物理卷轴的映射,维护照片id到逻辑卷轴的映射;. u' k$ g/ v0 y4 S7 e. |2 p/ N
    2)提供负载均衡,为写操作选择逻辑卷轴,读操作选择物理卷轴;
    * `1 E% n4 d7 H( `. J+ C- r& F, S3)屏蔽CDN服务,可以选择某些图片请求直接走Haystack缓存;
    ; |) r7 i, A! ^2 d) u3 x4)标记某些逻辑卷轴为只读。$ Q( \1 g' {/ V1 i6 q1 Q' v' s
    根据前面的计算结果可知,Facebook相册系统每秒的写操作大约为3500次,每0 Z' r+ q8 L0 b2 T6 O* g1 \
    秒的读请求大约为100万次。每个写请求都需要通过Haystack缓存获取可写的卷轴,
    # g$ J- g2 p. [4 G3 ?1 ?9 C  V; o每个读请求需要通过Haystack缓存构造读取URL。这里需要注意,照片id到逻辑卷轴
    7 R! G7 U6 R, k: v4 Q: D4 k/ u的映射的数据量太大,单机内存无法存放,笔者猜测内部使用了MySQL Sharding集8 b: `' }- d: P  q
    群,另外,还增加了一个Memcache集群满足查询需求。1 f( }. y2 N; r* r9 I$ c
    4.Haystack存储
    8 ?4 t. T7 S& B* M1 |! b% _+ s- B  AHaystack存储保存物理卷轴,每个物理卷轴对应文件系统中的一个物理文件,每
    4 [4 a/ F( ^9 O4 ?3 j. x- P' J个物理文件的格式如图4-8所示。
    ( m7 S6 M1 Z7 Z9 B* N  e图 4-8 Haystack数据块格式4 P8 Z3 z* h: w! d, [! P, b. |1 F( ~
    多个照片文件存放在一个物理卷轴中,每个照片文件是一个Needle,包含实际" v: t5 o, W% _4 `
    数据及逻辑照片文件的元数据。部分元数据需要装载到内存中用于照片查找,包括
    : a5 ~( v: Q! ^! d. s! Y3 z) S. mKey(照片id,8字节),Alternate Key(照片规格,包括Thumbnail、Small、Medium7 C6 \+ l' ^7 X. S
    及Large,4字节),照片在物理卷轴的偏移Offset(4字节),照片的大小Size(4字
    2 P  z4 K7 L4 s5 y4 R6 ~: I节),每张照片占用8+8+4=20字节的空间,假设每台机器的可用磁盘为8TB,照片
    ' S" \# ]' W; G9 I% J  e- b平均大小为80KB,单机存储的照片数为8TB/80KB=100MB,占用内存
    ) P# W' ~1 e8 z  L3 q# I100MB×20=2GB。, }& T- D$ |) |1 t2 q8 F' A+ _  {
    存储节点宕机时,需要恢复内存中的逻辑照片查找表,扫描整个物理卷轴耗时
    * a3 K7 j; G2 v  Q  j. ], d太长,因此,对每个物理卷轴维护了一个索引文件(Index File),保存每个Needle
    " [4 ^' {& n0 c: t/ e+ z查找相关的元数据。写操作首先更新物理卷轴文件,然后异步更新索引文件。由于
    4 w* z! U0 L1 Z5 z* v5 k更新索引文件是异步的,所以可能出现索引文件和物理卷轴文件不一致的情况,不, \8 g! {+ u/ ?+ W
    过由于对物理卷轴文件和索引文件的操作都是追加操作,只需要扫描物理卷轴文件; s( n6 l6 w4 H4 Z5 I6 n( i( P' D
    最后写入的几个Needle,然后补全索引文件即可。这种技术在仅支持追加的文件系' Z6 F' N; H# f/ A/ z" T) i
    统很常见。& v+ d- [4 X' U0 b4 l. _+ `
    Haystack Store存储节点采用延迟删除的回收策略,删除照片只是向卷轴中追加7 i( w, P! Z- z: j  J
    一个带有删除标记的Needle,定时执行Compaction任务回收已删除空间。所谓" T) k9 L, X- o0 x9 s
    Compaction操作,即将所有老数据文件中的数据扫描一遍,以保留最新一个照片的原; k- ^& _1 Q2 L9 d; B) C
    则进行删除,并生成新的数据文件。- h9 R( y- p- t& V3 Q
    4.3.2 讨论% W( W4 U! a% X4 j7 T
    相比TFS,Haystack的一大特色就是磁盘空间回收。Blob文件在TFS中通过<Block( s" P# N0 d0 A1 V
    id,Block offset>标识,因此,不能对TFS中的数据块进行重整操作;而Haystack中的; ]  f: A5 {' ^& A
    元信息只能定位到Blob文件所在的逻辑卷轴,Haystack存储节点可以根据情况对物理
    . u6 `9 k# }5 Q; v; g$ H1 p卷轴进行Compaction操作以回收磁盘空间。/ e" d( T- T; O# S
    Facebook Haystack中每个逻辑卷轴的大小为100GB,这样减少了元信息,但是增1 a2 R: L# U$ L' [3 _' S
    加了迁移的时间。假设限制内部网络带宽为20MB/s,那么迁移100GB的数据需要的
    2 i6 M- a8 V4 S7 U8 c# K! `+ [% c时间为100GB/20MB/s=5000s,大约是一个半小时。而TFS设计的数据规模相比8 @: h5 p5 X2 K8 [) t6 S
    Haystack要小,因此,可以选择64MB的块大小,有利于负载均衡。
    ' a0 m3 F9 Y/ ?1 ~$ E另外,Haystack使用RAID 6,并且底层文件系统使用性能更好的XFS,淘宝TFS  j! X5 C7 V$ Y
    不使用RAID机制,文件系统使用Ext3,由应用程序负责管理多个磁盘。Haystack使用
    ; M( K! @0 C7 J' e/ P了Akamai&Limelight的CDN服务,而淘宝已经使用自建的CDN,当然,Facebook也在4 V2 o% U! r  V, E
    考虑自建CDN。) B3 S; {) J) J; ?; q; }5 b
    5 L) I" k- n$ g& D/ X9 v4 h9 p& O
    : ?7 N  ~0 s6 t1 _+ G: E: I2 T
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-12-22 14:19 , Processed in 0.366377 second(s), 34 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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