设为首页 收藏本站
查看: 1025|回复: 0

[经验分享] 分布式存储 之 MogileFS

[复制链接]

尚未签到

发表于 2019-2-1 07:52:18 | 显示全部楼层 |阅读模式
  一、分布式存储简介
  与目前常见的集中式存储技术不同,分布式存储技术并不是将数据存储在某个或多个特定的节点上,而是通过网络使用企业中的每台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在企业的各个角落(概念来自百度百科)
  集中式存储:将数据存储在某个或者多个特定的节点上,而分布式存储是将数据在指定个数的存储设备上每个拷贝一个副本。

  

  二、mogilefs

  •   mogilefs的简介:

  MogileFS 是一个开源的分布式文件系统,用于组建分布式文件集群,由 LiveJournal 旗下 Danga Interactive 公司开发,Danga 团队开发了包括 Memcached、MogileFS、Perlbal 等不错的开源项目:(注:Perlbal 是一个强大的 Perl 写的反向代理服务器)。目前国内使用 MogileFS 的有图片托管网站 yupoo 等。
  


  •   mogilefs的特性:

    •   应用层: 不需要特殊的核心组件
    •   无单点失败: MogileFS分布式文件存储系统安装的三个组件(存储节点、跟踪器、跟踪用的数据库),均可运行在多个 机器上,因此没有单点失败。(你也可以将跟踪器和存储节点运行在同一台机器上,这样你就没有必要用4台机器)推荐至少两台机器。
    •   自动的文件复制: 基于不同的文件“分类”,文件可以被自动的复制到多个有足够存储空间的存储节点上,这样可以满足这个“类别”的最少复制要求。比如你有一个图片网站,你可 以设置原始的JPEG图片需要复制 至少三份,但实际只有1or2份拷贝,如果丢失了数据,那么MogileFS分布式文件存储系统可以重新建立遗失的拷贝数。用这种办 法,MogileFS(不做RAID)可以节约磁盘,否则你将存储同样的拷贝多份,完全没有必要。
    •   比RAID好: 在一个非存储区域网络的RAID(non-SAN RAID)的建立中,磁盘是冗余的,但主机不是,如果你整个机器坏了,那么文件也将不能访问。 MogileFS分布式文件存储系统在不同的机器之间进行文件复制,因此文件始终是可用的
    •   简单的命名空间: 文件通过一个给定的key来确定,是一个全局的命名空间。你可以自己生成多个命名空间,只要你愿意,不过这样可能在同一MogileFS中会造成key冲突
    •   不用共享任何东西: MogileFS分布式文件存储系统不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘。
    •   不需要RAID: 在MogileFS中的磁盘可以是做了RAID的也可以是没有,如果是为了安全性着想的话RAID没有必要买了,因为MogileFS分布式文件存储系统已经提供了。
    •   传输中立,无特殊协议: MogileFS分布式文件存储系统客户端可以通过NFS或HTTP来和MogileFS的存储节点来通信,但首先需要告知跟踪器一下。
        


  •   mogilefs的结构:
  1、Tracker   

  2、Database

  3、Storage Node

  

  有两个服务进程:MogileFSd  和 mogstored

  


  •   mogilefs组成部分:

  前面提到 Tracker and Database 和 Storage Nodes, Client 组成,我们这先不讲 Client.因为Client实际上是一个 Perl 的 pm,可以写程序调用该 pm 来使用 MogileFS 系统,对整个系统进行读写操作。另外,象 nginx 之类有相关的模块。另外也有做成象文件系统一样采用fuse方式挂载.
  

  1、Tracker(跟踪器、调度器) -------------> 最好做高可用

  这个是 MogileFS 的核心部分,通俗点讲,就他是一个调度器。MogileFSd 进程就是 trackers程序,类似 MogileFS 的 wiki 上介绍的,trackers 做了很多工作,Replication ,Deletion,Query,Reaper,Monitor等等。这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed), 包括将请求负载平衡到 “query workers” 中,让 MogileFSd 的子进程去处理. mogadm,mogtool 的所有操作都要跟 trackers 打交 道,Client 的一些操作也需要定义好 trackers,因此最好同时运行多个 trackers 来做负载均衡。trackers 也可以只运行在一台机器 上,也可以跟其他程序运行在一起(不建议)
  

  配置文件位置:/etc/mogilefs/mogilefsd.conf
  

  2、Database(存放元数据的数据库,一般是关系型数据库)  ------------------->  最好做高可用

  数据库用来存放 MogileFS 的元数据 (命名空间, 和文件在哪里). 是 Trackers 来操作和管理它。你可以用 mogdbsetup 程序来初始化数据库。因为数据库保存了MogileFS的所有元数据,如果这儿挂了,那么整个 MogileFS 将处于不可用状态。因此最好是HA结构。
  

  3、mogstored (存储节点)

  实际文件存放的地方,存储节点是一个HTTP服务器,用来做删除,存放,重命名等事情,任何WebDAV服务器都可以,不过推荐使用mogstored。 MogileFSd 可以配置到两个机器上使用不同的端口。mogstored为所有DAV操作(和流量监控),并且你自己选择的快速的HTTP服务器用来做 GET 操纵(给客户端提供文件)。

  典型的应用:一个挂载点有一个大容量的SATA磁盘,他们被挂载到 /var/mogdata/devNN,只要配置完配置文件后 mogstored 程序启动将会使本机成为一个存储节点。当然还需要 mogadm 这个工具增加这台服务器到 Cluster中。

  

  配置文件:/etc/mogilefs/mogstored.conf

  


  •   Mogilefs 服务进程

    •   MogileFSd - MogileFS的主守护进程

      •   指运行在上面的 tracker(调度器)上,配置文件为: /etc/MogileFS/MogileFSd.conf
          


    •   mogstored - MogileFS存储守护进程

      •   指运行在存储节点(Storage Node)上,配置文件为: /etc/MogileFS/mogstored.conf
          



  

  三、MogileFS安装
  


  

  在安装好yum源之后,使用yum安装,自动解决依赖关系,有可能还需要安装 pcre。

  

[root@station140 ~]# yum -y install *  

[root@station140 ~]# cd /etc/mogilefs/mog
mogilefsd.conf  mogstored.conf
#安装生成两个配置文件,mogilefsd.conf用来配置 stacker(调度器),启动服务为: mogilefsd      
#mogstored.conf用来配置Storage Node(存储节点),启动服务为:mogstored    都分别以守护进程运行  

  四、配置使用

  配置使用之前,我们先要把我们的database(数据库)准备好,因为我们要给stracker 和 mogstore 授权,授权后才能他们才能进行初始化。
  本文不对mysql的安装讲解,直接使用,若对mysql的安装还不了解,可以看其他博客补充。

  

  1、MySQL配置:授权
  

GRANT ALL ON mogilefs.* TO 'mogilefs'@'192.168.%.%' IDENTIFIED BY 'mogilefs';
#给tracker(调度器)连接数据库授权
GRANT ALL ON mogilefs.* TO 'mogdb'@'192.168.%.%' IDENTIFIED BY 'mogdb';
#给mogstored(数据存储)连接数据库授权
GRANT ALL ON *.* 'root'@'172.16.%.%' IDENTIFIED BY 'passwd';
#如果root有密码的话,后面就不需要跟 IDENTIFIED BY ''  

  2、Mogilefs安装

  

[root@station140 mogilefs]# ls  安装如下包。
MogileFS-Server-2.46-2.el6.noarch.rpm            Perlbal-doc-1.78-1.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  perl-MogileFS-Client-1.14-1.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  perl-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpm  

  使用yum安装,可以自动解决依赖关系
  

1、yum -y install *.rpm
如果手动编译安装,那么需要手动创建 'mogilefs' 用户
[2]、useradd -r mogilefs --> #手动编译安装需要创建
3、chown -R mogilefs.mogilefs /var/run/mogilefsd/
4、提供服务脚本
vim /etc/rc.d/init.d/mogilefsd  --> stracker服务器上
vim /etc/rc.d/init.d/mogstored  --> Storage Node服务器上  

  stracker 和 Storage Node 服务器上的服务脚本分别为:
  

mogilefsd服务脚本:
#!/bin/bash
#
# mogilefsd - Startup script for the MogileFS tracker
#
# chkconfig: - 85 15
# description: MogileFS tracker
# processname: mogilefsd
# config: /etc/mogilefs/mogilefsd.conf
# pidfile: /var/run/mogilefsd/mogilefsd.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Path to the apachectl script, server binary, and short-form for messages.
lockfile=${LOCKFILE-/var/lock/subsys/mogilefsd}
RETVAL=0
prog=$(which mogilefsd)
start() {
ulimit -n 65535
echo -n $"Starting mogilefsd"
su - mogilefs -c "$prog -c /etc/mogilefs/mogilefsd.conf --daemon"
RETVAL=$?
[ $RETVAL = 0 ] && success && touch ${lockfile} || failure
echo
return $RETVAL
}
stop() {
echo -n $"Stopping mogilefsd"
netstat -nlp|grep "mogilefsd"|grep -v grep|awk '{print $7}'|awk -F"/" '{print $1}'|xargs kill -9
RETVAL=$?
[ $RETVAL = 0 ] && success && rm -f ${lockfile} || failure
echo
}
reload() {
echo -n $"Reloading mogilefsd: "
killall mogilefsd -HUP
RETVAL=$?
[ $RETVAL = 0 ] && success || failure
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status mogilefsd
RETVAL=$?
;;
restart)
stop
sleep 1
start
;;
reload)
reload
;;
*)
echo $"Usage: mogilefsd {start|stop|restart|reload|status}"
exit 1
esac
exit $RETVAL  

  

mogstored服务脚本:
#!/bin/bash
#
# mogstored - Startup script for the MogileFS storage
#
# chkconfig: - 86 14
# description: MogileFS storage
# processname: mogstored
# config: /etc/mogilefs/mogstored.conf
# pidfile: /var/run/mogilefsd/mogstored.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Path to the apachectl script, server binary, and short-form for messages.
lockfile=${LOCKFILE-/var/lock/subsys/mogstored}
RETVAL=0
configfile='/etc/mogilefs/mogstored.conf'
prog=$(which mogstored)
start() {
ulimit -n 65535
echo -n $"Starting mogstored"
su - mogilefs -c "$prog -c $configfile --daemon"  &> /dev/null
RETVAL=$?
[ $RETVAL = 0 ] && success && touch ${lockfile} || failure
echo
return $RETVAL
}
stop() {
echo -n $"Stopping mogstored"
netstat -nlp|grep "mogstored"|grep -v grep|awk '{print $7}'|awk -F"/" '{print $1}'|xargs kill -9
RETVAL=$?
[ $RETVAL = 0 ] && success && rm -f ${lockfile} || failure
echo
}
reload() {
echo -n $"Reloading mogstored: "
killall mogstored -HUP
RETVAL=$?
[ $RETVAL = 0 ] && success || failure
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status mogstored
RETVAL=$?
;;
restart)
stop
sleep 1
start
;;
reload)
reload
;;
*)
echo $"Usage: mogstored {start|stop|restart|reload|status}"
exit 1
esac
exit $RETVAL  

  3、配置mogstored存储节点
  

1、解决依赖关系,需要安装perl-IO-AIO
2、 将mogstored和mysql建立起联系,在mysql生成相关的数据库
mogdbsetup --dbhost=192.168.1.103 --dbport=3306 --dbname=mogdb --  dbrootuser=root --dbrootpass=passwd --dbuser=moguser --dbpass=mogpass --yes
3、修改配置文件 mogilefsd.conf
vim  /etc/mogilefs/mogilefsd.conf
db_dsn = DBI:mysql:mogdb:host=192.168.1.103
mysql:mogdb 表示mysql与mogdb这个用户的数据库相连接;
host=192.168.1.103 表示mysql服务器所在地址;
db_user = mogdb    #初始化后,访问mysql数据库的访问帐号
db_pass = mogdb    #初始化后,访问mysql数据库的访问密码
listen = 192.168.1.103:7001  #指mogstored监听的地址和端口
4、将服务添加到系统开机自动启动中,并启动
chkconfig --add mogstored  ---> 指手动编译安装需要的步骤
chkconfig --add mogilefsd
chkconfig mogilefsd on
chkconfig mogstored on
service mogilefs start  启动mogilefs来保持和mysql的连接;
5、创建存储分区
mkdir /dfs/mogdata/dev1 -pv  为了简单,直接创建一个目录
chown -R mogilefs.mogilefs /dfs/mogilefs/dev1
6、修改配置文件 mogstored.conf
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /dfs/mogdata/       只需要修改这里。
7、启动服务
service mogstored start  

  4、配置tracker调度器mogilefs节点
  

1、将mog和mysql建立起联系,在mysql生成相关的数据库
mogdbsetup --dbhost=192.168.1.103 --dbport=3306 --dbname=mogilefs --  dbrootuser=root --dbrootpass=passwd --dbuser=mogilefs --dbpass=mogilefs --yes
2、修改配置文件
db_dsn = DBI:mysql:mogilefs:host=192.168.1.103
mysql:mogilefs 表示mysql与mogilefs这个用户的数据库相连接;
host=192.168.1.103 表示mysql服务器所在地址;
db_user = mogilefs    #初始化后,访问mysql数据库的访问帐号
db_pass = mogilefs    #初始化后,访问mysql数据库的访问密码
listen = 192.168.1.103:7001  #指mogilefs监听的地址和端口
3、将服务添加到系统开机自动启动中,并启动
chkconfig --add mogilefsd  ---> 指手动编译安装需要的步骤
chkconfig mogilefsd on
service mogstored start  

  以下是/etc/mogilefs/mogilfsd.conf的配置文件
  

[root@station140 ~]# vim /etc/mogilefs/mogilefsd.conf
# Enable daemon mode to work in background and use syslog
daemonize = 1  #1指的是,以后台方式运行
# Where to store the pid of the daemon (must be the same in the init script)
pidfile = /var/run/mogilefsd/mogilefsd.pid    #pid文件路径
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=192.168.1.103  #用mysql做为元数据存储,mysql用户名为mogilefs mysql主机地址为:192.168.1.103
#db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = mogilefs    #初始化后,访问mysql数据库的访问帐号
db_pass = mogilefs    #初始化后,访问mysql数据库的访问密码
# IP:PORT to listen on for mogilefs client requests
listen = 192.168.1.103:7001  #指mogilefs监听的地址和端口
#listen = 127.0.0.1:7001
# Optional, if you don't define the port above.
conf_port = 7001  #mogilefs的配置端口
# Number of query workers to start by default.
query_jobs = 10   #默认开启请求的进程数
# Number of delete workers to start by default.
delete_jobs = 1   #默认用来处理删除请求开启的进程数
# Number of replicate workers to start by default.
replicate_jobs = 5   #默认用来处理复制请求开始的进程数
# Number of reaper workers to start by default.
# (you don't usually need to increase this)
reaper_jobs = 1  

  以上,mogilefs中的 tracker 和 mogstore 两个节点就安装和配置完毕
  

  以下为相关命令的用法:
  注意:
  以下命令中,因为mogilefsd和mogstored在每个节点上都启动了,意味着,一个节点既做mogilefsd又做mogstored,所以下面的 --trackers= # 才和 add # --ip=# 相同,如果mogilefsd和mogstored没在一个节点上,就要注意--trackers=#,就要指向自己定义的tracker那台服务器地址了。
  


  •   添加mogstored需要以下几步:
  

1、
mogadm --trackers=192.168.1.103:7001 host add 192.168.1.103 --ip=192.168.1.103 --status=alive
将192.168.1.103主机名,IP为192.168.1.103,加入到trackers中。
2、   
mogadm --trackers=192.168.1.103:7001 decice add 192.168.1.103 1
给192.168.1.103 tracker中添加一个本主机 192.168.1.103 的设备,设备号为 1.
3、
mogadm --trackers=192.168.1.103:7001 domain add XXX
给trackers中添加一个区域为XXX,也就是不同的'目录'
4、
mogadm --trackers=192.168.1.103:7001 class add images class0 --mindevcount=2
给trackers中 给images 添加 一个类 叫 class0 ,定义最少复制2份到某设备上

  •   查看类的命令用法:
  

mogadm --trackers=192.168.1.103:7001 host list
列出tracker上的可用的 mogstored 主机
mogadm --trackers=192.168.1.103:7001 device list
列出tracker上可用的 mogstored 设备   
mogadm --trackers=192.168.1.103:7001 class list
列出tracker上可用的 mogstored 类
#
查看tracker中domain(目录)中存在的文件的'键'所对应的值:
mogfileinfo --trackers=192.168.1.103:7001 --domain=images --key='/images/1.png'
查看tracker中domain(目录)中所存在哪些文件:
moglistkeys --trackers=192.168.1.103:7001 --domain=images  


  •   下载文件:
  

mogfetch --trackers=192.168.1.103 --domain=images  --key='1.png' --file='/tmp/a.png'
将trackers中注册了的storage中的domain(区域或者目录)中,键为1.png的文件下载到本地'/tmp'下,改文件名为 a.png.  


  •   上传文件:
  

mogupload --trackers=192.168.1.103:7001 --domain=images --key='/images/1.png' --file='/tmp/1.png'
将/tmp/1.png 加入到 images 这个区域或者说目录当中,设置其键值存储中的键为'/images/1.png'  


  •   解析网页响应过程
  

当用户在浏览器中输入 http://www.a.com/a/b/1.png时,前端perlbal或者
nginx将图片请求发送给 trackers,trackers查找自己,发现这个 /a/b/1.png
对应数据库中的 /images/1.png这个键、trackers讲请求返还给客户端,
客户端再去请求 database,当database收到用户请求的是/images/1.png,
然后就将 /images/1.png键所对应的值发送给客户端。
(对应的值在 Storage Node中存储着,位置可能是:/domain/1.png )  


  •   MogileFS 中文件管理:
  

我们可以简单的使用 mogtool 来加入文件,当然也可以用 Client 的 API 来管理。
加入文件,到 MogileFS 中
$mogtool inject    --domain=
取出文件
$mogtool extract   --domain=
大文件管理( >64M ),这时,mogtool 会给文件切成 64M 一全的大小
$mogtool inject --bigfile    --domain=
$mogtool extract --bigfile   --domain=  


  •   查看mogilefs分布式存储的状态
  

mogstats --config=/etc/mogilefs/mogilefs.conf
--config=/ 后面跟此节点的mogilefs的配置文件
mogstats --config=/etc/mogilefs/mogilefs.conf --stats="domain"
仅显示domain信息
mogstats --db_dsn="DBI:mysql:mogdb:host=192.168.1.103" --db_user="moguser" --db_pass="mogpass"
也可以通过此方法查看  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-670227-1-1.html 上篇帖子: 分布式存储之MogileFS简单应用 下篇帖子: 分布式文件系统MogileFS的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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