基于mogileFS搭建分布式文件系统海量小文件的存储利器
一、分布式文件系统
1。简介
分布式文件系统(DistributedFileSystem)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,对等特性允许一些系统扮演客户机和服务器的双重角色。例如,用户可以发表一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样。
当下我们处在一个互联网飞速发展的信息社会,在海量并发连接的驱动下每天所产生的数据量必然以几何方式增长,随着信息连接方式日益多样化,数据存储的结构也随着发生了变化。在这样的压力下使得人们不得不重新审视大量数据的存储所带来的挑战,例如:数据采集、数据存储、数据搜索、数据共享、数据传输、数据分析、数据可视化等一系列问题。
传统存储在面对海量数据存储表现出的力不从心已经是不争的事实,例如:纵向扩展受阵列空间限制、横向扩展受交换设备限制、节点受文件系统限制。
然而分布式存储的出现在一定程度上有效的缓解了这一问题,之所以称之为缓解是因为分布式存储在面对海量数据存储时也并非十全十美毫无压力,依然存在的难点与挑战例如:节点间通信、数据存储、数据空间平衡、容错、文件系统支持等一系列问题仍处在不断摸索和完善中。
2。分布式文件系统的一些解决方案
GoogleFilesystem适合存储海量大个文件,元数据存储与内存中
HDFS(HadoopFilesystem)GFS的山寨版,适合存储大量大个文件
TFS(TaobaoFilesystem)淘宝的文件系统,在名称节点上将元数据存储与关系数据库中,文件数量不在受限于名称节点的内容空间,可以存储海量小文件LustreOracle开发的企业级分布式系统,较重量级MooseFS基于FUSE的格式,可以进行挂载使用MogileFS
擅长存储海量的小数据,元数据存储与关系型数据库中二、MogileFS
1。简介
MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发,Danga团队开发了包括Memcached、MogileFS、Perlbal等不错的开源项目:(注:Perlbal是一个强大的Perl写的反向代理服务器)。MogileFS是一个开源的分布式文件系统。
目前使用MogileFS的公司非常多,比如国外的一些公司,日本前几名的公司基本都在使用这个。
国内所知道的使用MogileFS的公司有图片托管网站yupoo又拍,digg,土豆,豆瓣,1号店,大众点评,搜狗,安居客等等网站。基本很多网站容量,图片都超过30T以上。
2。MogileFS特性
1)应用层提供服务,不需要使用核心组件
2)无单点失败,主要有三个组件组成,分为tracker(跟踪节点)、mogstore(存储节点)、database(数据库节点)
3)自动复制文件,复制文件的最小单位不是文件,而是class
4)传输中立,无特殊协议,可以通过NFS或HTTP实现通信
5)简单的命名空间:没有目录,直接存在与存储空间上,通过域来实现
6)不用共享任何数据
3。MogileFS的组成
1)Tracker跟踪器,调度器
MogileFS的核心,是一个调度器,mogilefsd进程就是trackers进程程序,trackers的主要职责有:删除数据、复制数据、监控、查询等等。这个是基于事件的(eventbased)父进程消息总线来管理所有来之于客户端应用的交互(requestingoperationstobeperformed),包括将请求负载平衡到多个queryworkers中,然后让mogilefs的子进程去处理。
mogadm,mogtool的所有操作都要跟trackers打交道,Client的一些操作也需要定义好trackers,因此最好同时运行多个trackers来做负载均衡。trackers也可以只运行在一台机器上,使用负载均衡时可以使用搞一些简单的负载均衡解决方案,如haproxy,lvs,nginx等,
tarcker的配置文件为etcmogilefsmogilefsd。conf,监听在TCP的7001端口
2)Database数据库部分
主要用来存储mogilefs的元数据,所有的元数据都存储在数据库中,因此,这个数据相当重要,如果数据库挂掉,所有的数据都不能用于访问,因此,建议应该对数据库做高可用
3)mogstored存储节点
数据存储的位置,通常是一个HTTP(webDAV)服务器,用来做数据的创建、删除、获取,任何WebDAV服务器都可以,不过推荐使用mogstored。mogilefsd可以配置到两个机器上使用不同端口mogstored来进行所有的DAV操作和流量,IO监测,并且你自己选择的HTTP服务器(默认为perlbal)用来做GET操作给客户端提供文件。
典型的应用是一个挂载点有一个大容量的SATA磁盘。只要配置完配置文件后mogstored程序的启动将会使本机成为一个存储节点。当然还需要mogadm这个工具增加这台机器到Cluster中。
配置文件为etcmogilefsmogstored。conf,监听在TCP的7500端口
4。基本工作流程
应用程序请求打开一个文件(通过RPC通知到tracker,找到一个可用的机器)。做一个createopen请求。
tracker做一些负载均衡(loadbalancing)处理,决定应该去哪儿,然后给应用程序一些可能用的位置。
应用程序写到其中的一个位置去(如果写失败,他会重新尝试并写到另外一个位置去)。
应用程序(client)通过createclose告诉tracker文件写到哪里去了。
tracker将该名称和域命的名空间关联(通过数据库来做的)
tracker,在后台,开始复制文件,知道他满足该文件类别设定的复制规则
然后,应用程序通过getpaths请求domainkey(keyfilename)文件,tracker基于每一位置的IO繁忙情况回复(在内部经过databasememcacheetc等的一些抉择处理),该文件可用的完整URLs地址列表。
应用程序然后按顺序尝试这些URL地址。(tracker’持续监测主机和设备的状态,因此不会返回死连接,默认情况下他对返回列表中的第一个元素做双重检查,除非你不要他这么做。。)三、Nginxmogilefs的实现
1。拓扑图
说明:1。用户通过URL访问前端的nginx
2。nginx根据特定的挑选算法,挑选出后端一台tracker来响应nginx请求
3。tracker通过查找database数据库,获取到要访问的URL的值,并返回给nginx
4。nginx通过返回的值及某种挑选算法挑选一台mogstored发起请求
5。mogstored将结果返回给nginx
6。nginx构建响应报文返回给客户端
2。ip规划
角色运行软件ip地址反向代理nginx192。168。1。201存储节点与调度节点1
mogilefs192。168。1。202存储节点与调度节点2
mogilefs192。168。1。203数据库节点
MariaDB192。168。1。204
3。数据库的安装操作并为授权
关于数据库的编译安装,请参照本人相关博文http:wangfeng7399。blog。51cto。com35180311393146,本处将不再累赘,本处使用的为yum源的安装方式安装mysqlmysqlgt;grantallon。toroot192。168。1。identifiedbywangfeng7399;
QueryOK,0rowsaffected(0。00sec)
mysqlgt;grantallonmgdb。tomguser192。168。1。identifiedbywangfeng7399;
QueryOK,0rowsaffected(0。00sec)
mysqlgt;flushprivileges;
QueryOK,0rowsaffected(0。00sec)
4。安装mogilefs。安装mogilefs,可以使用yum安装,也可以使用编译安装,本处通过yum安装〔rootnode2download〕ls
MogileFSServer2。462。el6。noarch。rpm
MogileFSServermogilefsd2。462。el6。noarch。rpm
MogileFSServermogstored2。462。el6。noarch。rpm
MogileFSUtils2。191。el6。noarch。rpm
perlMogileFSClient1。141。el6。noarch。rpm
perlNetNetmask1。90158。el6。noarch。rpm
perlPerlbal1。781。el6。noarch。rpm
〔rootnode2download〕yuminstall。rpmperlIOAIOy
5。初始化数据库〔rootnode2〕mogdbsetupdbhost192。168。1。204dbnamemgdbdbrootuserrootdbrootpasswangfeng7399dbusermguserdbpasswangfeng7399yes
mysqlgt;showtables;
Tablesinmgdb
checksum
class
device
domain
file
fileon
fileoncorrupt
filetodelete
filetodelete2
filetodeletelater
filetoqueue
filetoreplicate
fscklog
host
serversettings
tempfile
unreachablefids
可以看到在数据库中创建了一些表
6。修改配置文件,启动服务修改etcmogilefsmogilefsd。conf
daemonize1是否已守护进程模式启动mogilefsd
pidfilevarrunmogilefsdmogilefsd。pidpiad文件的存放位置
dbdsnDBI:mysql:mgdb:host192。168。1。204数据库的存放位置
dbusermguser数据库的用户名
dbpasswangfeng7399数据库的密码
listen0。0。0。0:7001监听的地址
〔rootnode2〕sstnlgrep7001
LISTEN0128:7001:
修改etcmogilefsmogstored。conf
maxconns10000最大连接数
httplisten0。0。0。0:7500http监听的地址
mgmtlisten0。0。0。0:7501mgm监听的地址
docrootmgdata数据的存放位置
〔rootnode2〕mkdirmgdatadev1
〔rootnode2〕chownRmogilefs。mogilefsmgdata
〔rootnode2〕chownmogilefs。mogilefsetcmogilefsmogstored。conf
〔rootnode2〕sstnl
StateRecvQSendQLocalAddress:PortPeerAddress:Port
LISTEN0128:7500:
LISTEN0128:7501:
7。配置mogilefs〔rootnode2〕mogadm
Usage:(enteranycommandprefix,leavingoffoptions,forfurtherhelp)
mogadmcheckCheckthestateoftheMogileFSworld。
mogadmstatsShowMogileFSsystemstatistics。(DEPRECATED:usemogstatsinstead)
mogadmhost。。。
hostadd。。。AddahosttoMogileFS。
hostdelete。。。Deleteahost。
hostlistListallhosts。
hostmark。。。Changethestatusofahost。(equivalenttomodifystatus)
hostmodify。。。Modifyahostsproperties。
mogadmdevice。。。
deviceadd。。。Addadevicetoahost。
devicelist。。。Listalldevices,foreachhost。
devicemark。。。Markadeviceas{alive,dead,down,drain,readonly}
devicemodify。。。Modifyadevicesproperties。
devicesummary。。。Listthesummaryofdevices,foreachhost。
mogadmdomain。。。
domainadd。。。Addadomain(namespace)
domaindelete。。。Deleteadomain。
domainlistListallhosts。
mogadmclass。。。
classadd。。。Addafileclasstoadomain。
classdelete。。。Deleteafileclassfromadomain。
classlistListallclasses,foreachdomain。
classmodify。。。Modifypropertiesofafileclass。
mogadmslave。。。
slaveadd。。。Addaslavenodeforstoreusage
slavedelete。。。Deleteaslavenodeforstoreusage
slavelistListcurrentstoreslavenodes。
slavemodify。。。Modifyaslavenodeforstoreusage
mogadmfsck。。。
fsckclearlogClearthefscklog
fsckprintlogDisplaythefscklog
fsckreset。。。Resetfsckpositionbacktothebeginning
fsckstartStart(orresume)backgroundfsck
fsckstatusShowfsckstatus
fsckstopStop(pause)backgroundfsck
fscktaillogTailthefscklog
mogadmrebalance。。。
rebalancepolicy。。。Addoradjustthecurrentpolicy
rebalanceresetResetanexistingpolicy
rebalancesettingsDisplayrebalancesettings
rebalancestartStartarebalancejob
rebalancestatusShowstatusofcurrentrebalancejob
rebalancestopStoparebalancejob
rebalancetestShowwhatdevicesthecurrentpolicywouldmatch
mogadmsettings。。。
settingslistListallserversettings
settingsset。。。Setserversettingkeytovalue。
添加存储主机〔rootnode2〕mogadmtrackers192。168。1。202:7001hostadd192。168。1。202ip192。168。1。202statusalive
〔rootnode2〕mogadmtrackers192。168。1。202:7001hostlist
192。168。1。202〔1〕:alive
IP:192。168。1。202:7500
添加存储设备〔rootnode2〕mogadmtrackers192。168。1。202:7001deviceadd192。168。1。2021
〔rootnode2〕mogadmtrackers192。168。1。202:7001devicelist
192。168。1。202〔1〕:alive
used(G)free(G)total(G)weight()
dev1:alive0。39318。29318。686100
添加域〔rootnode2〕mogadmtrackers192。168。1。202:7001domainaddimgs
〔rootnode2〕mogadmtrackers192。168。1。202:7001domainaddfiles
〔rootnode2〕mogadmtrackers192。168。1。202:7001domainlist
domainclassmindevcountreplpolicyhashtype
filesdefault2MultipleHosts()NONE
imgsdefault2MultipleHosts()NONE
添加class〔rootnode2〕mogadmtrackers192。168。1。202:7001classaddimgsclass1
〔rootnode2〕mogadmtrackers192。168。1。202:7001classaddimgsclass2
〔rootnode2〕mogadmtrackers192。168。1。202:7001classaddfilesclass1
〔rootnode2〕mogadmtrackers192。168。1。202:7001classaddfilesclass2
〔rootnode2〕mogadmtrackers192。168。1。202:7001domainlist
domainclassmindevcountreplpolicyhashtype
filesclass12MultipleHosts()NONE
filesclass22MultipleHosts()NONE
filesdefault2MultipleHosts()NONE
imgsclass12MultipleHosts()NONE
imgsclass22MultipleHosts()NONE
imgsdefault2MultipleHosts()NONE
8。配置192。168。1。203的mogilefs。切记不要初始化数据库,配置应该与192。168。1。202一样〔rootnode3download〕mogadmtrackers192。168。1。203:7001hostadd192。168。1。203ip192。168。1。203statusalive
〔rootnode3download〕mogadmtrackers192。168。1。203:7001hostlist
192。168。1。202〔1〕:alive
IP:192。168。1。202:7500
192。168。1。203〔2〕:alive
IP:192。168。1。203:7500
添加存储节点
〔rootnode3download〕mkdirmgdatadev2
〔rootnode3download〕chownmogilefs。mogilefsRmgdatadev2
〔rootnode3download〕mogadmtrackers192。168。1。203:7001deviceadd192。168。1。2032
〔rootnode3download〕mogadmtrackers192。168。1。203:7001domainlist
domainclassmindevcountreplpolicyhashtype
filesclass12MultipleHosts()NONE
filesclass22MultipleHosts()NONE
filesdefault2MultipleHosts()NONE
imgsclass12MultipleHosts()NONE
imgsclass22MultipleHosts()NONE
imgsdefault2MultipleHosts()NONE
只需要添加主机就可以看到在其他主机上配置的内容
9。尝试上传数据,获取数据,客户端读取数据
上传数据,在任何一个节点上传都可以〔rootnode3download〕moguploadtrackers192。168。1。203:7001domainimgskey2。jpgfileroot1。jpg
获取数据〔rootnode3download〕mogfileinfotrackers192。168。1。203:7001domainimgskey2。jpg
file:2。jpg
class:default
devcount:2
domain:imgs
fid:4
key:2。jpg
length:49809
http:192。168。1。203:7500dev200000000000000004。fid
http:192。168。1。202:7500dev100000000000000004。fid
客户端查看数据
我们可以通过任何一个节点查看到数据三、与nginx结合
要想nginx能够实现对后端trucker的反向代理,必须结合第三方模块来实现
1。编译安装nginx〔rootnode1〕tarxfnginx1。6。0。tar。gz
〔rootnode1〕tarxfnginxmogilefsmodule1。0。4。tar。gz
〔rootnode1〕useraddrnginx
〔rootnode1〕cdnginx1。6。0
〔rootnode1nginx1。6。0〕。configureprefixusrlocalnginxsbinpathusrlocalnginxsbinnginxconfpathetcnginxnginx。conferrorlogpathvarlognginxerror。loghttplogpathvarlognginxaccess。logpidpathvarrunnginxnginx。pidlockpathvarlocknginx。lockusernginxgroupnginxwithhttpsslmodulewithhttpflvmodulewithhttpstubstatusmodulewithhttpgzipstaticmodulehttpclientbodytemppathvartmpnginxclienthttpproxytemppathvartmpnginxproxyhttpfastcgitemppathvartmpnginxfcgihttpuwsgitemppathvartmpnginxuwsgihttpscgitemppathvartmpnginxscgiwithpcreaddmodule。。nginxmogilefsmodule1。0。4
〔rootnode1nginx1。6。0〕makeamp;amp;makeinstall
2。准备启动脚本!binbash
nginxthisscriptstartsandstopsthenginxdaemon
chkconfig:8515
description:NginxisanHTTP(S)server,HTTP(S)reverse
proxyandIMAPPOP3proxyserver
processname:nginx
config:etcnginxnginx。conf
config:etcsysconfignginx
pidfile:varrunnginx。pid
Sourcefunctionlibrary。
。etcrc。dinit。dfunctions
Sourcenetworkingconfiguration。
。etcsysconfignetwork
Checkthatnetworkingisup。
〔NETWORKINGno〕amp;amp;exit0
nginxusrlocalnginxsbinnginx
prog(basenamenginx)
NGINXCONFFILEetcnginxnginx。conf
〔fetcsysconfignginx〕amp;amp;。etcsysconfignginx
lockfilevarlocksubsysnginx
makedirs(){
makerequireddirectories
usernginxV2gt;amp;1grepconfigurearguments:seds〔〕user(〔〕)。1g
optionsnginxV2gt;amp;1grepconfigurearguments:
foroptinoptions;do
if〔echooptgrep。temppath〕;then
valueechooptcutdf2
if〔!dvalue〕;then
echocreatingvalue
mkdirpvalueamp;amp;chownRuservalue
fi
fi
done
}
start(){
〔xnginx〕exit5
〔fNGINXCONFFILE〕exit6
makedirs
echonStartingprog:
daemonnginxcNGINXCONFFILE
retval?
echo
〔retvaleq0〕amp;amp;touchlockfile
returnretval
}
stop(){
echonStoppingprog:
killprocprogQUIT
retval?
echo
〔retvaleq0〕amp;amp;rmflockfile
returnretval
}
restart(){
configtestreturn?
stop
sleep1
start
}
reload(){
configtestreturn?
echonReloadingprog:
killprocnginxHUP
RETVAL?
echo
}
forcereload(){
restart
}
configtest(){
nginxtcNGINXCONFFILE
}
rhstatus(){
statusprog
}
rhstatusq(){
rhstatusgt;devnull2gt;amp;1
}
case1in
start)
rhstatusqamp;amp;exit0
1
;;
stop)
rhstatusqexit0
1
;;
restartconfigtest)
1
;;
reload)
rhstatusqexit7
1
;;
forcereload)
forcereload
;;
status)
rhstatus
;;
condrestarttryrestart)
rhstatusqexit0
;;
)
echoUsage:0{startstopstatusrestartcondrestarttryrestartreloadforcereloadconfigtest}
exit2
esac
3。nginx与mofilefs互联locationpwpicpaths{
mogilefstracker192。168。1。202:7001;
mogilefsdomainimgs;
mogilefspass{
proxypassmogilefspath;
proxyhideheaderContentType;
proxybufferingoff;
}
}
locationfile{
mogilefstracker192。168。1。202:7001;
mogilefsdomainfiles;
mogilefspass{
proxypassmogilefspath;
proxyhideheaderContentType;
proxybufferingoff;
}
}
查看效果
5。配置后端truckers的集群upstreammgfs{
server192。168。1。202:7001;
server192。168。1。203:7001;
}
server{
locationpwpicpaths{
mogilefstrackermgfs;
mogilefsdomainimgs;
mogilefspass{
proxypassmogilefspath;
proxyhideheaderContentType;
proxybufferingoff;
}
}
locationfile{
mogilefstrackermgfs;
mogilefsdomainfiles;
mogilefspass{
proxypassmogilefspath;
proxyhideheaderContentType;
proxybufferingoff;
}
}
}
查看效果
大功告成了,后续思路,前段的nginx和数据库都存在单点故障,可以实现高可用集群
搭建centos7文件上传服务器完美运行搭建vsftpd文件上传服务器,Vsftp是一个专门为unix类型系统设计一个ftp服务器。FTP(FiletransferProtocl),文件传输协议,用于在网络上进……
沙发管家安装APK时提示解析包出现错误怎么解决?最近常常有用户问小编,安装apk文件的时候电视显示解析包出现错误是为什么?今天小编搜集了一些相关资料统一给大家说下,安装apk文件时发生解析包出现错误的几大问题和解决方法。……
粤港澳大湾区投资环境指南粤港澳大湾区重大国家战略常用关键词。粤港澳大湾区从确立至今,已然发展成为世界级湾区的又一极。蓝图规划逐步落实,交通网络和生态圈进展力强劲。大湾区的基本发展因素已全部齐备。……
职场社交婉转表达建议一旦进入一个企业,就应迅速融入那个企业文化,但言听计从之际,也别忘了做个勇敢的部属。每个公司都有所谓的员工规章,当然游戏规则规定,人人都应遵守,但若片面修改,让人难以接受……
满级大佬进了新手村达音科隼Pro印象虽然它叫隼Pro,但其实,除了ID设计的延续以外,它在调音思路、甚至是声音竞争力方面,和原版的隼是有极大差别的,标题基本可以概括我对它的判断。行业在严重内卷、兵家必争之地的千元……
智能家居改善了我们的生活吗?本文作者:PranavPoddarCoFounderDirectorofSyenergyEnvironicsLtd。从智能手机到智能服务机器人,我们现在拥有的各种智能家居……
红米官宣游戏手机,天玑1200大电池,卢伟冰价格让人无法拒绝目前手机游戏越来越流行,但是游戏手机始终是一个很小的类目。究其原因,主要还是因为目前游戏手机除了游戏体验出色之外,其他方面表现实在太离谱了,比如厚重的机身、拉胯的拍照以及夸张的……
30天免费退换终身质保5年免费机油等14项权益,这才是真售后还记得那个开出4S店就漏油的豪华车吗?最后车主在借助媒体的力量之后才得以为自己维权成功,并且维权成功后还要签订保密协议,所以哪怕是自己的利益没受损失,哪怕过错方的确是厂家或者经……
榆林WEYVV5降价11。92,欢迎到店赏车心心念念的WEYVV5,等了这么久终于有优惠了,小编打听到榆林亿荣WEY店即日起到09月22日直降11。92,这么好的机会朋友们是不是也和小编一样迫不及待的想到店去感受一下呢……
大数据培训是培训什么?科技发展日新月异,在现代培训一个傍身技能已经成为一件常事,近几年大数据培训也成为了一个热门培训项目,有想要培训大数据技术的朋友就会有这么一个问题大数据培训是培训什么呢?想……
3D素皮工艺行李箱,看realme真我GT大师系列如何玩转设5G时代的今天,虽然智能手机的性能和功能都有了质的提升,但与此同时,产品之间的同质化问题愈发明显。因此可以看到,当下众多手机厂商不仅加快了技术创新的速度,还纷纷选择与其他行业品……
东芝走了,这只是跨国公司加速退出中国的一个照面东芝离开的消息这些天成为媒体热点,但是这并非最近两年的孤例,实际上跨国公司正在有计划、成规模地退出中国,把产业链转移到越南、印度和东南亚等一些国家。耐克瑞银证据实验室(U……