mogilefs实现分布式存储
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mogilefs实现分布式存储相关的知识,希望对你有一定的参考价值。
mogilefs是一个开源的分布式文件存储系统。
mogilefs的工作原理:每次文件的上传和读取,都经过前端trackerserver服务器,trackerserver服务器收到客户端的请求,查询数据库,返回一个上传或者是读取可用的后端storageserver的地址,然后由客户端直接操作后端storageserver服务器,下载操作返回就是成功或者失败的果,read操作就是返回对应的查询数据。
它支持多节点冗余。
可实现自动的文件复制。
使用名称空间,每个文件通过key来确定
工作于应用层,没有特殊的组件要求。
不共享任何数据,mogilefs不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘。
mogilefs主要有三部分构成:tracker节点,database节点,storage节点。
tracker节点:这个是mogilefs的核心部分,它是一个调度器。借助数据库保存各节点文件的元数据信息,保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本。除此之外,它还负责数据的删除,复制,监控,查询等,可以作为负载均衡。
mysql节点:用来存放mogilefs的元数据,是trackers来操作和管理它,可以用mogdbsetup程序来初始化数据库。
storage节点:这个是mogilefs存储文件存放在这些机器上,每一台存储都要启动一个mogstored服务,扩容就是增加这些机器。
MogileFS管理的几个概念:
1、Domain:一个MogileFS可以有多个Domain,用来存放不同文件(大小,类型),同一个Domain内key必须唯一,不同Domain内,key可以相同;
2、每一个存储节点称为一个主机host,一个主机上可以有多个存储设备dev(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件。
3、Class:文件属性管理,定位文件存储在不同设备上的份数;
mogilefs安装方式
mogilefs安装常用两种方式,yum安装和perl程序安装
yum 安装:通常是在线安装,好处是安装方式简单,不易出错;常用的安装yum源为epel
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO
本地安装的rpm包
MogileFS-Server-2.46-2.el6.noarch.rpm #核心服务
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #socket
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm # tracker节点
perl-MogileFS-Client-1.14-1.el6.noarch.rpm #客户端
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #Storage存储节点
MogileFS-Utils-2.19-1.el6.noarch.rpm #主要是MogileFS的一些管理工具,例如mogadm等。
分别在tracker节点和storage节点上安装以上软件包,为了节省资源,我的tracker节点和mysql
数据库放在一台机器上。
perl程序源码包安装:通过perl的包管理命令cpanm进行安装
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
cpanm安装
wget http://xrl.us/cpanm -O /usr/bin/cpanm; sudo chmod +x
/usr/bin/cpanm
#cpanm DBD::mysql
#cpanm MogileFS::Server
#cpanm MogileFS::Utils
#cpanm MogileFS::Client
#cpanm IO::AIO
mogilefs程序路径
主程序:/usr/bin/mogilefsd
命令行管理工具程序:/usr/bin/mogadm
主配置文件(Tracker):/etc/mogilefs/mogilefsd.conf
主配置文件(Storage Nodes):/etc/mogilefs/mogstored.conf
mogilefs程序功能的配置文件介绍
daemonize = 1
设置为1表示启动为守护进程
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = username
db_pass = password
#配置数据库连接相关信息
listen = 127.0.0.1:7001
mogilefs监听地址,监听在127.0.0.1表示只允许从本机登录进行管理
query_jobs = 10
启动多少个查询工作线程
delete_jobs = 1
启动多少个删除工作线程
replicate_jobs = 5
启动多少个复制工作线程
reaper_jobs = 1
启动多少个用于回收资源的线程
mogilefs服务初始化
授权给用户,使授权的用户可以登录到数据库 MariaDB?[(none)]>?grant?all?privileges?on?mogilefs.*?to?‘mogile‘@‘127.0.0.1‘?identified?by?‘123456‘with?grant?option; Query?OK,?0?rows?affected?(0.08?sec) 刷新授权表 MariaDB?[(none)]>?flush??privileges; Query?OK,?0?rows?affected?(0.00?sec) 使用mogdbsetup命令安装mogilefs数据库 [[email protected]?~]#?mogdbsetup??--dbpass=123456 This?will?attempt?to?setup?or?upgrade?your?MogileFS?database. It?won‘t?destroy?existing?data. Run?with?--help?for?more?information.??Run?with?--yes?to?shut?up?these?prompts. Continue??[N/y]:?y Create/Upgrade?database?name?‘mogilefs‘??[Y/n]:?y Grant?all?privileges?to?user?‘mogile‘,?connecting?from?anywhere,?to?the?mogilefs?database?‘mogilefs‘??[Y/n]:?y 验证初始化数据库的结果 [[email protected]?~]#?mysql?-umogile?-p123456 Welcome?to?the?MariaDB?monitor.??Commands?end?with?;?or?\g. Your?MariaDB?connection?id?is?9 Server?version:?5.5.52-MariaDB?MariaDB?Server Copyright?(c)?2000,?2016,?Oracle,?MariaDB?Corporation?Ab?and?others. Type?‘help;‘?or?‘\h‘?for?help.?Type?‘\c‘?to?clear?the?current?input?statement. MariaDB?[(none)]>?show?databases; +--------------------+ |?Database???????????| +--------------------+ |?information_schema?| |?mogilefs???????????| |?test???????????????| +--------------------+ 3?rows?in?set?(0.00?sec) MariaDB?[(none)]>?use?mogilefs; Reading?table?information?for?completion?of?table?and?column?names You?can?turn?off?this?feature?to?get?a?quicker?startup?with?-A Database?changed MariaDB?[mogilefs]>?show?tables; +----------------------+ |?Tables_in_mogilefs???| +----------------------+ |?checksum?????????????| |?class????????????????| |?device???????????????| |?domain???????????????| |?file?????????????????| |?file_on??????????????| |?file_on_corrupt??????| |?file_to_delete???????| |?file_to_delete2??????| |?file_to_delete_later?| |?file_to_queue????????| |?file_to_replicate????| |?fsck_log?????????????| |?host?????????????????| |?server_settings??????| |?tempfile?????????????| |?unreachable_fids?????| |?zzz??????????????????| +----------------------+ 18?rows?in?set?(0.00?sec)
配置tracker文件
修改以下四项即可,其他的根据具体的工作环境而定
db_dsn=DBI:mysql:mogilefs:host=127.0.0.1 db_user=mogile db_pass=123456 listen=172.17.252.15:7001
安装好tracker后会在/var/run/生成该目录,改变目录的属主和属组
[[email protected]?~]#?chown?-R?mogilefs.mogilefs??/var/run/mogilefsd
启动mogilefsd服务
[[email protected]?~]#?cd?/etc/mogilefs/ [[email protected]?mogilefs]#?/etc/init.d/mogilefsd??start Starting?mogilefsd?(via?systemctl):????????????????????????[??OK??] [[email protected]?mogilefs]#?ss?-ntl|grep?7001 LISTEN?????0??????128????172.17.252.15:7001?????????????????????*:*
配置storage节点的文件
maxconns?=?10000(存储系统最大连接数) httplisten?=?0.0.0.0:7500(可通过http访问服务端口) mgmtlisten?=?0.0.0.0:7501(mogilefs的管理端口) docroot?=?/data/mogdata(数据存储的实际位置,建议使用的是一个单独挂载使用的磁盘) ~
因为进程都是以mogilefs的身份运行的,所以我们要把文件存储的路径的属主和属组改为mogilefs
[email protected]?data]#?ll total?0 drwxr-xr-x.?3?mogilefs?mogilefs?18?Nov?28?21:24?mogdata [[email protected]?mogilefs]#?/etc/init.d/mogstored??start Starting?mogstored?(via?systemctl):????????????????????????[??OK??] [[email protected]?mogilefs]#?ss?-ntl|grep?75* LISTEN?????0??????128??????????*:7500?????????????????????*:*?????????????????? LISTEN?????0??????128??????????*:7501?????????????????????*:*
现在加入"存储节点"到trackers中,相当于为每个主机加入mogilefs的存储系统
[[email protected]?mogilefs]#?mogadm?--tracker=172.17.252.15:7001?host?add?node1?--ip=172.17.252.16?--port=7500?--status=alive [[email protected]?mogilefs]#?mogadm?--tracker=172.17.252.15:7001?host?add?node2?--ip=172.17.252.17?--port=7500?--status=alive 查看已经添加的主机 [[email protected]?mogilefs]#?mogadm?--tracker=172.17.252.15:7001?check Checking?trackers... ??172.17.252.15:7001?...?OK Checking?hosts... ??[?1]?node1?...?REQUEST?FAILURE?FETCHING:?http://172.17.252.16:7500/ ??[?2]?node2?...?REQUEST?FAILURE?FETCHING:?http://172.17.252.17:7500/ No?devices?found?on?tracker(s). [[email protected]?mogilefs]#?mogadm?--tracker=172.17.252.15:7001?check Checking?trackers... ??172.17.252.15:7001?...?OK Checking?hosts... ??[?1]?node1?...?OK(节点已经检测成功) ??[?2]?node2?...?OK Checking?devices...(devices设备尚未加入) ??host?device?????????size(G)????used(G)????free(G)???use%???ob?state???I/O% ??----?------------?----------?----------?----------?------?----------?----- ??----?------------?----------?----------?----------?------ ?????????????total:?????0.000??????0.000??????0.000???0.00%
mogilefs中的存储设备管理
建目录使用dev+ID这种格式,注意所有系统中的ID不能重复,也必须和配置文件中的路径一样
分别在两个storage节点的主机上建目录dev1 和dev2
mkdir?-p?/data/mogdata/dev1 mkdir?-p?/data/mogdata/dev2
给设备加入存储的节点当中,相当于为每个设备加入mogilefs的存储系统
[[email protected]?mogilefs]#?mogadm?--tracker=172.17.252.15:7001??device?add?node1??1 [[email protected]?mogilefs]#?mogadm?--tracker=172.17.252.15:7001??device?add?node2??2 [[email protected]?mogilefs]#?mogadm?--tracker=172.17.252.15:7001?check Checking?trackers... ??172.17.252.15:7001?...?OK Checking?hosts... ??[?1]?node1?...?OK ??[?2]?node2?...?OK Checking?devices...(已经成功加入设备) ??host?device?????????size(G)????used(G)????free(G)???use%???ob?state???I/O% ??----?------------?----------?----------?----------?------?----------?----- ??[?1]?dev1????????????97.609??????6.321?????91.287???6.48%??writeable???0.0 ??[?2]?dev2????????????97.609??????6.429?????91.179???6.59%??writeable???0.0 ??----?------------?----------?----------?----------?------ ?????????????total:???195.217?????12.750????182.467???6.53% 也可以使用另一种方式查看device [[email protected]?mogilefs]#?mogadm?--tracker=172.17.252.15:7001?device?list node1?[1]:?alive ????????????????????used(G)????free(G)???total(G)??weight(%) ???dev1:???alive??????6.321?????91.287?????97.608????????100 node2?[2]:?alive ????????????????????used(G)????free(G)???total(G)??weight(%) ???dev2:???alive??????6.429?????91.180?????97.608????????100
添加域:域用来存储不同应用类型数据的容器
创建图片存放的域 [[email protected]?~]#?mogadm?--tracker=172.17.252.15:7001?domain?add?imgs 创建html等文件存放的域 [[email protected]?~]#?mogadm?--tracker=172.17.252.15:7001?domain?add?files [email protected]?~]#?mogadm?--tracker=172.17.252.15:7001?domain?list ?domain???????????????class????????????????mindevcount???replpolicy???hashtype --------------------?--------------------?-------------?------------?------- ?files????????????????default???????????????????2????????MultipleHosts()?NONE?? ?imgs?????????????????default???????????????????2????????MultipleHosts()?NONE
添加类:
[[email protected]?~]#?mogadm?--tracker=172.17.252.15:7001?class?add?imgs?img1?--mindevcount=3 [[email protected]?~]#?mogadm?--tracker=172.17.252.15:7001?class?add?imgs?img2?--mindevcount=3 [[email protected]?~]#?mogadm?--tracker=172.17.252.15:7001?class?add?files?file1?--mindevcount=4 [[email protected]?~]#?mogadm?--tracker=172.17.252.15:7001?class?add?files?file2?--mindevcount=4 [[email protected]?~]#?mogadm?--tracker=172.17.252.15:7001?class?list domain???????????????class????????????????mindevcount???replpolicy???hashtype --------------------?--------------------?-------------?------------?------- ?files????????????????default???????????????????2????????MultipleHosts()?NONE??? ?files????????????????file1?????????????????????4????????MultipleHosts()?NONE??? ?files????????????????file2?????????????????????4????????MultipleHosts()?NONE?? ?imgs?????????????????default???????????????????2????????MultipleHosts()?NONE??? ?imgs?????????????????img1??????????????????????3????????MultipleHosts()?NONE??? ?imgs?????????????????img2??????????????????????3????????MultipleHosts()?NONE
上传文件
[email protected]?~]#?mogupload?--domain=imgs?--key=jpg1?--file=timg.jpg --key指定上传后的键 --file指定要上传的文件
查询文件
[[email protected]?~]#?mogfileinfo?--domain=imgs?--key=jpg1 -?file:?jpg1 ?????class:??????????????defa ??devcount:????????????????????2 ????domain:?????????????????imgs ???????fid:???????????????????12 ???????key:?????????????????jpg1 ????length:????????????????60918 ?-?http://172.17.252.17:7500/dev2/0/000/000/0000000012.fid ?-?http://172.17.252.16:7500/dev1/0/000/000/0000000012.fid
通过它给出的路径,我们进行访问
删除指定的文件
[[email protected]?~]#?mogdelete?--domain=imgs?--key=jpg1 再次查看 [[email protected]?~]#?mogfileinfo?--domain=imgs?--key=jpg1 Error?fetching?file?info:?unknown_key?unknown_key?at?/usr/bin/mogfileinfo?line?60,?<Sock_172.17.252.15:7001>?line?1.
列出所有文件的key
[[email protected]?~]#?moglistkeys?--domain=imgs
暂时停止服务器
如果需要维护一个服务器,比如更新内存,升级操作之类的需要关机的操作,可以在操作之前将主机设置为"down".
?[[email protected]?~]?mogadm?host?mark??node1??down ?恢复 ??[[email protected]?~]?mogadm?host?mark??node1??alive
mogilefs有一个小bug,就是默认的情况下它是不会复制的,为了实现自动复制,我们需要安装Syscall模块、
可以到http://search.cpan.org/网站下载如下包,并在tarcker节点和storage节点进行编译
?
以上是关于mogilefs实现分布式存储的主要内容,如果未能解决你的问题,请参考以下文章
分布式存储之MogileFS基于Nginx实现负载均衡(Nginx+MogileFS)