MogileFS:是一个开源的分布式存储,适用于存储海量的小文件。由LiveJournal旗下的Danga Interactive。这个公司还有memcache , MogileFS, Perlbal(http代理)等产品。其特点如下:
1,工用于应用层(用户空间):无须特殊的核心组件,因为基于http或都nfs,一般客户端都支持。
2,无单点故障所在,假设MySQL已经高可用并且tracker为多个节点。因为MySQL是否高可用,取决于MySQL。
3,自动文件复制,用户在上传一份数据都,tracker会根据设定好的策略自动复制一份或多份其它节点。假如其中一个节点故障,tracker会自动把数据复制一份,做到数据一直有冗余。如果使用中增加一个节点,需要手动做策略把那些节点的数据与新加入的节点做平均。
4,比“RAID”好多了,因为其实现了主机间的冗余。官方就这么解释的!
5,传输中立,无特殊协议。传输中用的是http协议或nfs协议。
6,命名空间比较简单。使用域(domain)来表示名称空间的。每个文件对应于一个KEY,文件存储的机制是一个值。是以 key-value 对儿在任的。KEY是一个全局名称空间,可以使用domain模拟实现目录级别,也可以把所有文件放在一个平面。
7,不依赖于任何共享存储设备。使用系统上的一般存储就可以。
MogileFS的组件:
跟踪节点,Tracker : Mogilefsd进程,主控制进程,。其实现的功能包括:文件的复制,文件的删除,查询文件是否存储,监控一个文件存储的位置是否正常等等。这个进程工作于元数据节点。
存储节点(storage nodes),由mogstored进程监听于套接字上。文件实际存储的位置。其实质上是一个http服务器。基于WebDAV模式工作。能够实现创建,删除,重命名等操作。其实现方式是把一个大容量的磁盘挂载上,然后上传下载数据。
MySQL节点:用于为tracker存储元数据信息:为mogilefs的名称空间及文件名。
MogileFS自带了很多管理文件的工具。
安装配置过程。
安装完成后,需要在mysql为mogliefs授权一个用户,让其对mogilefs库有全部权限。此数据库主要用来存储node数据。如果tracker与mysql在一台服务器上,需要对本机的主机名进行授权。
MariaDB [mogilefs]> grant all on *.* to 'root'@'172.16.2.%' identified by 'mogpass';
MariaDB [mogilefs]> grant all on *.* to 'mogilefs'@'172.16.2.%' identified by 'mogpass';
MariaDB [mogilefs]> grant all on *.* to 'root'@'firewall' identified by 'mogpass';
MariaDB [mogilefs]> grant all on *.* to 'root'@'172.16.2.%' identified by 'mogpass';
MariaDB [mogilefs]> flush privileges;
注:如果tracker与mysql在一个节点上,需要为本机的主机名授权,因为mysql在验证时会验证主机名。
msql授权完成后,在tracker上初始化数据库
# mogdbsetup --dbhost=172.16.2.13 --dbport=3306 --dbname=mogilefs --dbrootuser=root --dbrootpass=mogpass --dbuser=moguser --dbpass=mogpass
修改配置文件 ,大概如下:
# grep '^[^#]' /etc/mogilefs/mogilefsd.conf
daemonize = 1 #是否运行为守护进程,1表示为真
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=172.16.2.13 #指定连接数据库,mogilefs为数据库名。
db_user = moguser 连接mysql时使用的用户
db_pass = mogpass 连接mysql时使用的密码
listen = 172.16.2.16:7001 tracker端监听的ip和tcp端口,默认就是7001
conf_port = 7001
query_jobs = 10 最多的查询线程数
delete_jobs = 1 用于删除文件的线程数最多有几个。1 比较妥当
replicate_jobs = 5
reaper_jobs = 1
min_free_space = 200 最小的利于空间,以m为单位
# service mogilefsd start
# chkconfig mogilefsd on 确保tracker的服务能开机自动启动
# ss -tnl 查看是否有7001端口处于监听
mogilefd配置端口处理监听后,到mogstor上安装配置。第个存储节点都需要执行下面的操作
# yum -y install perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm
# yum -y install perl-IO-AIO 这个模块必须要安装。
把准备用于存储的磁盘格式化挂载,把用户和组都设置为mogilefs。然后修改配置文件/etc/mogilefs/mogstored.conf
maxconns = 10000 最大并发连接数
httplisten = 172.16.2.100:7500 监听地址
mgmtlisten = 172.16.2.100:7501 管理地址
docroot = /mogiled/data 文件存储的位置,生产环境中应当为挂载的整个磁盘。
# mkdir -pv /mogiled/data && chwon -R mogilefs.mogilefs /mogiled/data
# service mogstored star 如果启动不了,可能是mogilefs用户没有创建。添加用户就可以了。
# chkconfig mogstroed on 让存储服务开机自动启动。
# ss -tnl 查看配置文件中定义的端口是否启动。
数据存储端配置好后到tracker 上把存储端加入到本分布式系统中。有多少个就加多少个。输入mogadm 就会显示这命令的使用方法。这个命令可以
# mogadm --trackers=172.16.2.16:7001 host add s2 --ip=172.16.2.100 --status=alive
# mogadm --trackers=172.16.2.16:7001 host list
添加好节点后为各个节点添加设备
# mogadm --trackers=172.16.2.16:7001 device add s3 dev3
# mogadm --trackers=172.16.2.16:7001 device list 如果像下面显示,没有显示容量等信息,说明mogstored端存储目录下没有与设备ID同名的目录,且这个目录的属主和属组应当为mogliefs
# mogadm --trackers=172.16.2.16:7001 device summary 查看各个设备的摘要信息。
注:如果显示不出设备的摘要信息,需要在各个存储节点下 docroot = /mogiled/data 所指定的路径下创建一个名字与设备名同名的目录,并且属主和属组是 mogilefs。
# mogadm --trackers=172.16.2.16:7001 device list
添加domain domain是用来创建名称空间的,每个文件都需要用key来标记,每个文件在名称必须惟一。
# mogadm --trackers=172.16.2.16:7001 domain add "p_w_picpaths"
# mogadm --trackers=172.16.2.16:7001 domain list
class 是mogilefs中最小的复制单位。创建class如果有需要可以指定复本存储几份。
上传文件测试,在任意一台节点上执行都可以。
# mogupload --trackers=172.16.2.16:7001 --domain=/p_w_picpaths/ --key='/p_w_picpaths/bg.png' --file='/usr/share/backgrounds/default.png'
# mogfileinfo --trackers=172.16.2.16:7001 --domain=/p_w_picpaths/ --key='/p_w_picpaths/bg.png'
复制红框里的任意一条到浏览器中访问,可以访问到此文件了。
由于存储节点的mogiled使用的是 WebDAV机制,它允许使用http的 put , delete方法管理文件。这里全用curl模仿一下。
其它的命令
mogfetch 下载文件
mogupload 上传文件
mogrename 生命名
moglistkey 例出所有的key
# moglistkeys --trackers=172.16.2.16:7001 --domain=test
# moglistkeys --trackers=172.16.2.16:7001 --domain=test --key_prefix='/p_w_picpaths' 查看以p_w_picpaths开头的。
# mogstats --db_dsn="DBI:mysql:mogilefs:host=172.16.2.13" --db_user="moguser" --db_pass="mogpass" --verbose 查看数据库中主机信息,domain,class,文件个数等。
让nginx代理mogilefs
编译安装
# yum -y groupinstall "Development tools" "Server Platform Development"
# yum -y install gcc
# yum -y install pcre-devel
# yum -y install bzip2-devel
# wget http://www.grid.net.ru/nginx/download/nginx_mogilefs_module-1.0.4.tar.gz
# wget http://nginx.org/download/nginx-1.7.3.tar.gz
# tar -xvf nginx_mogilefs_module-1.0.4.tar.gz
# tar -xvf nginx-1.7.3.tar.gz
# cd nginx-1.7.3
# ./configure --prefix=/usr/local/ --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/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/uwscgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre --with-debug --add-module=../nginx_mogilefs_module-1.0.4
--add-module=../nginx_mogilefs_module-1.0.4 用来添加模块的选项
注:用nginx_mogilefs_module-1.0.4版本,1.0.2有问题。
# make && make install
# useradd -r nginx
# vim /etc/init.d/nginx 提供一个服务管理脚本
官方提供的适用于red hat 系统的脚本:http://wiki.nginx.org/RedHatNginxInitScript
# chmod +x /etc/init.d/nginx
# service nginx start
# vim nginx.conf
官方 配置说明 http://www.grid.net.ru/nginx/mogilefs.en.html
本次实验的配置
----------------------------------------------------------------------------------------
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream trackers { 定义后端的服务器组
server 172.16.2.10:7001;
server 172.16.2.14:7001;
server 172.16.2.16:7001;
}
server {
listen 80;
server_name localhost;
client_max_body_size 500m; 允许客户端上传文件最大为500M
location / {
root html;
index index.html index.htm;
}
location /file { 定义一个URL,对此URL使用mogilefs模块
mogilefs_tracker trackers; 调用后端服务器
mogilefs_domain file;
mogilefs_methods GET DELETE; 允许使用的方法,由于这个版本的nginx不支持上传,所以没写put
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
location /p_w_picpaths {
mogilefs_tracker trackers;
mogilefs_domain p_w_picpaths;
mogilefs_methods GET DELETE;
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;
}
}
-------------------------------------------------------------------------
测试阶段
上传一个文件
# mogupload --trackers=172.16.2.10:7001 --domain=p_w_picpaths --key='/test.jpg' --file='/usr/share/backgrounds/centos_1920x1200_logoonly.jpg'
在浏览器中使用http://172.16.2.18/p_w_picpaths/test.jpg访问。
使用crul模拟测试删除文件。
# curl -X DELETE http://172.16.2.18/p_w_picpaths/test.jpg