java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2402|回复: 0

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

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

    [LV.Master]出神入化

    2097

    主题

    3755

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66793

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

    发表于 2017-3-3 20:25:48 | 显示全部楼层 |阅读模式
    4.3 Facebook Haystack
    ; S/ c! h4 C* t/ v% G* i- RFacebook目前存储了2600亿张照片,总大小为20PB,通过计算可以得出每张照
    3 Z+ B' \. q" X# R3 k& ]片的平均大小为20PB/260GB,约为80KB。用户每周新增照片数为10亿(总大小为( j* h6 K& @! m
    60TB),平均每秒新增的照片数为10 9 /7/40000(按每天40000s计),约为每秒3500, Z( n- a$ T1 \1 a0 k5 P
    次写操作,读操作峰值可以达到每秒百万次。1 ~. I0 q" _& t& s* j! z# C5 m% p+ C
    Facebook相册后端早期采用基于NAS的存储,通过NFS挂载NAS中的照片文件来
    + u0 t( \4 a# C, B( b$ e提供服务。后来出于性能和成本考虑,自主研发了Facebook Haystack存储相册数据。
    : H4 M. u6 L% V& _6 X6 v: D# Q1 b4.3.1 系统架构
    6 x4 P- f# N0 W6 r% @, {& Q! xFacebook Haystack的思路与TFS类似,也是多个逻辑文件共享一个物理文件。
    ! c& b8 j0 f% }% m5 K, IHaystack架构及读请求处理流程如图4-6所示。  B7 }! H" R+ l
    图 4-6 Haystack架构图
    1 l0 K, \8 p; JHaystack系统主要包括三个部分:目录(Directory)、存储(Store)以及缓存& s+ k$ p6 U$ |" P" M+ I0 c
    (Cache)。Haystack存储是物理存储节点,以物理卷轴(physical volume)的形式组
    ; O$ D6 F# e0 n) n6 h/ b; E织存储空间,每个物理卷轴一般都很大,比如100GB,这样10TB的数据也只需100个- w2 e4 r* N" B1 q* g+ @. x
    物理卷轴。每个物理卷轴对应一个物理文件,因此,每个存储节点上的物理文件元
    ; L. G/ x% f3 R3 N! Z0 k数据都很小。多个物理存储节点上的物理卷轴组成一个逻辑卷轴(logical
    4 D0 \2 A  o# H1 B, `volume),用于备份。Haystack目录存放逻辑卷轴和物理卷轴的对应关系,以及照片9 d" d2 d7 b) F) C; }9 q6 u& s- s/ c
    id到逻辑卷轴之间的映射关系。Haystack缓存主要用于解决对CDN提供商过于依赖的
    9 L2 ?: q* T7 D( s- m; I问题,提供最近增加的照片的缓存服务。; e( X) \" o6 x. o* I
    Haystack照片读取请求大致流程为:用户访问一个页面时,Web服务器请求; e' I' Z  C. G9 e4 K. D9 b
    Haystack目录构造一个URL:http://<CDN>/<Cache>/<Machine id>/<Logical+ N* M# I# ^) T5 {& m7 p0 Y7 V$ {
    volume,Photo>,后续根据各个部分的信息依次访问CDN、Haystack缓存和后端的/ K5 n) }0 v: w
    Haystack存储节点。Haystack目录构造URL时可以省略<CDN>部分从而使得用户直
    4 y! w+ E7 _4 @4 g接请求Haystack缓存而不必经过CDN。Haystack缓存收到的请求包含两个部分:用户
    8 y; i" M; @' q浏览器的请求及CDN的请求,Haystack缓存只缓存用户浏览器发送的请求且要求请求
      a! w- U; `' i2 Z的Haystack存储节点是可写的。一般来说,Haystack后端的存储节点写一段时间以后! ~6 q3 f6 R; T
    达到容量上限变为只读,因此,可写节点的照片为最近增加的照片,是热点数据。
    0 W+ n% F; d7 k3 R本节暂不讨论CDN,只讨论Haystack后端存储系统,包括Haystack目录和Haystack缓7 N( {; Q" ]9 p4 b
    存两个部分。
    # V' H" j+ ?+ y" L& s, N; l7 _1.写流程! w' z3 S8 T. t) Y; I$ d
    如图4-7所示,Haystack的写请求(照片上传)处理流程为:Web服务器首先请求
    9 i' ~/ y- }0 l: ?8 W8 h/ FHaystack目录获取可写的逻辑卷轴,接着生成照片唯一id并将数据写入每一个对应的$ X: v5 i9 H1 W6 @
    物理卷轴(备份数一般为3)。写操作成功要求所有的物理卷轴都成功,如果中间出
    * M* A' o, j. F1 M( G3 R% W现故障,需要重试。* j% m. v+ f" o. b
    图 4-7 Haystack写流程
    5 V2 F2 b, J, X. P( G* kHaystack的一致性模型保证只要写操作成功,逻辑卷轴对应的所有物理卷轴都存
    # @8 k0 C8 @/ b: {* O在一个有效的照片文件,但有效照片文件在不同物理卷轴中的偏移(offset)可能不
    - S1 U  m% K; a4 d. l7 P0 ?# [同。
    & W! R0 D8 {' @$ uHaystack存储节点只支持追加操作,如果需要更新一张照片,可以新增一张编号1 ?9 i7 w+ |9 h
    相同的照片到系统中,如果新增照片和原有的照片在不同的逻辑卷轴,Haystack目录
    . u9 n; f$ I: C( F$ E+ l, \- h的元数据会更新为最新的逻辑卷轴;如果新增照片和原有的照片在相同的逻辑卷7 n2 j/ w6 g" y$ R3 x  Y# X5 J3 P  K
    轴,Haystack存储会以偏移更大的照片文件为准。* C+ k: o+ s: u/ W5 n* I
    2.容错处理, I3 u$ o9 r8 y. {6 l: h( \
    (1)Haystack存储节点容错
    ; Q+ \3 g8 f* Q- I4 c, |检测到存储节点故障时,所有物理卷轴对应的逻辑卷轴都被标记为只读。存储
    $ L6 L* D! I! g/ J节点上的未完成的写操作全部失败,写操作将重试;如果发生故障的存储节点不可
    2 A0 X, H- b  {& I恢复,需要执行一个拷贝任务,从其他副本所在的存储节点拷贝丢失的物理卷轴的
    3 S4 ^* ?# A7 |$ R9 u/ q数据;由于物理卷轴一般很大,比如100GB,所以拷贝的过程会很长,一般为小时& g$ H" s- K- \; G
    级别。/ U* r9 f$ [- C0 T6 M# F, v+ l
    (2)Haystack目录容错; m9 U2 T5 A! ~9 J6 v$ E% E. o; A
    Haystack目录采用主备数据库(Replicated Database)做持久化存储,由主备数据, A. R: X$ z; \" V+ z7 K# p! H1 D9 U
    库提供容错机制。
    1 Z* a& j' l; B9 \; V# ]& r3.Haystack目录" L+ s8 p' e4 V- `  X$ g4 \
    Haystack目录的功能如下:
    3 W  |1 n5 M  {9 H1)提供逻辑卷轴到物理卷轴的映射,维护照片id到逻辑卷轴的映射;) |9 p$ m. D0 ]- L! l& B
    2)提供负载均衡,为写操作选择逻辑卷轴,读操作选择物理卷轴;' \  W9 h" E$ r
    3)屏蔽CDN服务,可以选择某些图片请求直接走Haystack缓存;
    , M( n- e8 Q9 D; i9 X  r# Y# ~* m4)标记某些逻辑卷轴为只读。4 N& v6 G4 ?0 k( x6 e
    根据前面的计算结果可知,Facebook相册系统每秒的写操作大约为3500次,每9 A# U  b8 t$ h% E& R, J
    秒的读请求大约为100万次。每个写请求都需要通过Haystack缓存获取可写的卷轴,8 t: e7 \5 D  Q2 v2 O+ D2 j
    每个读请求需要通过Haystack缓存构造读取URL。这里需要注意,照片id到逻辑卷轴
    ' I2 x# d! `  k1 L2 F5 r的映射的数据量太大,单机内存无法存放,笔者猜测内部使用了MySQL Sharding集, |2 v; _: X+ v  Z
    群,另外,还增加了一个Memcache集群满足查询需求。  r5 m0 N$ F6 b; W, t9 P. N
    4.Haystack存储
    & l" v  a! m% T1 G+ k4 O" o, _Haystack存储保存物理卷轴,每个物理卷轴对应文件系统中的一个物理文件,每; @5 u" N6 b8 U+ F, {
    个物理文件的格式如图4-8所示。
    + x' E8 g& Y) \: \图 4-8 Haystack数据块格式9 r# ~5 S& _3 t) W6 {/ n* U/ G
    多个照片文件存放在一个物理卷轴中,每个照片文件是一个Needle,包含实际3 l( `! V' x* K7 o
    数据及逻辑照片文件的元数据。部分元数据需要装载到内存中用于照片查找,包括
    . D/ R$ \' v( D( w: \Key(照片id,8字节),Alternate Key(照片规格,包括Thumbnail、Small、Medium" s8 X# ^1 e4 [% W
    及Large,4字节),照片在物理卷轴的偏移Offset(4字节),照片的大小Size(4字
    $ C2 F- ?% \. S- O$ M节),每张照片占用8+8+4=20字节的空间,假设每台机器的可用磁盘为8TB,照片
    ; c6 Q0 G' t6 D, Y3 Z0 j平均大小为80KB,单机存储的照片数为8TB/80KB=100MB,占用内存
    & f+ N2 I; M! h8 P: c100MB×20=2GB。
    3 u# x! @2 Y- _2 {1 n存储节点宕机时,需要恢复内存中的逻辑照片查找表,扫描整个物理卷轴耗时
    . I8 m1 P! m2 Q) ?: y: @4 L+ a太长,因此,对每个物理卷轴维护了一个索引文件(Index File),保存每个Needle
    , l* {( M( C/ I; E8 j查找相关的元数据。写操作首先更新物理卷轴文件,然后异步更新索引文件。由于% k' S  N- F8 F( G) Y4 R' U! Z
    更新索引文件是异步的,所以可能出现索引文件和物理卷轴文件不一致的情况,不1 V  h0 r* ?0 _8 d) B
    过由于对物理卷轴文件和索引文件的操作都是追加操作,只需要扫描物理卷轴文件3 x* i% g' z( Z# z9 w; m
    最后写入的几个Needle,然后补全索引文件即可。这种技术在仅支持追加的文件系
    / O2 |# }; h7 v# D7 m/ e6 J统很常见。4 i8 ?! x! {( b' C! }% ?( l
    Haystack Store存储节点采用延迟删除的回收策略,删除照片只是向卷轴中追加: C7 Y5 l5 y  h) O/ Q
    一个带有删除标记的Needle,定时执行Compaction任务回收已删除空间。所谓( ^. ^) d! U3 u5 X; a2 Y
    Compaction操作,即将所有老数据文件中的数据扫描一遍,以保留最新一个照片的原
    & d5 Y  [5 I9 u$ ~则进行删除,并生成新的数据文件。
    2 L- S0 U( I0 R" Y* }4.3.2 讨论
    2 b% O% F) W" X, L相比TFS,Haystack的一大特色就是磁盘空间回收。Blob文件在TFS中通过<Block
    : p" ?8 M0 E9 Aid,Block offset>标识,因此,不能对TFS中的数据块进行重整操作;而Haystack中的) o9 y- t/ y3 ]& B
    元信息只能定位到Blob文件所在的逻辑卷轴,Haystack存储节点可以根据情况对物理( ]$ y# b9 _4 j0 Z2 [1 x, B
    卷轴进行Compaction操作以回收磁盘空间。3 Y* m: G9 A& F* @5 M. l8 I  [
    Facebook Haystack中每个逻辑卷轴的大小为100GB,这样减少了元信息,但是增8 f  {5 w( e" E
    加了迁移的时间。假设限制内部网络带宽为20MB/s,那么迁移100GB的数据需要的% R+ K# ]! p9 p( V: T1 D" x  C- A
    时间为100GB/20MB/s=5000s,大约是一个半小时。而TFS设计的数据规模相比
    % P( H( @& h( Z) p9 IHaystack要小,因此,可以选择64MB的块大小,有利于负载均衡。
    5 P( y( F. K" K, e1 k另外,Haystack使用RAID 6,并且底层文件系统使用性能更好的XFS,淘宝TFS
    2 P2 W+ x9 M0 O6 n  h! c; ]不使用RAID机制,文件系统使用Ext3,由应用程序负责管理多个磁盘。Haystack使用" J& ]* ?* q* F# H0 U6 x; S# \4 C
    了Akamai&Limelight的CDN服务,而淘宝已经使用自建的CDN,当然,Facebook也在, H/ a5 ~6 J( j5 U% H" v- G' ~# U
    考虑自建CDN。
    4 Z/ J# G( @( s! `' c" x  y" j
    . ?- r5 |) x9 q# n) s! \  |6 ^( n$ {5 B
    4 |* X  ^. U' j# c' Y
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-4-2 17:27 , Processed in 0.299722 second(s), 34 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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