MogileFS
概述:
MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片。
MogileFS由3个部分组成:
(1) server:主要包括mogilefsd和mogstored两个应用程序。mogilefsd实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、host等;mogstored是存储节点(store node),它其实是个WebDAV服务,默认监听在7500端口,接受客户端的文件存储请求。在MogileFS安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
(2) utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。
(3) 客户端API:MogileFS的客户端API很多,例如Perl、PHP、Java、Python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等。
存储主机(节点)
这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增加这些机器.
设备(device)
一个存储节点,以就是上面的主机,可以有多个 device, 就是用来存放文件的目录(例如挂载的目录),每个设备都有一个设备id,需要在 mogstored 的配置文件中的 docroot 配置的项目 指定的目录下面创建相应的设备的目录,目录名为 $docroot/dev$id,设备是不能删除的.只能将其设备的状态的值置为dead,当一个设备 dead 之后,就真的 dead了,里面的数据也无法恢复了,且这个dead了的设备的 id 也不能再用.
简单示例图:
配置示例:
192.168.0.20 trackers mariadb (node1)
192.168.0.21 192.168.0.22 mogstored 节点 (node2 node3)
步骤:
一,node1:mogilefsd ,tracker+mysql配置
二,node2,node3:mogstored 节点配置
三,在node1配置mogilefs添加node1,2节点 (添加主机,设备,domain,class)
四,一些事项说明
一,node1:mogilefsd,tracker+mysql配置
1,安装mariadb
略
2,安装 mogiefsd
需要的软件包:(要安装完成需要epel源)
epel源
vi /etc/yum.repos.d/epel.repo
[epel]
name=epel
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-$releasever&arch=$basearch
enabled=1
gpgcheck=0
yum --nogpgcheck localinstall *.rpm
3,授权远程访问mysql的账户
MariaDB [(none)]> GRANT ALL ON *.* TO 'root'@'192.168.0.%' IDENTIFIED BY 'root' WITH GRANT OPTION;
Query OK, 0 rows affected (0.22 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.15 sec)
4,初始化数据库 (建立mogilefs的数据库和用户)
使用mogdbsetup --help查看信息
[root@node1 ~]# mogdbsetup --dbhost=192.168.0.20 --dbrootuser=root --dbrootpass='root' --dbname=mogdb --dbuser=moguser --dbpass=mogpass
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 'mogdb'? [Y/n]: y
Grant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogdb'? [Y/n]: y
4,配置mogilefsd
[root@node1 mogilefs]# cp mogilefsd.conf{,.bak}
[root@node1 mogilefs]# ls
mogilefsd.conf mogilefsd.conf.bak mogstored.conf
[root@node1 mogilefs]# vim mogilefsd.conf
daemonize = 1 #运行为后台守护进程
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogdb:host=192.168.0.20
db_user = moguser
db_pass = mogpass
listen = 0.0.0.0:7001
conf_port = 7001
query_jobs = 10 #并发响应客户端请求数
delete_jobs = 1 #删除请求的线程数
replicate_jobs = 5 #用于做复制的线程数
reaper_jobs = 1 #
#fsck_jobs = 1 #文件系统检查的进程(一般不必要开)
二,node2,node3 :mogstored 节点配置
1,安装 mogstored
软件包复制到node2,node3
scp -r /mogilefs node2:/
scp -r /mogilefs node3:/
注意也要有epel源
yum install *.rpm -y
yum install perl-IO-AIO -y ---在mogstored节点必须安装这个组件
2,配置
[root@node2 mogilefs]# vim /etc/mogilefs/mogstored.conf
maxconns = 10000 #最大并发连接数
httplisten = 0.0.0.0:7500 #http监听
mgmtlisten = 0.0.0.0:7501 #tracter来监测mogstored健康状态的
docroot = /var/mogdata #文件存储的目录
两个节点分别创建文件存储目录(最好使用新分区,这里直接使用系统目录使用)
dev1,dev2 中 dev为固定文件名,1,2区分两个节点的设备名
node2
mkdir /var/mogdata/dev1 -p
node3
mkdir /var/mogdata/dev2 -p
chown mogilefs.mogilefs /var/mogdata/ -R #一定要修改权限。
启动服务
三,在node1配置mogilefs添加node1,2节点 (添加主机,设备,domain,class)
MogileFS-Utils-2.19-1.el6.noarch.rpm 包有很多工具,使用这些工具配置。
mogadm 工具使用:
mogadm --help
man mogadm
监测自己,tracker是否状态正常。
mogstats 命令连接mysql查看tracker状态
mogstats --help
添加mogstrore节点:
使用添加主机方法:
添加 192.168.0.21 主机,查看信息
[root@node1 mogilefs]# mogadm --trackers=192.168.0.20:7001 host add mg1 --ip=192.168.0.21 --status=alive
[root@node1 mogilefs]# mogadm --trackers=192.168.0.20:7001 host list
mg1 [1]: alive
IP: 192.168.0.21:7500
添加 192.168.0.22 主机,查看信息
[root@node1 mogilefs]# mogadm --trackers=192.168.0.20:7001 host add mg2 --ip=192.168.0.22 --status=alive
[root@node1 mogilefs]# mogadm --trackers=192.168.0.20:7001 host list
mg1 [1]: alive
IP: 192.168.0.21:7500
mg2 [2]: alive
IP: 192.168.0.22:7500
添加设备方法:
mogadm --trackers=192.168.0.20:7001 device add mg1 1
mogadm --trackers=192.168.0.20:7001 device add mg2 2
mogadm --trackers=192.168.0.20:7001 device list #查看
添加domain
添加class
使用命令测试:
mogupload上传
mogfetch 下载
[root@node1 mogilefs]# mogupload #使用方法
Usage: /usr/bin/mogupload --trackers=host --domain=foo --key='/hello.jpg' --file='./hello.jpg'
You have new mail in /var/spool/mail/root
[root@node1 mogilefs]# mogupload --trackers=192.168.0.20:7001 --domain=images --key='/1.jpg' --file=/abc.jpg #上传本地图片/abc.jpg 访问路径为/1.jpg
[root@node1 mogilefs]# mogfileinfo
Usage: /usr/bin/mogfileinfo --trackers=host --domain=foo --key='/hello.jpg'
[root@node1 mogilefs]# mogfileinfo --trackers=192.168.0.20:7001 --domain=images --key='/1.jpg'
- file: /1.jpg
class: default
devcount: 2
domain: images
fid: 2
key: /1.jpg
length: 15299
- http://192.168.0.21:7500/dev1/0/000/000/0000000002.fid
- http://192.168.0.22:7500/dev2/0/000/000/0000000002.fid #保存的两个副本
在node2和node3节点查看mogdata目录:
至此,简单配置完成。
四,一些事项说明
客户端访问url和冗余负载均衡
客户端可以直接访问:
Nginx 做为 MogileFS 的前端客户端
我们使用 Nginx 来获取文件,做前端的查询代理时需要使用到mogilefs的这个模块.可以下载这个模块编译进 Nginx 就行了.直接使用 ./configure �Cadd-module= 这个参数就可以了.
最新的这个模块的下载地址是:https://github.com/vkholodkov/nginx-mogilefs-module
使用这个需要考虑到网站原来的 url 是什么样的.比如:
http://www.a.com/uploads/front_page/A6B00135E24AB17E043B9B5453762438.png
这个 URL 中的 UUID 是 A6B00135E24AB17E043B9B5453762438.png.这时我们使用这个做 key 来存成 MogileFS 中就行.
再结合 rewrite,只要 key 在 url 里有,就能直接代理到后端的 mogilefs.象如下的写法,会直接取 A6B00135E24AB17E043B9B5453762438.png 来做查询用的 key.
location ~ ([^\/]+)$ {
mogilefs_tracker 192.168.1.xxx:7001;
mogilefs_domain img;
mogilefs_methods GET;
mogilefs_noverify on;
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
负载均衡:
如果使用了多个 tracker 的话,要配置使用多个 tracker 来进行负载均衡和备份.可以直接配置 tracker 为 upstrame:
upstream online_mogilefs {
server 10.0.0.1:7001;
server 10.0.0.2:7001;
}
然后后面配置 tracker 的连接时,直接加上就行了
mogilefs_tracker online_mogilefs;
如果你还想配置使用 mogilefs 的 Nginx 上传,使用其中的 put 功能然后就不要安装客户端上传送,就需要打个补丁.
上面的配置其实也是一样,关键对于上传的配置,需要给方法修改为
mogilefs_methods PUT DETEL;