一、分布式存储简介
与目前常见的集中式存储技术不同,分布式存储技术并不是将数据存储在某个或多个特定的节点上,而是通过网络使用企业中的每台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在企业的各个角落(概念来自百度百科)
集中式存储:将数据存储在某个或者多个特定的节点上,而分布式存储是将数据在指定个数的存储设备上每个拷贝一个副本。
二、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 两个节点就安装和配置完毕
以下为相关命令的用法:
注意:
- 添加mogstored需要以下几步:
以下命令中,因为mogilefsd和mogstored在每个节点上都启动了,意味着,一个节点既做mogilefsd又做mogstored,所以下面的 --trackers= # 才和 add # --ip=# 相同,如果mogilefsd和mogstored没在一个节点上,就要注意--trackers=#,就要指向自己定义的tracker那台服务器地址了。
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 p_w_picpaths class0 --mindevcount=2
给trackers中 给p_w_picpaths 添加 一个类 叫 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=p_w_picpaths --key='/p_w_picpaths/1.png'
查看tracker中domain(目录)中所存在哪些文件:
moglistkeys --trackers=192.168.1.103:7001 --domain=p_w_picpaths
- 下载文件:
mogfetch --trackers=192.168.1.103 --domain=p_w_picpaths --key='1.png' --file='/tmp/a.png'
将trackers中注册了的storage中的domain(区域或者目录)中,键为1.png的文件下载到本地'/tmp'下,改文件名为 a.png.
- 上传文件:
mogupload --trackers=192.168.1.103:7001 --domain=p_w_picpaths --key='/p_w_picpaths/1.png' --file='/tmp/1.png'
将/tmp/1.png 加入到 p_w_picpaths 这个区域或者说目录当中,设置其键值存储中的键为'/p_w_picpaths/1.png'
- 解析网页响应过程:
当用户在浏览器中输入 http://www.a.com/a/b/1.png时,前端perlbal或者
nginx将图片请求发送给 trackers,trackers查找自己,发现这个 /a/b/1.png
对应数据库中的 /p_w_picpaths/1.png这个键、trackers讲请求返还给客户端,
客户端再去请求 database,当database收到用户请求的是/p_w_picpaths/1.png,
然后就将 /p_w_picpaths/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"
也可以通过此方法查看
转载于:https://blog.51cto.com/xz159065974/1409476