一、分布式存储简介
与目前常见的集中式存储技术不同,分布式存储技术并不是将数据存储在某个或多个特定的节点上,而是通过网络使用企业中的每台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在企业的各个角落(概念来自百度百科)
集中式存储:将数据存储在某个或者多个特定的节点上,而分布式存储是将数据在指定个数的存储设备上每个拷贝一个副本。
二、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 <file_name> <key_name> --domain=<domain_name> 取出文件 $mogtool extract <key_name> <file_name> --domain=<domain_name> 大文件管理( >64M ),这时,mogtool 会给文件切成 64M 一全的大小 $mogtool inject --bigfile <file_name> <key_name> --domain=<domain_name> $mogtool extract --bigfile <key_name> <file_name> --domain=<domain_name>
查看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" 也可以通过此方法查看