mogilefs,分布式文件系统,适合海量小文件的分布式存储,将数据分块存储,分别存储到不同的存储节点,每块数据存储多份,实现了数据的冗余备份,在数据访问时,降低了单个节点的I/O读写。
mogilefs分五部分:
1:数据库
数据库存储着mogilefs的元数据,mogilefs的tracker节点就是根据数据库存储的元数据信息来告诉请求用户的资源存储位置。如果数据库出现了问题那么整个mogilefs文件系统将都会瘫掉。
2:tracker 跟踪器 相应的进程是mogilefsd
tracker的作用:
* Replication:机器间复制文件
* Deletion:从命名空间删除是立即的,从文件系统删除是异步的
* QueryWorker:响应客户端的请求
* Reaper:在磁盘失败后将文件复制请求重新放到队列中
3:storage 存储节点 相应的进程是mogstored
数据存都是存储在storage节点上,可以有多个,存储节点需要定义设备device,每个设备都有一个唯一的ID号
4:工具
主要就是mogadm,mogtool这两个工具了,用来在命令行下控制整个mogilefs系统以及查看状态等等。
5:客户端
客户端通过接口访问mogilefs系统,对整个系统进行文件读写操作。
mogielfs的搭建:
(1)数据库的安装
参考博文http://aperson.blog.51cto.com/3480661/1393120
(2)mogilefs的安装
首先要安装perl# yum install perl
安装mogilefs相关模块
Sys-Syscall-0.25.tar.gz BSD-Resource-1.2907.tar.gz DateTime-HiRes-0.01.tar.gz Danga-Socket-1.61.tar.gz Net-Netmask-1.9019.tar.gz IO-AIO-Util-0.09.tar.gz Perlbal-1.74.tar.gz String-CRC32-1.5.tar.gz Gearman-1.09.tar.gz Gearman-Client-Async-0.94.tar.gz Gearman-Server-1.09.tar.gz DBI-1.631.tar.gz DBD-mysql-4.027.tar.gz MogileFS-Client-1.17.tar.gz mogilefs-server-2.07.tar.gz IO-Compress-Base-2.015.tar.gz Compress-Raw-Zlib-2.065.tar.gz IO-Compress-Zlib-2.015.tar.gz Bundle-Compress-Zlib-2.064.tar.gz IO-stringy-2.110.tar.gz Compress-Raw-Zlib-2.065.tar.gz
安装方法:
# tar xf Sys-Syscall-0.25.tar.gz # cd Sys-Syscall-0.25 # perl Makefile.PL # make # make install
mogilefs stracker 的安装
# wget http://search.cpan.org/CPAN/authors/id/D/DO/DORMANDO/MogileFS-Server-2.44.tar.gz # tar zxvf MogileFS-Server-2.44.tar.gz # cd MogileFS-Server-2.44 # perl Makefile.PL # make # make install
mogilefs storage 存储节点的安装
除了DBD-mysql-4.027.tar.gz不需要安装,别的都要重新装一遍。如果在同一台主机,装一遍即可。
mogilefs的配置:
Mysql的配置:
授权两个账号,root创建数据库mogilefs,moguser连接数据库mogilefs。
grant all on *.* to 'root'@'172.16.%.%' identified by 'redhat'; grant all on mogilefs.* to 'moguser'@'172.16.%.%' identified by 'mogpass'; flush privileges;
tracker的配置:
编辑配置文件/etc/mogilefs/mogilefsd.conf修改几个参数
db_dsn = DBI:mysql:mogilefs:host=172.16.249.81 ---修改数据库名为mogilefs,host为数据库所在的主机地址 db_user = moguser 连接数据库的用户名,必须是授权的那个 db_pass = mogpass 连接数据库的用户密码 listen = 172.16.249.77:7001 修改监听地址为tracker所在主机地址。
创建数据库连接:
# mogdbsetup --dbhost=172.16.249.81 --dbport=3306 --dbname=mogilefs --dbuser=moguser --dbpass=mogpass --yes
mogilefs的启动与停止
由于mogilefs不能以root用户运行,创建mogile用户
# Useradd mogile �Cs /sbin/nologin
# su mogile �Cc “mogilefsd -c /etc/mogilefs/mogilefsd.conf --daemon”
使用pkill mogilefsd 来停止mogilefs 服务
也可以提供服务脚本启动
#!/bin/bash # Author: MageEdu <[email protected]> # 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" &> /dev/null 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
mogilefs storage的配置:
# vim /etc/mogilefs/mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /var/mogdata # mkdir /var/mogdata # chown -R mogilefs.mogilefs /var/mogdata
mogilefs storage 启动
Mogstored �Cdaemon ---启动 pkill mogstored ---停止
提供服务脚本:
#!/bin/bash # Author: MageEdu <[email protected]> # 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
mogilefs的管理配置
先介绍几个命令:
mogadm:
mogadm host ... ---添加存储节点到tracker host add ... Add a host to MogileFS. host delete ... Delete a host. host list List all hosts. host mark ... Change the status of a host. (equivalent to 'modify --status') host modify ... Modify a host's properties. mogadm device ... ---添加设备 device add ... Add a device to a host. device list ... List all devices, for each host. device mark ... Mark a device as {alive,dead,down,drain,readonly} device modify ... Modify a device's properties. device summary ... List the summary of devices, for each host. mogadm domain ... 添加域 domain add ... Add a domain (namespace) domain delete ... Delete a domain. domain list List all hosts. mogadm class ... 添加class,mogilefs的最小复制单元 class add ... Add a file class to a domain. class delete ... Delete a file class from a domain. class list List all classes, for each domain. class modify ... Mo
在添加device的时候,最好是先在存储节点创建ID号对应的存储单元。
修改属主属组:添加设备到trackers
# chown -R mogilefs.mogilefs /var/mogdata/dev1/ # mogadm --trackers=172.16.249.77:7001 device add 172.16.249.77 001 --status=alive # chown -R mogilefs.mogilefs /var/mogdata/dev2/ # mogadm --trackers=172.16.249.77:7001 device add 172.16.249.46 002 --status=alive
查看:
domain的创建
class的创建:
上传文件:
# mogupload --trackers=172.16.249.77:7001 --domain=images -key='/tupian/1.png' -file='/usr/share/backgrounds/default.png' # mogupload --trackers=172.16.249.77:7001 --domain=html --key='/wenjian/fstab' --file='/etc/fstab' 查看key # moglistkeys --trackers=172.16.249.77:7001 --domain=html /wenjian/fstab 查看上传的文件信息: # mogfileinfo --trackers=172.16.249.46:7001 --domain=html --key='/wenjian/fstab'
编译安装Nginx,需添加一个模块Nginx_mogilefs_module
下载此模块,并unzip解压,编译nginx的时候需要指定解压目录
http://www.grid.net.ru/nginx/download/nginx_mogilefs_module-1.0.4.zip
编译:记得要先安装pcre-devel
./configure \ --prefix=/usr \ --sbin-path=/usr/sbin/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=/var/tmp/nginx/client/ \ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ --http-scgi-temp-path=/var/tmp/nginx/scgi \ --with-pcre \ --with-debug \ --add-module=/usr/local/nginx-mogilefs-module-master
为nginx提供配置脚本 加到服务中:chkconfig --add nginx
参考博文http://aperson.blog.51cto.com/3480661/1403805
测试:
编辑Nginx的配置文件:
location / { root html; index index.html index.htm; } location /images/ { mogilefs_tracker 172.16.249.77:7001; mogilefs_domain images; mogilefs_noverify on; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-type; proxy_buffering off; } } location ~* ^(/wenjian/.*)$ { mogilefs_tracker 172.16.249.46:7001; mogilefs_domain html; mogilefs_noverify on; mogilefs_pass $1 { proxy_pass $mogilefs_path; proxy_hide_header Content-type; proxy_buffering off; } }
两种访问方式是不一样的,第一个访问图片的时候是把/images/作为起始目录,也是最终目录,其后面直接跟请求资源,不可以在跟别的目录下的资源
如果/images后面没有/即:
location /images { mogilefs_tracker 172.16.249.77:7001; mogilefs_domain images; mogilefs_noverify on; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-type; proxy_buffering off; } }
第二个是匹配文件访问的location配置:是将/后的所有url做为Key传递给mogilefs.而且是以/wenjian/开头的文件才可以被访问到
]# mogupload --trackers=172.16.249.77:7001 --domain=html --key='/wenjian/a.html' --file='/etc/issue'
OK,mogilefs的部署,以及基于Nginx的代理访问都已实现,不足之处很多,希望大家多多提出宝贵的意见。一起学习。