MogileFS简介
MogileFS是一套开源的分布式存储组件,由LiveJournal旗下的Danga Interactive研发,主要应用于存储海量的小文件。
MogileFS有3个组件:
1)Tracker Nodes:是文件系统集群的核心节点,借助数据库节点保存元数据,主要功能包括监控后端Storage节点,及指示Storage节点完成数据的添加、删除、查询,及节点之间数据的复制等,该节点上运行的进程为mogilefsd。往往Tracker节点有多个,以实现负载均衡和高可用;
2)Storage Nodes:实际存储数据的位置,基于WebDAV模式工作,能完成文件创建、删除、重命名等操作,运行的进程为mogstored;
3)database Nodes:帮助Tracker节点存放元数据及全局信息,包括host,domain,class等。数据库建议使用高可用集群,防止单点故障。
实现机制
在该文件系统集群中,每一个数据块都会有多个副本,存放于多个Storage Node上,不同的文件系统副本的数量各不相同(一般建议为3份),在Tracker Node上会分别单独记录每一个数据块的存储位置(位于哪个Storage及路径)。若某个Storage节点不在线了,客户端向Tracker节点请求获取数据时,Tracker节点会返回用于冗余的副本的存储位置给客户端。这样就保证了整个文件系统中数据的高可用性。当有数据存储至某一storage节点后,各storage节点会根据Tracker的指示通过节点间通信将副本发送至其他节点上。若某一storage下线了,该节点上的副本会由其他节点重新提供,保证副本的个数不少于指定的值。
MogileFS结构图
工作原理:客户端需要存取数据时,首先与Tracker进行交互,Tracker通过查询数据库来获取客户端存取数据时所需要访问的元数据,然后返回给客户端,客户端利用Tracker返回的结果,与Storage Nodes节点进行交互完成数据存取(一次有可能联系一个也可能联系多个)。
MogileFS 设置 Memcached http://www.linuxidc.com/Linux/2012-03/56905.htm
在 MogileFS 中使用 Nginx http://www.linuxidc.com/Linux/2012-03/56904.htm
在开源分布式文件系统MogileFS 中使用 Nginx http://www.linuxidc.com/Linux/2012-03/56573.htm
自定义Nagios监控MogileFS存储节点脚本 http://www.linuxidc.com/Linux/2011-12/49394.htm
部署MogileFS
部署Tracker Nodes
1)安装程序包
使用cpan在线安装,首先安装必要的perl库。
[root@node1 ~]# cpan Sys::Syscall
[root@node1 ~]# cpan IO::WrapTie
[root@node1 ~]# cpan Danga::Socket
[root@node1 ~]# cpan IO::AIO
[root@node1 ~]# cpan MogileFS::Client
[root@node1 ~]# cpan Net::Netmask
[root@node1 ~]# cpan Perlbal
安装MogileFS Server:
[root@node1 ~]# cpan MogileFS::Server
或者下载源码包编译安装:
[root@node1 ~]# wget http://mirrors.ustc.edu.cn/CPAN/authors/id/D/DO/DORMANDO/MogileFS-Server-2.72.tar.gz
[root@node1 ~]# tar xf MogileFS-Server-2.72.tar.gz
[root@node1 ~]# cd MogileFS-Server-2.72
[root@node1 MogileFS-Server-2.72]# perl Makefile.PL
[root@node1 MogileFS-Server-2.72]# make && make install
2)完成配置
创建配置文件目录并添加配置文件:
[root@www ~]# mkdir /etc/mogilefs
[root@node1 ~]# vim /etc/mogilefs/mogilefsd.conf
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=192.168.1.134;port=3306;mysql_connect_timeout=5 #连接数据库的信息
db_user = mogilefs #数据库上的用户名
db_pass = mogilefs #用户名对应的密码
listen = 0.0.0.0:7001 #监听的地址和端口
conf_port = 7001
query_jobs = 10 #用于查询的进程数
delete_jobs = 1 #用于删除操作的进程数
replicate_jobs = 5 #用于复制的进程数
reaper_jobs = 1 #用于回收资源的进程数
在数据库节点上创建数据库,并授权用户:
MariaDB [(none)]> create database mogilefs;
Query OK, 1 row affected (0.04 sec)
MariaDB [(none)]> grant all on mogilefs.* to ‘mogilefs’@’192.168.%.%’ identified by ‘mogilefs’;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
初始化数据库:
[root@node1 ~]# mogdbsetup –dbhost=192.168.1.134 –dbname=mogilefs –dbuser=mogilefs –dbpass=mogilefs –dbrootpass=mogilefs
若出现如下错误,是没有安装perl连接mysql的驱动引起的,安装perl-DBD-MySQL即可。
Failed to load MogileFS::Store::MySQL: Can’t locate DBD/mysql.pm in @INC (@INC contains: lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/share/perl5/MogileFS/Store/MySQL.pm line 5………
……..
###########################################
[root@node1 ~]# yum install perl-DBD-MySQL
3)启动服务
mogilefsd不能以root身份运行,必须用其他用户运行,为此添加mogilefs用户,然后启动服务:
[root@node1 ~]# useradd -r mogilefs
[root@node1 ~]# su – mogilefs -c “mogilefsd -c /etc/mogilefs/mogilefsd.conf –daemon”
更好的方式是添加服务脚本,然后通过脚本启动服务。
这里有一项需要注意,Sys::Syscall的0.25版本存在bug,在文件系统运行过程中,向文件系统上添加数据,其不会按照默认策略保留2个副本,默认策略如下:
上传的文件信息:
可以看到,数据仅有一份,保存在192.168.1.127节点上。Sys::Syscall的0.25版本为最新版本,使用cpan默认安装的就是这个版本,降级到0.23版本即可,或者直接下载安装0.23版本。
wget http://mirrors.ustc.edu.cn/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz
###############################
perl Makefile.PL
make && make install
部署Storage Nodes
1)安装程序包(与上述一致)
[root@node2 ~]# cpan Sys::Syscall
[root@node2 ~]# cpan IO::WrapTie
[root@node2 ~]# cpan Danga::Socket
[root@node2 ~]# cpan IO::AIO
[root@node2 ~]# cpan MogileFS::Client
[root@node2 ~]# cpan Net::Netmask
[root@node2 ~]# cpan Perlbal
[root@node2 ~]# cpan MogileFS::Server
2)完成配置
创建目录并添加配置文件:
[root@node2 ~]# mkdir /etc/mogilefs
[root@node2 ~]# vim /etc/mogilefs/mogstored.conf
maxconns = 10000 #最大并发连接数
httplisten = 0.0.0.0:7500 #http监听的地址
mgmtlisten = 0.0.0.0:7501 #管理接口监听地址
docroot = /mogdata/data #用于存储的目录
添加,挂载分区,根据/etc/mogilefs/mogstored.conf中的docroot配置信息添加目录,并修改属主属组:
[root@node2 ~]# fdisk /dev/sdb
[root@node2 ~]# mkfs -t ext4 -b 4096 /dev/sdb1
[root@node2 ~]# mkdir -pv /mogdata/data
mkdir: created directory `/mogdata’
mkdir: created directory `/mogdata/data’
[root@node2 ~]# mount /dev/sdb1 /mogdata/data/
[root@node2 ~]# chown -R mogilefs.mogilefs /mogdata/
3)启动服务
添加用户,启动服务(同上述一样,最好使用脚本):
[root@node2 ~]# useradd -r mogilefs
[root@node2 ~]# su – mogilefs -c “mogstored -c /etc/mogilefs/mogstored.conf –daemon”
安装MogileFS-Utils管理MogileFS
在控制节点上安装MogileFS-Utils,可用于添加host,device,domain,class等管理操作。
[root@node1 ~]# cpan MogileFS::Utils
或者
[root@node1 ~]# wget http://mirrors.ustc.edu.cn/CPAN/authors/id/D/DO/DORMANDO/MogileFS-Utils-2.29.tar.gz
[root@node1 ~]# tar xf MogileFS-Utils-2.29.tar.gz
[root@node1 ~]# cd MogileFS-Utils-2.29
[root@node1 MogileFS-Utils-2.29]# perl Makefile.PL
[root@node1 MogileFS-Utils-2.29]# make && make install
建议直接使用cpan安装,可自动安装依赖的包。
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2015-09/122947p2.htm
基于nginx访问MogileFS
Storge Node支持将上面存储的数据以http模式的接口输出,客户端跟Storge Node进行交互的时,通常需要基于MogileFS提供的API编程之后,通过程序和storge通信。nginx上的nginx_mogilefs模块就是这样的一个程序,用nginx作为MogileFS的反向代理,用户只要把需要访问的资源以url的形式向nginx请求,既能够得到需要的资源。
nginx_mogilefs工作原理:mogielfs为nginx的第三方模块,该模块能够自动工作在nginx上,解码用户请求的url,把url中的一部分作为domain,一部分作为key发送给Tracker,Tracker将检索到的fid返回给mogielfs模块,mogielfs利用这个fid与Storge Nod交互取得数据,并将取得的数据返回给客户端。nginx也能够接受用户的上传文件请求,把对应的url解析成domain和key,并且将文件根据Tracker的指示存储在某个store节点上。
nginx_mogilefs_module模块的下载地址:http://www.grid.net.ru/nginx/mogilefs.en.html
实验拓扑图
配置多个Tracker,利用nginx实现负载均衡,建议在实际环境中将数据库节点配置成高可用集群,这里为了方便仅配置一个节点。
配置过程
1)首先在4个节点上按照上述方式部署Tracker和Storage,并将Tracker连接上数据库
两个Tracker连接同一个数据库。
2)配置MogileFS环境
向Tracker添加各设备:
[root@node1 ~]# mogadm –trackers=192.168.1.126:7001 host add node1 –ip=192.168.1.106 –status=alive
[root@node1 ~]# mogadm –trackers=192.168.1.126:7001 host add node2 –ip=192.168.1.126 –status=alive
[root@node1 ~]# mogadm –trackers=192.168.1.106:7001 host add node3 –ip=192.168.1.127 –status=alive
[root@node1 ~]# mogadm –trackers=192.168.1.106:7001 host add node4 –ip=192.168.1.131 –status=alive
[root@node1 ~]# mogadm –trackers=192.168.1.106:7001 host list #查看添加的主机
添加设备(需要在配置文件中docroot参数指定的目录下创建对应的目录,例如添加的设备号为1,则添加的目录名的dev1):
[root@node1 ~]# mogadm –trackers=192.168.1.106:7001 device add node1 1 –status=alive
[root@node1 ~]# mogadm –trackers=192.168.1.106:7001 device add node2 2 –status=alive
[root@node1 ~]# mogadm –trackers=192.168.1.106:7001 device add node3 3 –status=alive
[root@node1 ~]# mogadm –trackers=192.168.1.106:7001 device add node4 4 –status=alive
在各个Storage Node上创建对应的目录:
Storage Node1上
[root@node1 ~]# mkdir /mogdata/data/dev1/
[root@node1 ~]# chown -R mogilefs.mogilefs /mogdata/
##################
Storage Node2上
[root@node2 ~]# mkdir /mogdata/data/dev2/
[root@node1 ~]# chown -R mogilefs.mogilefs /mogdata/
………
………
检查状态:mogadm –trackers=192.168.1.106:7001,192.168.1.126:7001 check
添加名称空间:
[root@node1 ~]# mogadm –trackers=192.168.1.106:7001 domain add file
添加class:
[root@node1 ~]# mogadm –trackers=192.168.1.106:7001 class add file bigimg
3)安装配置nginx
[root@www ~]# tar xf nginx-1.8.0.tar.gz
[root@www ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz #使用1.0.4版本
[root@www ~]# yum install pcre-devel
[root@www ~]# cd nginx-1.8.0
[root@node2 ~]# ./configure \
–prefix=/usr/local/nginx \
–conf-path=/etc/nginx/nginx.conf \
–error-log-path=/var/log/nginx/error.log \
–http-log-path=/var/log/nginx/access.log \
–pid-path=/var/run/nginx/nginx.pid \
–lock-path=/var/lock/nginx.lock \
–user=nginx \
–group=nginx \
–with-http_ssl_module \
–with-http_flv_module \
–with-http_stub_status_module \
–with-http_gzip_static_module \
–http-client-body-temp-path=/usr/local/nginx/client/ \
–http-proxy-temp-path=/usr/local/nginx/proxy/ \
–http-fastcgi-temp-path=/usr/local/nginx/fcgi/ \
–http-uwsgi-temp-path=/usr/local/nginx/uwsgi \
–http-scgi-temp-path=/usr/local/nginx/scgi \
–with-pcre \
–with-debug \
–add-module=/root/nginx_mogilefs_module-1.0.4 \ #添加第三方模块
###############################
[root@www nginx-1.8.0]# make && make install
[root@www nginx-1.8.0]# useradd -r nginx
添加服务脚本:
……………..
[root@www ~]# chmod +x /etc/init.d/nginx
[root@www ~]# chkconfig –add nginx
配置nginx.conf,Tracker无需去维持用户会话,前端的nginx在负载均衡时简单的做加权轮询即可:
[root@node2 nginx]# vim nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream trackers {
server 192.168.1.106:7001 weight=1; #指定两个Tracker
server 192.168.1.126:7001 weight=1;
}
server {
listen 80;
server_name localhost;
location /file {
mogilefs_tracker trackers;
mogilefs_domain file; #指定domain
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置完成后启动服务。
[root@www ~]# service nginx start
#########################
[root@www ~]# ansible tracker -m service -a ‘name=mogilefsd state=started enabled=yes’
[root@www ~]# ansible storage -m service -a ‘name=mogstored state=started enabled=yes’
进行测试
上传一张图片:
[root@www ~]# mogupload –trackers=192.168.1.106:7001 –domain=file –class=bigimg –key=’hello.jpg’ –file=’/root/Public/24_P.jpg’
访问资源:
停止192.168.1.106上的mogilefsd和mogstored服务:
[root@node1 ~]# service mogilefsd stop
Stopping mogilefsd [ OK ]
[root@node1 ~]# service mogstored stop
Stopping mogstored [ OK ]
资源能够继续访问,测试完成……………..^_^
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-09/122947.htm