SFS Store 一种简单应用存储架构

SFS Store 一种简单应用存储架构html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.6}body{-webkit-touch-callout:none;font-family:-apple-system-font,"Helvetica Neue","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;background-color:#f3f3f3;line-height:inherit}body.rich_media_empty_extra{background-color:#fff}body.rich_media_empty_extra .rich_media_area_primary:before{display:none}h1,h2,h3,h4,h5,h6{font-weight:400;font-size:16px}*{margin:0;padding:0}a{color:#607fa6;text-decoration:none}.rich_media_inner{font-size:16px;word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.rich_media_area_primary{position:relative;padding:20px 15px 15px;background-color:#fff}.rich_media_area_primary:before{content:" ";position:absolute;left:0;top:0;width:100%;height:1px;border-top:1px solid #e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0.5);transform:scaleY(0.5);top:auto;bottom:-2px}.rich_media_area_primary .original_img_wrp{display:inline-block;font-size:0}.rich_media_area_primary .original_img_wrp .tips_global{display:block;margin-top:.5em;font-size:14px;text-align:right;width:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.rich_media_area_extra{padding:0 15px 0}.rich_media_title{margin-bottom:10px;line-height:1.4;font-weight:400;font-size:24px}.rich_media_meta_list{margin-bottom:18px;line-height:20px;font-size:0}.rich_media_meta_list em{font-style:normal}.rich_media_meta{display:inline-block;vertical-align:middle;margin-right:8px;margin-bottom:10px;font-size:16px}.meta_original_tag{display:inline-block;vertical-align:middle;padding:1px .5em;border:1px solid #9e9e9e;color:#8c8c8c;border-top-left-radius:20% 50%;-moz-border-radius-topleft:20% 50%;-webkit-border-top-left-radius:20% 50%;border-top-right-radius:20% 50%;-moz-border-radius-topright:20% 50%;-webkit-border-top-right-radius:20% 50%;border-bottom-left-radius:20% 50%;-moz-border-radius-bottomleft:20% 50%;-webkit-border-bottom-left-radius:20% 50%;border-bottom-right-radius:20% 50%;-moz-border-radius-bottomright:20% 50%;-webkit-border-bottom-right-radius:20% 50%;font-size:15px;line-height:1.1}.meta_enterprise_tag img{width:30px;height:30px!important;display:block;position:relative;margin-top:-3px;border:0}.rich_media_meta_text{color:#8c8c8c}span.rich_media_meta_nickname{display:none}.rich_media_thumb_wrp{margin-bottom:6px}.rich_media_thumb_wrp .original_img_wrp{display:block}.rich_media_thumb{display:block;width:100%}.rich_media_content{overflow:hidden;color:#3e3e3e}.rich_media_content *{max-width:100%!important;box-sizing:border-box!important;-webkit-box-sizing:border-box!important;word-wrap:break-word!important}.rich_media_content p{clear:both;min-height:1em;white-space:pre-wrap}.rich_media_content em{font-style:italic}.rich_media_content fieldset{min-width:0}.rich_media_content .list-paddingleft-2{padding-left:30px}.rich_media_content blockquote{margin:0;padding-left:10px;border-left:3px solid #dbdbdb}img{height:auto!important}@media(min-device-width:375px) and (max-device-width:667px) and (-webkit-min-device-pixel-ratio:2){.mm_appmsg .rich_media_inner,.mm_appmsg .rich_media_meta,.mm_appmsg .discuss_list,.mm_appmsg .rich_media_extra,.mm_appmsg .title_tips .tips{font-size:17px}.mm_appmsg .meta_original_tag{font-size:15px}}@media(min-device-width:414px) and (max-device-width:736px) and (-webkit-min-device-pixel-ratio:3){.mm_appmsg .rich_media_title{font-size:25px}}@media screen and (min-width:1024px){.rich_media{width:740px;margin-left:auto;margin-right:auto}.rich_media_inner{padding:20px}body{background-color:#fff}}@media screen and (min-width:1025px){body{font-family:"Helvetica Neue",Helvetica,"Hiragino Sans GB","Microsoft YaHei",Arial,sans-serif}.rich_media{position:relative}.rich_media_inner{background-color:#fff;padding-bottom:100px}}.radius_avatar{display:inline-block;background-color:#fff;padding:3px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%;overflow:hidden;vertical-align:middle}.radius_avatar img{display:block;width:100%;height:100%;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%;background-color:#eee}.cell{padding:.8em 0;display:block;position:relative}.cell_hd,.cell_bd,.cell_ft{display:table-cell;vertical-align:middle;word-wrap:break-word;word-break:break-all;white-space:nowrap}.cell_primary{width:2000px;white-space:normal}.flex_cell{padding:10px 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.flex_cell_primary{width:100%;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;box-flex:1;flex:1}.original_tool_area{display:block;padding:.75em 1em 0;-webkit-tap-highlight-color:rgba(0,0,0,0);color:#3e3e3e;border:1px solid #eaeaea;margin:20px 0}.original_tool_area .tips_global{position:relative;padding-bottom:.5em;font-size:15px}.original_tool_area .tips_global:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid #dbdbdb;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(0.5);transform:scaleY(0.5)}.original_tool_area .radius_avatar{width:27px;height:27px;padding:0;margin-right:.5em}.original_tool_area .radius_avatar img{height:100%!important}.original_tool_area .flex_cell_bd{width:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal}.original_tool_area .flex_cell_ft{font-size:14px;color:#8c8c8c;padding-left:1em;white-space:nowrap}.original_tool_area .icon_access:after{content:" ";display:inline-block;height:8px;width:8px;border-width:1px 1px 0 0;border-color:#cbcad0;border-style:solid;transform:matrix(0.71,0.71,-0.71,0.71,0,0);-ms-transform:matrix(0.71,0.71,-0.71,0.71,0,0);-webkit-transform:matrix(0.71,0.71,-0.71,0.71,0,0);position:relative;top:-2px;top:-1px}.weui_loading{width:20px;height:20px;display:inline-block;vertical-align:middle;-webkit-animation:weuiLoading 1s steps(12,end) infinite;animation:weuiLoading 1s steps(12,end) infinite;background:transparent url(data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iciIgd2lkdGg9JzEyMHB4JyBoZWlnaHQ9JzEyMHB4JyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiBmaWxsPSJub25lIiBjbGFzcz0iYmsiPjwvcmVjdD4KICAgIDxyZWN0IHg9JzQ2LjUnIHk9JzQwJyB3aWR0aD0nNycgaGVpZ2h0PScyMCcgcng9JzUnIHJ5PSc1JyBmaWxsPScjRTlFOUU5JwogICAgICAgICAgdHJhbnNmb3JtPSdyb3RhdGUoMCA1MCA1MCkgdHJhbnNsYXRlKDAgLTMwKSc+CiAgICA8L3JlY3Q+CiAgICA8cmVjdCB4PSc0Ni41JyB5PSc0MCcgd2lkdGg9JzcnIGhlaWdodD0nMjAnIHJ4PSc1JyByeT0nNScgZmlsbD0nIzk4OTY5NycKICAgICAgICAgIHRyYW5zZm9ybT0ncm90YXRlKDMwIDUwIDUwKSB0cmFuc2xhdGUoMCAtMzApJz4KICAgICAgICAgICAgICAgICByZXBlYXRDb3VudD0naW5kZWZpbml0ZScvPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyM5Qjk5OUEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSg2MCA1MCA1MCkgdHJhbnNsYXRlKDAgLTMwKSc+CiAgICAgICAgICAgICAgICAgcmVwZWF0Q291bnQ9J2luZGVmaW5pdGUnLz4KICAgIDwvcmVjdD4KICAgIDxyZWN0IHg9JzQ2LjUnIHk9JzQwJyB3aWR0aD0nNycgaGVpZ2h0PScyMCcgcng9JzUnIHJ5PSc1JyBmaWxsPScjQTNBMUEyJwogICAgICAgICAgdHJhbnNmb3JtPSdyb3RhdGUoOTAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNBQkE5QUEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgxMjAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNCMkIyQjInCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgxNTAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNCQUI4QjknCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgxODAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNDMkMwQzEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgyMTAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNDQkNCQ0InCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgyNDAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNEMkQyRDInCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgyNzAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNEQURBREEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgzMDAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNFMkUyRTInCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgzMzAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0Pgo8L3N2Zz4=) no-repeat;-webkit-background-size:100%;background-size:100%}@-webkit-keyframes weuiLoading{0%{-webkit-transform:rotate3d(0,0,1,0deg)}100%{-webkit-transform:rotate3d(0,0,1,360deg)}}@keyframes weuiLoading{0%{-webkit-transform:rotate3d(0,0,1,0deg)}100%{-webkit-transform:rotate3d(0,0,1,360deg)}}.gif_img_wrp{display:inline-block;font-size:0;position:relative;font-weight:400;font-style:normal;text-indent:0;text-shadow:none 1px 1px rgba(0,0,0,0.5)}.gif_img_wrp img{min-height:120px;min-width:120px;vertical-align:top}.gif_img_tips{background:rgba(0,0,0,0.6)!important;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=‘#99000000‘,endcolorstr = ‘#99000000‘);border-top-left-radius:1.2em 50%;-moz-border-radius-topleft:1.2em 50%;-webkit-border-top-left-radius:1.2em 50%;border-top-right-radius:1.2em 50%;-moz-border-radius-topright:1.2em 50%;-webkit-border-top-right-radius:1.2em 50%;border-bottom-left-radius:1.2em 50%;-moz-border-radius-bottomleft:1.2em 50%;-webkit-border-bottom-left-radius:1.2em 50%;border-bottom-right-radius:1.2em 50%;-moz-border-radius-bottomright:1.2em 50%;-webkit-border-bottom-right-radius:1.2em 50%;line-height:2.3;padding:0 1em;font-size:11px;color:#fff;text-align:center;position:absolute;bottom:10px;left:10px}.gif_img_tips i{vertical-align:middle;margin:-0.2em .73em 0 -2px}.gif_img_play_arrow{display:inline-block;width:0;height:0;border-width:8px;border-style:dashed;border-color:transparent;border-right-width:0;border-left-color:#fff;border-left-style:solid;border-width:5px 0 5px 8px}.gif_img_loading{width:14px;height:14px}i.gif_img_loading{margin-left:-4px}.rich_media_global_msg{position:fixed;top:0;left:0;right:0;padding:1em 35px 1em 15px;z-index:1;background-color:#c6e0f8;color:#8c8c8c;font-size:13px}.rich_media_global_msg .icon_closed{position:absolute;right:15px;top:50%;margin-top:-5px;line-height:300px;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);background:transparent url(/mmbizwap/zh_CN/htmledition/images/icon/appmsg/icon_appmsg_msg_closed_sprite.2x.png) no-repeat 0 0;width:11px;height:11px;vertical-align:middle;display:inline-block;-webkit-background-size:100% auto;background-size:100% auto}.rich_media_global_msg .icon_closed:active{background-position:0 -17px}.preview_appmsg .rich_media_title{margin-top:1.9em}@media screen and (min-width:1024px){.rich_media_global_msg{position:relative;margin:0 20px}.preview_appmsg .rich_media_title{margin-top:0}}

SFS Store 一种简单应用存储架构

2016-07-26

RG
                                               架构师
                       架构师

架构师
                               

微信号JiaGouX

功能介绍企业架构、系统架构、网站架构、大规模分布式架构、高可用架构等架构讨论,以及结合互联网技术的架构调整。欢迎有想法、乐于分享的架构师交流学习。


                               

架构师(JiaGouX)
我们都是架构师!

sfs store 全称为simple file system store,是一个应用层存储系统的抽象,其接口类似于亚马逊的s3存储系统,对外全部提供http接口. 满足一般的中小型私有云存储业务。

sfs store 是一个对象存储系统,对象以kv的形式进行存储,每个对象的都有唯一标示,其唯一标示由bucket+key来区分,比如一个名为mvpicbucket,其在sfs store中有一个对象,该对象的访问地址为http://www.mvpic.sfs.com/20193/axdffkasddd.jpg,那么这个对象的唯一标识为mvpic/20193/axdffkasddd.

bucket: 业务方的身份标识,如果一个用户注册一个bucket,那么在该bucket下面的所有文件都属于该用户所有。bucket除了可以标识对象所属空间,同时也可以作为对象的默认域名,比如:用户申请了一个mvpicbucket,那么对象访问默认为:http://mvpic.sfs.com/key.ext,当然用户可以配置访问域名。

key: bucket下的文件唯一标识,也可以把一个文件抽象为一个对象,而该对象的唯一标示就是这个key。 在同一个bucket下,不会出现相同的对象,但是不同的bucket下对象是可以相同的,比如:”http://www.mvpic.sfs.com/20193/axdffkasddd.jpg“ 和 “http://www.audio.sfs.com/20193/axdffkasddd.jpg“ 虽然他们的key一样,都是20193/axdffkasddd,但是他们的bucket不一样,分别为mvpicaudio

该系统主要有5个子系统,分别是SFSUploadSFSDownloadSFSTranscoderSFSResourceImageRealTimeTranscoder


该系统以高可用、横向扩展为主

总体机构如下:

1. SFSUpload



SFSUplpad是控制文件上传调度的服务。

如:一个业务方需要上传一个文件,那么其上传的接口可简化表示为:


curl -XPOST “http://upload-sfs.com/bucket/<bucketName>/key/<key>.ext”-d $data

如果调用方没有指定该对象的key,那么服务也会自动生成一个key并返回给调用方,这个key的生成算法为:randKey=md5(bucket+timeStamp+value),则该对象的访问地址为http://bucketName.fs.kugou.com/randKey?kge=13123123&kgtoken=xxxxxxxxxxxxx

除此之外,SFSUpload还支持断点上传的逻辑。

SFSUpload断点上传

对于文件存储系统,断点续传是必不可少的,特别是在UGC业务中。为了提高断点上传的质量,一般断点上传都是分散部署的,也就是一个文件可以打散上传CDN,然后由CDN上传回到源站,这是一种比较典型的做法。既然是打散上传的,那么每一块文件就会落在不同的服务器上,为了能够整合这些分散的文件,记录每一块文件上传信息是必须的。一种简单的做法就是,当文件回源到服务端时,服务端会把相同的文件的不同块都转发到第一块所在的服务器上,第一块的服务器负者文件的上传纠正和文件的合成。

其架构可以简化为下图:

上传流程:


客户端---》最近的CDN接入点---》源站服务器

|

|

|

??

底层存储系统

需要注意的地方以及需要说明的地方:
1、cache层是非重要的一个主键,应该要考虑容灾,因为一般的上传QPS都不会很高,所以cache 可采用Redis Sentinel架构,在每一台服务器机上服用部署即可
2、 如果是特别大的文件,源站上传到底层存储系统之间的链路也需要注意,按照本人的经验来说,期间出错的概率也是不少的。在源站到底层存储系统传输过程是非常耗时的,如果是客户端上传的话,在上传到最后一块时,其等待的时间出现超时的现象明显上升。如果可以的话,上传接口应该支持异步和同步操作,一般的UGC的业务可能都不会接受异步,他们更多的是想做到实时,如果是这样的话,可以考虑在源站服务器到底层存储系统之间做优化。比如,fastdfs文件存储系统,它是支持文件Append和Modify操作,这样,当客户端每上传一块文件,源站服务器应该就直接把该块的文件内容上传到fastdfs中去,其相应时间会得到大大的提高。
3、由于是文件的上传,所以对应用来说,需要注意一下内存和io相关的优化,比如使用内存储来降低内存的使用,如果是大文件的时候,还要考虑把使用带缓存区IO方式操作文件;在IO上需要注意一下文件的脏页影响,大量的更新、删除、新建文件必然会有造成这些负效应。
4、该架构的源站服务器满足横向扩展和高可用(当然源站服务器值保存一份数据,如果刚好该源站服务器挂了,那么只能重新上传了);cache支持高可用,但是暂时不支持横向扩展,可以考虑使用cache cluster模式来达到横向扩展的效果

5、文件上传后,需要根据bucket的属性来决定是否需要跨机房容灾,如果需要的话,SFSUpload还需网同步队列发送同步数据的任务

2. SFSDownload、ImageRealTimeTranscoder



SFSDownload:访问调度服务,主要控制文件的访问调度和访问鉴权。

ImageRealTimeTranscoder:图片转码服务,负责图片的实时转码服务。

2.1 SFSDownload

2.1.1 AccessController

AccessController为访问的控制模块,主要用于检测token是否有效以及一些黑白名单的工作,比如:refer的过滤、非法ip过滤、防刷限流、访问域名限定等等。

其中bucket一般分为公有和私有,如果是公有的话,就不用带url token了,如果是私有的话,需要带url token,关于url token可参照如下的设计:

url分为永久和有时效性两种,所以url应该携带一个时效的参数,比如:sfstoken=e:key,其中e为一个时间戳参数,这个时间戳为该token下的url的有效访问时间,一旦时间超过,该url将不能再被访问,需要生产新的url

其中token key生产算法可以简化为:SHA1(bucket+e+bucketSecretKey)

bucketSecretKey:云存储下发给用户的秘钥。

2.1.2 AccessDispatcher

AccessDispatcker为访问调度模块,AccessDispatcker首先会到golbal database获取到对象的所有下载连接,然后判断该文件类型是否为图片类型.

  • ●如果是图片类型且需要作图,那么以同步的方式,把下载连接和作图策略(如:等比缩略,缩略尺寸等信息)发给ImageRealTimeTranscoder服务,ImageRealTimeTranscoder把作好的图返回给AccessDispatcher.
  • ●如果不是图片类型,则马上到底层存储系统下载文件,把下载好的文件及时返回给客户端。

注意:

1、global database可能会返回对个下载链接,因为这个对象为了容灾,可能不仅存储于一个集群中,可能存在在多个集群中,当然这些集群应该是跨机房。这时候,AccessDispatcker应该要选择最优的下载链接,如果这些链接都不是本机房的,可能还需要经过302跳转。

2、SFSDownload的qps会比较高,这对象的元数据必须要缓存,并且缓存要做到横向扩中,还要考虑一下缓存失效的情况。


2.2.1 ImageRealTimeTranscoder

ImageReadlTimeTranscoder为图片实时作图服务,可采用imagemagick+lua+openresty这套成熟的方案。

3. SFSTranscoder



SFSTranscoder为对象转码服务,一般音视频都需要转码,比如高低音频码率互转。

因为音视频转码是比较耗时的任务,一半采用异步转码即可,由应用服务发送转码任务到SFSTranscoderSFSTranscoer采用生产者或消费者模式,具体架构如下:

注意:

1、可以采用回调的模式来进行异步转码,也就是说应用服务器除了提供转码任务外,还需要提供一个转码成功后的回调地址,转码服务转码成功后,会把需要转码的对象key和转码后对象的key回调给应用服务器。

2、如果有必要,也需要提供一个转码进度的查询接口。

4. SFSResource



SFSResource :云存储管理服务,主要负责对象的管理,比如:删除对象、屏蔽对象、删除bucket、增加bucket、增加bucket的下载域名、现在bucket的上传容量以及对象大小、清理缓存等等任务.

5. Meta Data



Meta Data:对象元数据存储。

  • ●水平扩容
  • ●跨机房容灾、同步


5.1 Meta Data Design

  • t_obj_id
字段名 字段类型 说明
bucket string 业务空间
key string 对象id
  • t_bucket_info
字段名 字段类型 业务空间
bucket string 业务空间
domain string 空间访问域名,以逗号分隔,如:mvpic-sfs.com,mvpic2-sfs.com
access string 空间访问属性
cluster_ids string 底层存储集群id,表示可以空间可以使用的存储集群编号。
total int 空间容量最大值
  • t_obj_info
字段名 字段类型 字段说明
obj_id string 对象唯一id,SHA1(bucket+key)
edit_time string 对象更新时间
extend_name string 对象后缀属性
size int64 对象大小
access string 对象访问属性
mime string 对象媒体属性
obj_md5 string 对象的内容md5值
obj_store_id string 对象的实际存储路径,可能有多个,以逗号区分,如:clusterid/bucket/key:clustered/bucketid/key
  • t_cluster_info
字段名 字段类型
cluster_id int 底层存储的集群id
cluster_type string 比如:tfs 、fastdfs
flag uint8 bitmap类型:x:x:x:x:x:可写:可读,暂时使用最后两位

6. File Store



File Store即底层存储服务,也是图片中的Cloud Store, 目前市面上用得比较多的开源文件存储是:CephFastdfsTFS

  • ●横向扩展
  • ●跨机房容灾、同步

7. Summary


  • ●这种底层容灾方案有点复杂了,一般公司更多的是做成集中式存储,也就是说所有的对象存储是同等对待的,要么全部都跨机房存储,要么就单边存储。这种集中式存储架构设计和存储部署都更加简单,更加容易维护。就是扩展性没那么强,灵活性不够。
  • ●为了易于排查文件,最好服务器之间调用带上请求id,这样可以快定位到问题。
  • ●为了防止数据同步时的数据丢失,MQ最好选用可持久化、可回溯且支持多机模式的消息队列系统,如:Kafka或者RabittMQ
  • ●应用服务器的配置会变得非常多,特别在增加集群是,很多配置都会受到影响,可以考虑使用分布式配置系统,如:zketcdconsol等等。
  • ●如果对性能要求比较高,服务之间可以是用rpc方式调用,而不是是http dns的方式,dns控制也不灵活,有时候可能得找运维才能下线出错的机器,这样灾难恢复时间过长了。

来源:laohanlinux.github.io

原文:http://laohanlinux.github.io/2016/03/24/SFS-Store-一种简单应用存储架构/#

如有侵权或不周之处,敬请劳烦联系若飞(微信:1321113940)马上删除,谢谢!


·END·

架构师

我们都是架构师!

架构师订阅号,关注获取更多技术分享


现已开通多个微信群,有兴趣交流学习的同学

可加若飞微信:1321113940进群

合作邮箱:[email protected]

阅读

投诉


                       

微信扫一扫
关注该公众号

时间: 2024-10-12 16:14:47

SFS Store 一种简单应用存储架构的相关文章

HTML5的两种简单的存储方式

1.Application Cache HTML5引入应用缓存,意味着web应用可以进行缓存,即使在没有网络的情况下也能使用. application cache有三个特点 离线浏览 已缓存的资源加载速度更快 减少服务器负载,浏览器将只从服务器下载更新过或更改过的资源 使用方法就是在 html标签中添加一个manifest属性 每个指定了 manifest 的页面在用户对其访问时都会被缓存.如果未指定 manifest 属性,则页面不会被缓存(除非在 manifest 文件中直接指定了该页面).

一种简单的CQRS架构设计及其实现

一.为什么要实践领域驱动? 近一年时间我一直在思考一个问题:"如何设计一个松耦合.高伸缩性.易于维护的架构?".之所以有这样的想法是因为我接触的不少项目都是以数据库脚本来实现业务逻辑.在项目初期使用这样的方式野蛮开发似乎显得很高效,但是大家其实都清楚,正是这样的项目让大家拖入了加班的深渊.这种系统维护性差,无法扩展,无法编写有效的单元测试,质量基本没有保证. 一个符合我心理预期的架构,一定不是靠使用某个代码生成工具来完成的,这样的项目把码农培养成了彻头彻尾没有思想的个体.一个有追求的码

简单区别存储与主机连接的三种模式DAS/SAN/NAS

一般来说,存储(Storage)与主机(Host)连接模式有三种:SAN(Storage Area Network)存储区域网络,DAS(Direct-Attached Storage)直连式存储,NAS(Network Attached Storage)网络附属存储.此三种模式分别针对不同的应用场景. 从与主机连接的通道类别来看,DAS采用SCSI通道直接连接主机,但随着服务器CPU的处理能力的增强,存储硬盘空间的不断加大,这个沿用了四十多年的SCSI通道,已成为IO瓶颈,其最高不超过80MB

从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构

Microsoft.AspNet.Identity简介 Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMembership(在MVC 4中使用)都有所不同. Microsoft.AspNet.Identity是符合微软开放Owin标准里面Security标准的一种实现.且在MVC 5中默认使用EntityFramework作为Microsoft.A

HTML5的五种客户端离线存储方案

最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于HT for Web写了个综合的实例,分别利用了Cookie.WebStorage.IndexedDB以及FileSystem四种本地离线存储方式,对燃气监控系统的表计位置.朝向.开关以及表值等信息做了CURD的存取操作. http://www.hightopo.com/guide/guide/core/serialization/examples/example_exportimport.html HTM

存储架构

存储架构 web应用从单点向高并发架构演变时往往遇到最大的问题就是数据库的分布式存储.因为web应用本身就可以集群部署,但其所使用的数据库确是单点的.如果一个web应用开始的时候没有考虑数据库的分布式架构,那么等到要进行数据库集群改造时会发现困难重重,此时通常的做法是将原系统拆分成多个子系统,然后每个子系统访问一个数据库,这几乎重写了整个系统(如果这还不能满足需求,大型企业接下来会增加数据存储总线).很多厂商都是这么做的,包括淘宝.如果你开始你能够考虑到数据库集群,并且这种集群的设置并不增加开发

大道唯简----存储架构演变之剖析

随着云计算和大数据的发展,传统的基于主机的存储架构已逐渐向网络化.虚拟化.海量云存储发展,从分散走向集中,存储的性能.效率和扩展性.灵活性被企业普遍关注.从更高层次看,存储不仅需要提供数据的管理.数据复制.快照.镜像.迁移等例行性事物,更要能处理数据的灾难恢复.数据一致性.虚拟化融合.弹性计算与资源扩展等工作,这些都依赖于良好的存储架构来满足. 结合企业的IT建设,我们可以把存储架构的演变归纳为三个阶段. 第一个阶段是存储基本架构的演进过程. 在企业建立初期,用户的数据规模并不大,存储需求也相对

当前一种先进实用的架构设计

目录 1系统架构图...1 2架构设计...3 2.1项目开发环境...3 2.2运行环境要求:...3 2.3 服务器架构平台:...4 2.4.架构逻辑设计...5 2.4.1 LVS+KEEPLIVED+SQUID+HAPROXY+JBOSS集群...5 2.4.2mysql集群...6 2.4.3fastdfs图片服务器集群...8 2.4.4acveMQ服务器集群...8 3 架构剖析...10 3.1负载均衡器解析...10 3.2 lvs解析...11 3.3keeplived解析

微服务框架的存储架构

web应用从单点向高并发架构演变时往往遇到最大的问题就是数据库的分布式存储.因为web应用本身就可以集群部署,但其所使用的数据库确是单点的.如果一个web应用开始的时候没有考虑数据库的分布式架构,那么等到要进行数据库集群改造时会发现困难重重,此时通常的做法是将原系统拆分成多个子系统,然后每个子系统访问一个数据库,这几乎重写了整个系统(如果这还不能满足需求,大型企业接下来会增加数据存储总线).很多厂商都是这么做的,包括淘宝.如果你开始你能够考虑到数据库集群,并且这种集群的设置并不增加开发工作量和难