系统环境

1.系统环境:   # uname -smr   Linux 2.6.32-504.23.4.el6.centos.plus.x86_64 x86_64   # cat /etc/issue   CentOS release 6.6 (Final) 2.MogileFS规划:   数据库 (MySQL):192.168.10.241             (储存MogileFS元数据)   管理节点(tarckers):192.168.10.200:7001    (负责MogileFS的调度,管理)   存储节点(storage1):192.168.10.220:7500    (存储文件)   存储节点(storage2):192.168.10.231:7500    (存储文件)   反向代理服务器(Nginx):192.168.10.231:8080   (为MogileFS的Tracker提供反向代理服务)

1.特性

1).工作于应用层:无需特殊的核心组件;2).单点:三大组件(tracker,mogstore,database)皆可实现高可用;3).自动文件复制:复制的最小单位不是文件,而是class;基于不同的class,文件可以被自动的复制到多个有足够存储空间的存储节点上;4).传输中立,无特殊协议:可以通过NFS或HTTP协议进行通信;5).简单的命名空间:文件通过一个给定的key来确定,是一个全局的命名空间;没有目录,基于域实现文件隔离;6).不共享数据:无需通过昂贵的SAN来共享磁盘,每个存储节点只需维护自己所属的存储设备(device)

2.MogileFS架构(如果数据量较大可以对MySQL做主从,并使用amoeba实现读写分离)

Tracker:MogileFS的核心,是一个调度器;服务进程为mogilefsd;可以做负载均衡调度;

  • 主要职责有:

  • 数据删除;

  • 数据复制;

  • 监控:故障后生成新的数据副本;

  • 查询;

Database:Tracker访问Database,返回用户可用的Storage Node及文件的存放位置;

mogstored:数据存储的位置,通常是一个HTTP(WebDAV)服务器,用于数据的创建、删除、获取等;不可做负载均衡调度;

3. 组成

MogileFS由3部分组成:

    server:主要包括mogilefsd和mogstored两个应用程序。

  • mogilefsd实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、host等;

  • mogstored是存储节点(store node),它其实是个WebDAV服务,默认监听在7500端口,接受客户端的文件存储请求。

    Utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等;

  • 在MogileFS安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控;

    客户端API:MogileFS的客户端API很多,例如Perl、PHP、Java、Python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等;

4.  安装部署MogileFS(在192.168.10.220和192.168.100.231执行相同操作

1.  安装MogileFS分布式文件系统    yum install perl perl-YAML	cpan -I Danga::Socket	cpan -I IO::AIO	cpan -I  Net::Netmask 	cpan -I Perlbal	cpan -I DBD::mysql	cpan -I IO::WrapTie		tar xf MogileFS-Client-1.17.tar.gz 	cd MogileFS-Client-1.17	perl Makefile.PL 	make && make install	tar xf MogileFS-Server-2.72.tar.gz	perl Makefile.PL	make	make install	cpan -I  MogileFS::Utils2.  MogileFS不能以root用户启动,必须为Mogilefs创建用户		useradd mogilefs  3. 增大打开文件数,并且重启服务器(默认1024)	vim /etc/security/limits.conf  	*       soft    nofile          65535	*       hard    nofile          65535	4. 准备存储设备	mkdir /etc/mogilefs	mkdir -p /data/mogdata/dev1	将添加一块磁盘挂载至/data/mogdata/dev1	chown -R mogilefs /data/mogdata/dev15. 为MogileFS提供配置文件		# vim /etc/mogilefs/mogilefsd.conf #MogileFS(调度节点或管理节点)的配置文件	daemonize = 1	db_dsn = DBI:mysql:mogilefs:host=192.168.10.241;port=3306;mysql_connect_timeout=5	db_user = mogilefs	db_pass = mogilefs	trackers = 192.168.10.241	conf_port = 7001	listener_jobs = 5	node_timeout = 5	rebalance_ignore_missing = 1	query_jobs = 10	delete_jobs = 1	replicate_jobs = 5	reaper_jobs = 1		# vim /etc/mogilefs/mogilefs.conf #该文件在MogileFS的家目录下	trackers = 192.168.10.220:7001			# vim /etc/mogilefs/mogstored.conf #MogileFS的Storage(存储节点)的配置文件	maxconns = 10000	httplisten=0.0.0.0:7500	mgmtlisten=0.0.0.0:7501	docroot=/data/mogdata		chown -R mogilefs /etc/mogilefs/	6. 部署数据库,参照以前文章,配置数据库,保存MogileFS的元数据		创建数据库	mysql> CREATE DATABASE mogilefs;	mysql> GRANT ALL ON mogilefs.* TO 'mogilefs'@'%' IDENTIFIED BY 'mogilefs';	mysql> FLUSH PRIVILEGES;	mysql> quit		初始化Mogilefs存储元数据的数据库(执行一次即可)	$ mogdbsetup --dbhost=192.168.10.241 --dbname=mogilefs --dbuser=mogilefs --dbpassword=mogilefs --yes		启动Trackers	$ mogilefsd 		启动Storage	$ mogstored -d

5.  向MogileFS的Trackers节点添加host(主机),device(设备),domain(域),class(文件的最小复制单位)

添加节点	$ mogadm --trackers=192.168.10.220:7001 host add 192.168.10.220 --ip=192.168.10.220 --status=alive	$ mogadm --trackers=192.168.10.220:7001 host add 192.168.10.231 --ip=192.168.10.231 --status=alive	$ mogadm host list # 查看已添加节点		添加设备	$ mogadm device add 192.168.10.220 1	$ mogadm device add 192.168.10.231 2	$ mogadm device list # 查看已添加设备		在192.168.10.231 创建设备	mkdir -p /data/mogdata/dev2	chown -R mogilefs /data/mogdata/dev2		$ mogadm device list	192.168.10.220 [1]: alive                    used(G)    free(G)   total(G)  weight(%)    dev1:   alive      0.021      9.200      9.222        100	192.168.10.231 [2]: alive                    used(G)    free(G)   total(G)  weight(%)    dev2:   alive     16.371      9.725     26.096        100      添加domain(域):   $  mogadm domain add p_w_picpaths   $ mogadm domain list	 domain               class                mindevcount   replpolicy   hashtype	-------------------- -------------------- ------------- ------------ -------	 p_w_picpaths               default                   2        MultipleHosts() NONE      添加class(文件类别)   $ mogadm class add p_w_picpaths upload1 --mindevcount=2 # 在域p_w_picpaths中添加类别upload和upload2,最小文件复制份数为2   $ mogadm class add p_w_picpaths upload2 --mindevcount=2      测试文件   $ mogtool  --trackers=192.168.10.220:7001 --domain=p_w_picpaths inject /home/mogilefs/1.jpeg "1.jpeg"   $ mogtool  --trackers=192.168.10.220:7001 --domain=p_w_picpaths  inject  /home/mogilefs/2.jpg "/2.jpg"   $ moglistkeys   --domain=p_w_picpaths                              	/2.jpg	1.jpeg	   查看文件信息    $ mogfileinfo --domain=p_w_picpaths --key='fish.jpg'    - file: fish.jpg     class:              default     devcount:                    2     domain:               p_w_picpaths     fid:                   15     key:             fish.jpg     length:                50040     - http://192.168.10.220:7500/dev1/0/000/000/0000000015.fid     - http://192.168.10.231:7500/dev2/0/000/000/0000000015.fid

6.  通过Python脚本实现MogileFS文件的迁移,也可以结合Rsync实现备份

#!/usr/bin/python# Author:zhooukanggen# Dump File  of  MogileFS import subprocessimport time def MogileFS_Dump():    moglistkeys = '/usr/local/bin/moglistkeys --trackers=127.0.0.1:7001 --domain=common_raw'     Rest = subprocess.Popen([moglistkeys],stdout=subprocess.PIPE,shell=True).communicate()[0].split('\n')     for i in Rest:        status = subprocess.call(['/usr/local/bin/mogfetch','--trackers=127.0.0.1:7001','--domain=common_raw','--key=' + i,'--file=./' + i])	    time.sleep(1)	    if status == 0:	        print "Success"	    else:	        print "Fail" MogileFS_Dump()	#导出文件					def MogileFS_Upload():    Upload = subprocess.Popen(['ls -1 /home/web/mogilefs'],stdout=subprocess.PIPE,shell=True).communicate()[0].split('\n')[:-1]		    for i in Upload:        status = subprocess.call(['/usr/local/bin/mogupload','--trackers=192.168.10.220:7001','--domain=p_w_picpaths','--key=' + i,'--file=/home/web/mogilefs/' + i])	    time.sleep(5)	    if status == 0:	        print "Success"	    else:	        print "Fail"  MogileFS_Upload() #导入文件

7.  使用nginx作为MogileFS的反向代理

1. 安装nginx# wget  # wget   # tar xf nginx-1.8.0.tar.gz  # tar xf nginx_mogilefs_module-1.0.4.tar.gz  # cd nginx-1.8.0 ./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=/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=../nginx_mogilefs_module-1.0.4     # make && make install  2. 配置nginx作为MogileFS的反向代理     worker_processes  1;     events {        worker_connections  1024;    }      http {        include       mime.types;        default_type  application/octet-stream;         log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                          '$status $body_bytes_sent "$http_referer" '                          '"$http_user_agent" "$http_x_forwarded_for"';         sendfile        on;        tcp_nopush     on;         keepalive_timeout  65;            fastcgi_cache_path /var/tmp/nginx/fcgi levels=1:2 keys_zone=fcgicache:10m inactive=5m;         server {            listen       8080;            server_name  localhost;             location / {                root   html;                index  index.html index.htm;            }             error_page  404              /404.html;             error_page   500 502 503 504  /50x.html;            location = /50x.html {                root   html;            }             location /p_w_picpaths/ {                 mogilefs_tracker 192.168.10.220:7001;                mogilefs_domain p_w_picpaths;	        mogilefs_noverify on;                mogilefs_pass  {                    proxy_pass $mogilefs_path;                    proxy_hide_header Content-Type;                    proxy_buffering off;                }            }         }      }     3. 启动nginx # /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf

8. 验证:

检查MogileFS$ mogadm checkChecking trackers...    192.168.10.220:7001 ... OK   Checking hosts...    [ 1] 192.168.10.220 ... OK    [ 2] 192.168.10.231 ... OK   Checking devices...      host device    size(G)    used(G)    free(G)   use%   ob state   I/O%    ---- ------------ ---------- ---------- ---------- ------ ---------- -----              [ 1] dev1     9.222      0.040       9.182    0.43%    writeable   0.0      [ 2] dev2     26.096     16.389      9.707    62.80%   writeable   N/A      ---- ------------ ---------- ---------- ---------- ------                             total:    35.318     16.429     18.889  46.52%                获取详细状态$ mogstats -c /etc/mogilefs/mogilefsd.conf Fetching statistics... (all)   Statistics for devices...   device     host                   files     status   ---------- ---------------- ------------ ----------   dev1       192.168.10.220        107      alive   dev2       192.168.10.231        107      alive   ---------- ---------------- ------------ ----------   Statistics for file ids...   Max file id: 619 Statistics for files...   domain               class           files    size (m)  fullsize (m)   -------------------- ----------- ---------- ----------- -------------   p_w_picpaths               default           107          17            35   -------------------- ----------- ---------- ----------- -------------   Statistics for replication...   domain               class        devcount      files   -------------------- ----------- ---------- ----------   p_w_picpaths               default             2        107   -------------------- ----------- ---------- ----------   Statistics for replication queue...   status                      count   -------------------- ------------   -------------------- ------------   Statistics for delete queue...   status                      count   -------------------- ------------   -------------------- ------------   Statistics for general queues...   queue           status                      count   --------------- -------------------- ------------   --------------- -------------------- ------------  done     列出hots $ mogadm host list 192.168.10.220 [1]: alive   IP:       192.168.10.220:7500    192.168.10.231 [2]: alive   IP:       192.168.10.231:7500   查看domain $ mogadm domain list domain                class                mindevcount   replpolicy   hashtype -------------------- -------------------- ------------- ------------ -------  p_w_picpaths               default                   2        MultipleHosts() NONE     p_w_picpaths               upload1                   2        MultipleHosts() NONE     p_w_picpaths               upload2                   2        MultipleHosts() NONE    查看host信息$ mogadm class list domain                class                mindevcount   replpolicy   hashtype -------------------- -------------------- ------------- ------------ -------  p_w_picpaths               default                   2        MultipleHosts() NONE     p_w_picpaths               upload1                   2        MultipleHosts() NONE     p_w_picpaths               upload2                   2        MultipleHosts() NONE    查看设备信息 $ mogadm device list 192.168.10.220 [1]: alive                     used(G)    free(G)   total(G)  weight(%)       dev1:   alive      0.039      9.183      9.222        100   192.168.10.231 [2]: alive                     used(G)    free(G)   total(G)  weight(%)       dev2:   alive     16.389      9.707     26.096        100    添加文件  $ mogupload --domain=p_w_picpaths  --key='1.jpg' --file='/home/mogilefs/2.jpg'    查看key为1.jpg的信息 $ mogfileinfo --domain=p_w_picpaths --key='1.jpg' - file: 1.jpg      class:              default     devcount:                    2         domain:               p_w_picpaths               fid:                  619               key:                1.jpg         length:               279696  - http://192.168.10.220:7500/dev1/0/000/000/0000000619.fid  - http://192.168.10.231:7500/dev2/0/000/000/0000000619.fid   导出文件 $ mogfetch --domain=p_w_picpaths --key='1.jpg' --file='./test.jpg'

通过浏览器访问1.jpg

使用将host(192.168.10.231)的状态修改为down,并通过浏览器访问1.jpg

$ mogadm  host modify 192.168.10.231 --ip=192.168.10.231 --status=down$ mogadm host list192.168.10.220 [1]: alive  IP:       192.168.10.220:7500 192.168.10.231 [2]: down  IP:       192.168.10.231:7500

注意 :

     1.Sys-Syscal 使用 Sys-Syscall-0.25.tar.gz  版本 会导致副本就只有一份(自身的bug),通过查找资料当Sys-Syscall模块需要使用 Sys-Syscall-0.23.tar.gz 副本就会恢复正常

   2.增大MogileFS用户最大打开文件数,重启服务器,如果不增大最大打开文件数,启动Mogstored就会报错  ERROR: Need to be root to increase max connections.