java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2400|回复: 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 Haystack
    / n! u0 j8 `! \. mFacebook目前存储了2600亿张照片,总大小为20PB,通过计算可以得出每张照
    5 t, R3 Y1 z7 d! y6 j片的平均大小为20PB/260GB,约为80KB。用户每周新增照片数为10亿(总大小为& Q0 M% m- Q0 W5 @
    60TB),平均每秒新增的照片数为10 9 /7/40000(按每天40000s计),约为每秒35003 s9 P. T3 S) n2 z. \4 E( G
    次写操作,读操作峰值可以达到每秒百万次。
    ! D# O, M6 v3 f& f+ y! ~Facebook相册后端早期采用基于NAS的存储,通过NFS挂载NAS中的照片文件来1 w/ j* A% H- z; }
    提供服务。后来出于性能和成本考虑,自主研发了Facebook Haystack存储相册数据。* H# j8 N: _6 h- `4 a  {4 Y: ]1 K
    4.3.1 系统架构, d8 a8 Y8 q( `% _" a$ p3 }- p: y
    Facebook Haystack的思路与TFS类似,也是多个逻辑文件共享一个物理文件。
    ! P# i" `' z+ S- H& K& qHaystack架构及读请求处理流程如图4-6所示。
    2 g2 U# E: |. d* V图 4-6 Haystack架构图1 |, B/ K9 E' b( m: T5 K9 K
    Haystack系统主要包括三个部分:目录(Directory)、存储(Store)以及缓存* V& d5 c/ R% K9 C, S" n, w
    (Cache)。Haystack存储是物理存储节点,以物理卷轴(physical volume)的形式组5 m; J* k5 D% i; X: h7 s- K$ |
    织存储空间,每个物理卷轴一般都很大,比如100GB,这样10TB的数据也只需100个' A4 P' X# ?3 s( }4 p7 b
    物理卷轴。每个物理卷轴对应一个物理文件,因此,每个存储节点上的物理文件元% u8 [) q( d& S3 ~0 M" c
    数据都很小。多个物理存储节点上的物理卷轴组成一个逻辑卷轴(logical
    ) F1 q7 r4 @, `- dvolume),用于备份。Haystack目录存放逻辑卷轴和物理卷轴的对应关系,以及照片
    ( f5 L$ j, U2 c$ K/ U- D* {id到逻辑卷轴之间的映射关系。Haystack缓存主要用于解决对CDN提供商过于依赖的& M/ w+ ?& g& S# o% W. Y( @/ N4 S
    问题,提供最近增加的照片的缓存服务。! a5 B4 m. r* X9 p9 x/ D
    Haystack照片读取请求大致流程为:用户访问一个页面时,Web服务器请求7 ^/ B; _9 }1 S4 L' _* u
    Haystack目录构造一个URL:http://<CDN>/<Cache>/<Machine id>/<Logical3 d. v  z. s# R- R6 m7 G
    volume,Photo>,后续根据各个部分的信息依次访问CDN、Haystack缓存和后端的6 z" o6 g  G; [2 s; s" i
    Haystack存储节点。Haystack目录构造URL时可以省略<CDN>部分从而使得用户直* W4 X" u) `  o; k9 \8 S  u: t" v
    接请求Haystack缓存而不必经过CDN。Haystack缓存收到的请求包含两个部分:用户) @) {  \! |5 C' F* W  K
    浏览器的请求及CDN的请求,Haystack缓存只缓存用户浏览器发送的请求且要求请求$ n5 `7 {& X/ _
    的Haystack存储节点是可写的。一般来说,Haystack后端的存储节点写一段时间以后7 [. ~  ?) v* Q! v4 M; k
    达到容量上限变为只读,因此,可写节点的照片为最近增加的照片,是热点数据。( W" `# [' M' _7 P
    本节暂不讨论CDN,只讨论Haystack后端存储系统,包括Haystack目录和Haystack缓
    % l) n/ w# ?$ W" B存两个部分。
      b- U, _% k9 ]4 k' G0 U& W8 D1.写流程; R7 M; [/ }+ z
    如图4-7所示,Haystack的写请求(照片上传)处理流程为:Web服务器首先请求* E" ?3 ^4 F4 ^$ B
    Haystack目录获取可写的逻辑卷轴,接着生成照片唯一id并将数据写入每一个对应的$ ?0 {! c2 i* ^: M- j7 n; T
    物理卷轴(备份数一般为3)。写操作成功要求所有的物理卷轴都成功,如果中间出
    . N7 X& n7 G5 W/ E; d' M6 i现故障,需要重试。
    " M+ F, Z4 ~6 _" X8 y0 @图 4-7 Haystack写流程
    $ q, w& Y5 s) z9 l, KHaystack的一致性模型保证只要写操作成功,逻辑卷轴对应的所有物理卷轴都存: J' {6 V/ h* y5 k
    在一个有效的照片文件,但有效照片文件在不同物理卷轴中的偏移(offset)可能不
    " V" k7 Z- d7 x  B. G同。
    6 K" H+ H+ f: IHaystack存储节点只支持追加操作,如果需要更新一张照片,可以新增一张编号
    % J: J' `( d1 w( E# h6 y, D* ?: ?相同的照片到系统中,如果新增照片和原有的照片在不同的逻辑卷轴,Haystack目录7 w% f. m/ X! h$ a) R4 `; X! e
    的元数据会更新为最新的逻辑卷轴;如果新增照片和原有的照片在相同的逻辑卷$ R7 d  M4 o( _+ G6 x
    轴,Haystack存储会以偏移更大的照片文件为准。5 j# p' \1 X" s$ G, x
    2.容错处理& f5 S8 j0 e+ `- z& i) g
    (1)Haystack存储节点容错7 f& e" ?. b- x/ R. O0 u
    检测到存储节点故障时,所有物理卷轴对应的逻辑卷轴都被标记为只读。存储  H, D) p* h7 |
    节点上的未完成的写操作全部失败,写操作将重试;如果发生故障的存储节点不可" M% [0 D. a7 p' y0 m7 ]9 S/ ~9 w
    恢复,需要执行一个拷贝任务,从其他副本所在的存储节点拷贝丢失的物理卷轴的
    + s# M/ L4 s# h8 j  V+ ~9 a数据;由于物理卷轴一般很大,比如100GB,所以拷贝的过程会很长,一般为小时5 b. U. [; w' [8 u( u
    级别。
    * x1 l' n% d5 r# p, q* f# ~9 l(2)Haystack目录容错
    . u2 Q0 J) D8 b3 [- |7 YHaystack目录采用主备数据库(Replicated Database)做持久化存储,由主备数据
    3 z' r$ U/ P. k4 \库提供容错机制。- {' n, d6 k' s7 ?4 N
    3.Haystack目录: f: q3 o' q1 u& p0 w
    Haystack目录的功能如下:
    3 D5 z- s2 b0 ?5 ~; h1)提供逻辑卷轴到物理卷轴的映射,维护照片id到逻辑卷轴的映射;+ U% {5 }& e* x1 P2 M+ f+ a) F  v. H
    2)提供负载均衡,为写操作选择逻辑卷轴,读操作选择物理卷轴;0 T8 h  o2 `# T: R
    3)屏蔽CDN服务,可以选择某些图片请求直接走Haystack缓存;
    0 z1 M% j! F0 `& m- H! e. y4 a4)标记某些逻辑卷轴为只读。
    - Y( T1 r5 Z3 O根据前面的计算结果可知,Facebook相册系统每秒的写操作大约为3500次,每
    0 c# `+ o: _. L0 P# y秒的读请求大约为100万次。每个写请求都需要通过Haystack缓存获取可写的卷轴,& o  Y' e' I( A6 A; a1 m
    每个读请求需要通过Haystack缓存构造读取URL。这里需要注意,照片id到逻辑卷轴
    ( Z; ?* k, q  W, S1 [的映射的数据量太大,单机内存无法存放,笔者猜测内部使用了MySQL Sharding集
    7 O3 D) Z2 L. ~3 A7 A6 t/ T群,另外,还增加了一个Memcache集群满足查询需求。
    & l- Q/ X; A# |/ L8 |9 }4.Haystack存储
    9 B) t$ {8 t+ o  q' EHaystack存储保存物理卷轴,每个物理卷轴对应文件系统中的一个物理文件,每
    * L& v' E3 y: G& o7 s. m; V4 p1 ]个物理文件的格式如图4-8所示。! G  H  t: i* }; V1 P
    图 4-8 Haystack数据块格式2 p# u8 M. {8 ^: w$ N7 y
    多个照片文件存放在一个物理卷轴中,每个照片文件是一个Needle,包含实际. p$ p! I( C. a/ O6 k; s
    数据及逻辑照片文件的元数据。部分元数据需要装载到内存中用于照片查找,包括7 I1 _# Z/ T5 s( `/ v8 D# v3 p
    Key(照片id,8字节),Alternate Key(照片规格,包括Thumbnail、Small、Medium; F2 i/ X3 Y9 h+ T- V7 A" q6 D
    及Large,4字节),照片在物理卷轴的偏移Offset(4字节),照片的大小Size(4字
    . n# @6 B3 \6 [0 z1 b: ]8 a节),每张照片占用8+8+4=20字节的空间,假设每台机器的可用磁盘为8TB,照片
    9 }( v3 w: `6 X+ l& W) Q. [/ h+ l, C! C平均大小为80KB,单机存储的照片数为8TB/80KB=100MB,占用内存
    ' V/ E' |0 d. I0 N* B100MB×20=2GB。
    / m+ W6 v$ a/ J3 L& O存储节点宕机时,需要恢复内存中的逻辑照片查找表,扫描整个物理卷轴耗时' t: y, L' T1 u; z- e0 H7 E
    太长,因此,对每个物理卷轴维护了一个索引文件(Index File),保存每个Needle
    . _. J% q# O1 I6 U5 p2 k: W; s查找相关的元数据。写操作首先更新物理卷轴文件,然后异步更新索引文件。由于# S4 S6 }, l1 V# C, K/ Y$ Y
    更新索引文件是异步的,所以可能出现索引文件和物理卷轴文件不一致的情况,不
      _  x; y: k2 k# s过由于对物理卷轴文件和索引文件的操作都是追加操作,只需要扫描物理卷轴文件) T7 ]0 K* c* j& y6 l
    最后写入的几个Needle,然后补全索引文件即可。这种技术在仅支持追加的文件系: e2 d( F- D; \& T/ P
    统很常见。2 i) ]  q' q$ y3 l1 T/ d+ h
    Haystack Store存储节点采用延迟删除的回收策略,删除照片只是向卷轴中追加( G2 _" X$ d5 Z$ N: e  a
    一个带有删除标记的Needle,定时执行Compaction任务回收已删除空间。所谓
    * @! b8 Y, A1 W/ H# rCompaction操作,即将所有老数据文件中的数据扫描一遍,以保留最新一个照片的原8 ]* }7 o9 b+ R- [2 C
    则进行删除,并生成新的数据文件。
    % r, |' Q6 E0 A. g, s4.3.2 讨论
    4 a. n, t2 S# y8 r相比TFS,Haystack的一大特色就是磁盘空间回收。Blob文件在TFS中通过<Block8 e  S4 [. b5 u8 [2 m$ p- w/ v
    id,Block offset>标识,因此,不能对TFS中的数据块进行重整操作;而Haystack中的, {3 K, {+ U1 q; Q% g
    元信息只能定位到Blob文件所在的逻辑卷轴,Haystack存储节点可以根据情况对物理% u- A* H; k; ]4 w- \: R
    卷轴进行Compaction操作以回收磁盘空间。4 S) r- v5 e  |/ W/ g. s% e  E  J) d7 u
    Facebook Haystack中每个逻辑卷轴的大小为100GB,这样减少了元信息,但是增
    . B& B4 v$ r2 {  [9 G加了迁移的时间。假设限制内部网络带宽为20MB/s,那么迁移100GB的数据需要的/ ^. W+ l# t5 t% j( `* H* X" l
    时间为100GB/20MB/s=5000s,大约是一个半小时。而TFS设计的数据规模相比
    . J0 y- y4 q, y4 V! [) J) k% THaystack要小,因此,可以选择64MB的块大小,有利于负载均衡。9 }( f" p( F2 |' B, ^# U. p% V+ o
    另外,Haystack使用RAID 6,并且底层文件系统使用性能更好的XFS,淘宝TFS
    $ {" ?3 |3 [; `不使用RAID机制,文件系统使用Ext3,由应用程序负责管理多个磁盘。Haystack使用( g9 y9 y! Y- U( v/ B; _/ X% |& l
    了Akamai&Limelight的CDN服务,而淘宝已经使用自建的CDN,当然,Facebook也在
    / \" |6 C! A& S8 \" {* f: C5 P( _考虑自建CDN。
    $ b. @& A3 Q% k, x+ W* s! W- W# k  o9 X1 o* j, n

    & L: R7 @" N& k' E0 s" Y
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-4-1 14:44 , Processed in 0.415755 second(s), 59 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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