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
功能介绍企业架构、系统架构、网站架构、大规模分布式架构、高可用架构等架构讨论,以及结合互联网技术的架构调整。欢迎有想法、乐于分享的架构师交流学习。
sfs store
全称为simple file system store
,是一个应用层存储系统的抽象,其接口类似于亚马逊的s3
存储系统,对外全部提供http
接口. 满足一般的中小型私有云存储业务。
sfs store
是一个对象存储系统,对象以kv
的形式进行存储,每个对象的都有唯一标示,其唯一标示由bucket+key
来区分,比如一个名为mvpic
的bucket
,其在sfs store
中有一个对象,该对象的访问地址为http://www.mvpic.sfs.com/20193/axdffkasddd.jpg
,那么这个对象的唯一标识为mvpic/20193/axdffkasddd
.
bucket: 业务方的身份标识,如果一个用户注册一个bucket,那么在该bucket下面的所有文件都属于该用户所有。bucket
除了可以标识对象所属空间,同时也可以作为对象的默认域名,比如:用户申请了一个mvpic
的bucket
,那么对象访问默认为: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不一样,分别为mvpic
和audio
。
该系统主要有5个子系统,分别是SFSUpload、SFSDownload、SFSTranscoder、SFSResource、ImageRealTimeTranscoder
该系统以高可用、横向扩展为主
总体机构如下:
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
为对象转码服务,一般音视频都需要转码,比如高低音频码率互转。
因为音视频转码是比较耗时的任务,一半采用异步转码即可,由应用服务发送转码任务到SFSTranscoder
,SFSTranscoer
采用生产者或消费者模式,具体架构如下:
注意:
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
, 目前市面上用得比较多的开源文件存储是:Ceph
、Fastdfs
、TFS
。
- ●横向扩展
- ●跨机房容灾、同步
7. Summary
-
●这种底层容灾方案有点复杂了,一般公司更多的是做成集中式存储,也就是说所有的对象存储是同等对待的,要么全部都跨机房存储,要么就单边存储。这种集中式存储架构设计和存储部署都更加简单,更加容易维护。就是扩展性没那么强,灵活性不够。 - ●为了易于排查文件,最好服务器之间调用带上请求
id
,这样可以快定位到问题。 - ●为了防止数据同步时的数据丢失,
MQ
最好选用可持久化、可回溯且支持多机模式的消息队列系统,如:Kafka
或者RabittMQ
。 - ●应用服务器的配置会变得非常多,特别在增加集群是,很多配置都会受到影响,可以考虑使用分布式配置系统,如:
zk
、etcd
、consol
等等。 - ●如果对性能要求比较高,服务之间可以是用
rpc
方式调用,而不是是http dns
的方式,dns
控制也不灵活,有时候可能得找运维才能下线出错的机器,这样灾难恢复时间过长了。
来源:laohanlinux.github.io
原文:http://laohanlinux.github.io/2016/03/24/SFS-Store-一种简单应用存储架构/#
如有侵权或不周之处,敬请劳烦联系若飞(微信:1321113940)马上删除,谢谢!
·END·
我们都是架构师!
架构师订阅号,关注获取更多技术分享
现已开通多个微信群,有兴趣交流学习的同学
可加若飞微信:1321113940进群
合作邮箱:[email protected]
阅读
投诉
微信扫一扫
关注该公众号