mogilefs

 

 http://soulboy.blog.51cto.com/4007306/1338192

#######################################################################

  • 数据存储的趋势和大数据带来的挑战

  • 分布式存储与CAP定理

  • 分布式存储文件系统

  • Mogilefs基本原理

  • Mogilefs实现

  • Nginx反向代理Tracker节点

#######################################################################

 

数据存储的趋势和大数据带来的挑战

       当下我们处在一个互联网飞速发展的信息社会,在海量并发连接的驱动下每天所产生的数据量必然以几何方式增长,随着信息连接方式日益多样化,数据存储的结构也随着发生了变化。在这样的压力下使得人们不得不重新审视大量数据的存储所带来的挑战,例如:数据采集、数据存储、数据搜索、数据共享、数据传输、数据分析、数据可视化等一系列问题。

传统存储在面对海量数据存储表现出的力不从心已经是不争的事实,例如:纵向扩展受阵列空间限制、横向扩展受交换设备限制、节点受文件系统限制。

       然而分布式存储的出现在一定程度上有效的缓解了这一问题,之所以称之为缓解是因为分布式存储在面对海量数据存储时也并非十全十美毫无压力,依然存在的难点与挑战例如:节点间通信、数据存储、数据空间平衡、容错、文件系统支持等一系列问题仍处在不断摸索和完善中。

 

分布式存储与CAP定理

       首先要说明的是一个完美分布式系统有三个最重要的元素,他们分别是:

       一致性(Consistency):任何一个读操作总是能读取之前完成的写操作。

       可用性(Availability):每次操作总是能够在预定时间返回。

       分区容错性(Partition Tolerance):在出现网络分区(分布式)的情况下,仍然能够满足一致性和可用性。

032623364.png

 

       2007年,正当所有科学家都在致力于CAP三元素并存的时候,Eric.Brewer教授站了出来并指出CAP永远无法兼顾,只能根据具体应用来权衡和取舍,并且至多两个元素可以共存,后来由两位麻省理工学院的科学家证明此观点是具有前瞻性的,由此形成Brewer的CAP定理。

       正所谓鱼和熊掌不可兼得,关注一致性就需要处理因系统不可用而带来写操作失败的情况,反之关注可用性就无法保证每次都能读取到最新的写入操作。传统关系型数据库侧重于CA,而非关系型键值数据库则侧重于AP

       对于大型站点,可用性(Availability)分区容错性(Partition Tolerance)的优先级会高于一致性(Consistency),这里并不是指完全舍弃一致性,而是通过其他手段实现数据的弱一致性,例如:用户微博的浏览数和评论可以容忍相对长时间的不一致,几乎不会影响用户体验,而股票价格的数据则异常敏感,即便是10秒钟的数据不一致也无法容忍,为了能更形象的了解所谓“各种一致性”需要进行一下内容的回顾。

       强一致性(ACID)在单机环境中,强一致性可以由数据库的事务来保证;在分布式环境中,强一致性很难做到,即便是做到也会因为分布式事物所带来的性能低下,不适合在互联网的环境中应用。

       弱一致性(包括最终一致性)系统不能保证后续访问返回最新的值,在访问到最新值之前这段时间称之为不一致窗口

       最终一致性:是弱一致性的一种特例,存储系统保证如果对象有多次更新,在渡过不一致窗口之后必将放回最后更新的值。

       服务器的一致性N代表节点的个数;W代表更新的时候需要确认已经被更新的节点个数;R代表读取数据需要的节点数量。

               W + R > N  ---->  强一致性(通常N=3,W=R=2)

               W=N,R=1   ---->  最佳读

               W=1,R=N   ---->  最佳写

               W + R <= N ---->  弱一致性

 

分布式存储文件系统

Google Filesystem GFS+MapReduce擅长处理单个大文件
Hadoop Distributed Filesystem GFS的山寨版+MapReduce,擅长处理单个大文件
ClusterFS 擅长处理单个大文件
Taobao Filesystem 擅长处理海量小文件
MogileFS 擅长处理海量小文件
Ceph 是一个 Linux PB级别的分布式文件系统
MooseFS 通用简便,适用于研发能力不强的公司
Lustre 一种平行分布式文件系统

 

Mogilefs基本原理

 

       MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发,Danga团队开发了包括 Memcached、MogileFS、Perlbal等不错的开源项目:(注:Perlbal是一个强大的Perl写的反向代理服务器)。MogileFS是一个开源的分布式文件系统。主要特性包括:应用层的组件、无单点故障、自动文件复制、具有比RAID更好的可靠性、无需RAID支持等……核心角色如下:

       tracker节点:借助数据库保存各节点文件的元数据信息保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本,进程名为mogilefsd(7001)。

       database节点为tracker节点提供数据存取服务。

       storage节点:将指定域中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值,storage节点自动维护键值的对应关系,storage节点由于使用http进行数据传输,因此依赖于perlbal,storage节点前端可以使用nginx进行反向代理,但需要安装nginx-mogilefs-module-master模块进行名称转换,进程名mogstored(7501),perbal(7500)。

 

       Domain一个域中的键值是惟一的,一个MogileFS可以有多个域,域可以用来存储不同应用类型的数据的容器。

       Host每一个存储节点称为一个主机,一个主机上可以有多个存储设备(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件。

       Class:复制最小单位,文件属性管理,定义文件存储在不同设备上份数。

       流程图如下:

032539679.png

       1、应用层发起GET请求到Nginx。

       2、Nginx根据负载均衡机制随机代理到后台Node one。

       3、Node one向从服务器发起查询请求。

       4、从服务器返回查询结果。

       5、Node one将查询结果返回给Nginx。

       6、Nginx将查询结果根据模块转换为合理的url方位Node three。

       7、Node Three将文件内容通过http协议返回给Nginx。

       8、Nginx将结果返回给应用层的请求。

 

Mogilefs实现

      由于各角色和服务之间都是基于套接字通信,就服务本身来说没有耦合性,所以可以使用少量机器运行多种服务角色,功能图如下:

034037457.png

       1、通过Nginx+Keepalived实现高可用的负载均衡,通过upstream模块可以有选择性的转发应用层的请求至后端tracker节点。

       2、DRBD+Corosync+Pacemaker的机制保证了Mysql的高可用,详细配置请参阅博文:DAS之mysql高可用解决方案

       3、为了进一步提升Mysql的性能引入从节点为其分摊读操作,从节点的数据可以根据具体业务规模来设定,如果使用数据库代理进行读写分离,代理会成为单点故障,则需要为代理做高可用,另外Tracker节点支持手动为其指定从节点,因此可以根据自己的喜好,Mysql代理和复制相关实现请参阅博文:Mysql复制及代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
##### Database节点
安装mariadb
授权
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'mypass';
CREATE DATABASE mogilefs;
GRANT ALL ON mogilefs.* TO 'moguser'@'%' IDENTIFIED BY 'mogpass';
FLUSH PRIVILEGES;
##### Tracker节点(可以是所有节点)
安装 mogilefs
修改配置文件如下
vim /etc/mogilefs/mogilefsd.conf       
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=192.168.1.241
db_user = moguser
db_pass = mogpass
listen = 0.0.0.0:7001
conf_port = 7001
query_jobs = 100
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
service mogilefsd start     #启动服务
ss -tanlp (LISTEN      0      128       192.168.1.241:7001  )
##### storage节点(可以是所有节点)
安装 mogilefs
mkdir /mogdata/dev1 -pv     #创建设备目录
chown -R mogilefs.mogilefs /mogdata/dev2/   #权限
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata          #目录级别
service mogstored start
ss -tanlp (*:7500)
##### tracker节点添加storage节点和常用命令
mogadm check        #检测节点
mogadm host list    #每个存储节点称为一个host
mogadm host add 192.168.1.213 --ip=192.168.1.213 --ip=192.168.1.213 --status=alive      #添加第一个存储节点
mogadm host add 192.168.1.242 --ip=192.168.1.242 --ip=192.168.1.242 --status=alive       #添加第一个存储节点
mogadm host add 192.168.1.241 --ip=192.168.1.241 --ip=192.168.1.241 --status=alive      #添加第一个存储节点
mogadm device add 192.168.1.213 1    #添加第一个设备,设备号唯一不能重名
mogadm device add 192.168.1.242 2   #添加第二个设备
mogadm device add 192.168.1.241 3   #添加第三个设备
mogadm check    #可以查看状态
mogadm domain add files     #创建文件存储域
mogadm domain add images    #创建图片存储域
mogadm domain list  #查看所有域
mogupload --trackers=192.168.1.241 --domain=files --key='/fstab' --file='/etc/fstab'     #上传fstab文件,key为'/fstab'
mogfileinfo --trackers=192.168.1.241 --domain=files --key='/fstab'    #根据key查看文件存放信息

注释:mogupload工具是为了测试,实际环境中上传是由程序员在代码中使用mogilefs的API进行交互。

042651555.png

 

Nginx反向代理Tracker节点

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
##### 配置Nginx
安装tng
yum install pcre-devel -y
yum groupinstall "Development Tools" "Server Platform Development"
yum install libxslt-devel gd-devel lua-devel geoip-devel
tengine-1.5.1.tar.gz
nginx-mogilefs-module-master.zip    #mogilefs模块需要打补丁
mkdir -pv /var/tmp/nginx/client     #模块需要
unzip nginx-mogilefs-module-master.zip
useradd -r nginx
./configure \
  --prefix=/usr/local/nginx \
  --sbin-path=/usr/local/nginx/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 \
  --enable-mods-shared=all \
  --add-module=/nginx-mogilefs-module-master
make && make install
vim /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx/sbin:$PATH
. !$
提供脚本.....
配置nginx
vim /etc/nginx/nginx.cfg
upstream trackers {
        server 192.168.1.242:7001 weight=1;
        server 192.168.1.213:7001 weight=1;
        server 192.168.1.241:7001 backup;
        check interval=3000 rise=2 fall=5 timeout=1000;
        check_http_send "GET / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
   }
location /jpg/ {
        mogilefs_tracker trackers;
        mogilefs_domain images;
        mogilefs_methods GET;
        mogilefs_pass {
            proxy_pass $mogilefs_path;
            proxy_hide_header Content-Type;
            proxy_buffering off;
                }
       }
##### 配置keepalived
安装keepalived
vim /etc/keepalived/keepalived.conf  # backup  priority 99
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from admin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LTT
}
vrrp_script chk_nginx {
   script "killall -0 nginx"
   interval 1
   weight -2
   fall 2
   rise 1
}
vrrp_instance IN_1 {
    state MASTER
    interface eth0
    virtual_router_id 22
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass aaaa
    }
    virtual_ipaddress {
        192.168.1.222
    }
   track_script {
    chk_nginx
}
}

 

查看负载节点:

045554770.png

 

模拟GET方法测试Nginx_mogilefs模块:

045933806.png

本文出自 “星矢” 博客,转载请与作者联系!

..........

http://my.oschina.net/u/1259000/blog/182277

MogileFS-2.44 安装与配置 

目录
一、MogileFS 介绍
1.1、环境
二、MogileFS 安装
2.1、Mysql安装
2.2、安装MogileFS 相关Perl模块
2.3、MogileFS Server 安装
2.4、MogileFS Storage 存储节点安装
三、MogileFS 配置
3.1、mysql数据库设置
3.2、创建mysql连接
3.3、创建Tracker配置文件
3.4、MogileFS 启动与停止
3.5、MogileFS Storage 节点配置
3.6、启动MogileFS Storage 节点
四、管理配置MogileFS
4.1、添加Storeage节点到Tracker
4.2、在存储节点中添加设备
4.3、在存储节点中使设备失效
4.4、添加域和类
4.5、查看域和tracker节点
4.6、mogadm 详细参数
五、MogileFS PHP扩展模块
5.1、安装MogileFS PHP扩展
5.2、添加MogileFS PHP模块
5.3、MogileFS 客户端 API 调用资料
六、MogileFS Nginx 模块安装
6.1、下载Nginx_mogilefs_module
6.2、添加Nginx_mogilefs_module模块
6.3、配置Nginx_mogilefs_module 模块
七、Mogtool 工具创建文件和读取文件内容
7.1、创建文件
7.2、读取文件
八、FUSE API 挂载 MogileFS文件系统
8.1、安装操作系统相应fuse支持
8.2、安装Perl Fuse支持
8.3、Mount MogileFS文件系统
8.4、查看MogileFS系统文件
九、MogileFS参考资料
 

一、MogileFS 介绍< xmlnamespace prefix ="o" />

MogileFS  是一个开源的分布式文件系统,用于组建分布式文件集群,由  LiveJournal  旗下 Danga Interactive  公司开发, Danga  团队开发了包括  Memcached 、 MogileFS 、 Perlbal  等不错的开源项目: ( 注: Perlbal  是一个强大的  Perl  写的反向代理服务器 ) 。目前国内使用 MogileFS  的有图片托管网站  yupoo  等。
官方的介绍网站:
http://www.danga.com/mogilefs/
Google Code  上的信息
 

1.1、环境

MogileFS  相关服务器
IP
系统
Tracker ( 调度器 )
192.168.0.11
Centos 5.5 x32
Storage Nodes 1 ( 存储节点 1)
192.168.0.22
Centos 5.5 x32
Storage Nodes 2 ( 存储节点 2)
192.168.0.33
Centos 5.5 x32
Mysql
192.168.0.44
Centos 5.5 x32
 
 
 

2.1、Mysql安装

2.2、安装MogileFS 相关Perl模块

首先要安装 perl
# yum install perl
以下 Perl 模块均可使用以下命令进行安装 , 如安装 Sys::Syscall 模块。
# cpan –I Sys::Syscall
Danga::socket
 BSD::Resource
common::sense
IO::AIO
  Perlbal
ExtUtils::MakeMaker
Test::Simple
DBI
Net::Netmask
IO::WrapTie
MogileFS::Utils
Gearman::server
 
注 : 存储节点服务器不用安装 DBD::mysql 模块
以上 Perl 模块也可到 http://search.cpan.org/   网站上下载安装,如安装 Sys::Syscall 模块。
 
# tar zxvf Sys-Syscall-0.23.tar.gz
# cd Sys-Syscall-0.23
# perl Makefile.PL
# make
# make install
 

2.3、MogileFS Server 安装

# tar zxvf MogileFS-Server-2.44.tar.gz
# cd MogileFS-Server-2.44
# perl Makefile.PL
# make
# make install

2.4、MogileFS Storage 存储节点安装

参考 2.2 、 2.3 。 DBD::mysql   可不用安装

三、MogileFS 配置

3.1、mysql数据库设置

mysql> create database mogilefs;
mysql> grant all on mogilefs.* to 'mogile'@'%' identified '000000'
mysql> flush privileges;

3.2、创建mysql连接

# /usr/lib/mogdbsetup --dbhost=192.168.0.144 --dbname=mogilefs --dbuser=mogile --dbpassword=000000

3.3、创建Tracker配置文件

# vi /etc/mogliefs/mogilefsd.conf
内容如下:
db_dsn = DBI:mysql:mogilefs:host=192.168.0.144;port=3306;mysql_connect_timeout=5
db_user = mogile
db_pass = 000000
conf_port = 7001
listener_jobs = 5
node_timeout = 5
rebalance_ignore_missing = 1
 
 

3.4、MogileFS 启动与停止

由于 mogilefs 不能以 root 用户运行 , 创建 mogile 用户
# Useradd mogile –s /sbin/nologin
# su mogile –c “mogilefsd -c /etc/mogilefs/mogilefsd.conf --daemon”
使用 pkill mogilefsd  来停止 mogilefs  服务

3.5、MogileFS Storage 节点配置

创建 Storage 配置文件
vi /etc/mogilefs/mogstored.conf
内容如下 :
httplisten=0.0.0.0:7500
mgmtlisten=0.0.0.0:7501
docroot=/data/mogdata

3.6、启动MogileFS Storage 节点

Mogstored –daemon
使用 pkill mogstored  来停止 mogstored  服务

四、管理配置MogileFS

4.1、添加Storeage节点到Tracker

# mogadm --trackers=192.168.0.11:7001 host add mog_store_22 --ip= 192.168.0.22 --port=7500 --status=alive

4.2、在存储节点中添加设备

# mogadm --trackers=192.168.0.11:7001 device add  mog_store_22  101
在 /data/mogdata/ 目录中创建 dev201 文件夹

4.3、在存储节点中使设备失效

# mogadm device mark mog_store_22 dev101 dead
 

4.4、添加域和类

添加 image 域
# mogadm domain add image
在 image 域中添加 upload 类   存储份数为  2
# mogadm class add image upload –mindevcount=2

4.5、查看域和tracker节点

# mogadm domain list
 domain               class                mindevcount  replpolicy 
-------------------- -------------------- ------------- ---------------------------------------------------------
 image               default                    2       MultipleHosts()
 image               upload                    2       MultipleHosts()
 
# mogadm –trackers=192.168.0.11:7001 check
Checking trackers...
  127.0.0.1:7001 ... OK
 
Checking hosts...
  [ 1] mog_store_22 ... OK
  [ 2] mog_store_33 ... OK
 
Checking devices...
  host device         size(G)    used(G)    free(G)  use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 1] dev101          17.354      9.753      7.601 56.20%  writeable   0.0
  [ 2] dev201          13.456      1.491     11.965 11.08%  writeable   0.0
  [ 2] dev202           8.973      2.550      6.423 28.42%  writeable   0.0
  ---- ------------ ---------- ---------- ---------- ------
             total:    39.782     13.794     25.988  34.67%

4.6、mogadm 详细参数

#  mogadm
Usage:  (enter any command prefix, leaving off options, for further help)
 
  mogadm check                     Check the state of the MogileFS world.
  mogadm stats                     Show MogileFS system statistics.  (DEPRECIATED: use mogstats instead)
  mogadm host ...
         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 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 ...          Modify properties of a file class.
  mogadm slave ...
         slave add ...             Add a slave node for store usage
         slave delete ...          Delete a slave node for store usage
         slave list                List current store slave nodes.
         slave modify ...          Modify a slave node for store usage
  mogadm fsck ...
         fsck clearlog             Clear the fsck log
         fsck printlog             Display the fsck log
         fsck reset ...            Reset fsck position back to the beginning
         fsck start                Start (or resume) background fsck
         fsck status               Show fsck status
         fsck stop                 Stop (pause) background fsck
         fsck taillog              Tail the fsck log
  mogadm settings ...
         settings list             List all server settings
         settings set ...          Set server setting 'key' to 'value'
 
  

五、MogileFS PHP扩展模块

5.1、安装MogileFS PHP扩展

# cd trunk
# phpize
# ../configure --with-php-config=/opt/php/bin/php-config
# make
# make install

5.2、添加MogileFS PHP模块

修改 /opt/php/etc/php.ini 配置文件,添加以下内容:
 extension=mogilefs.so
重启 web 服务器 , 使用 phpinfo() 函数可看见 mogilefs 已经被加载,如下图所示:
5.3 、MogileFS  客户端 API  调用资料
JAVA –http://github.com/eml/java-mogilefs
Ruby – http://seattlerb.rubyforge.org/mogilefs-client/
PHP – http://projects.usrportage.de/index.fcgi/php-mogilefs
Python – http://www.albany.edu/~ja6447/mogilefs.py

六、MogileFS Nginx 模块安装

安装了 Nginx_mogilefs_module  可使用 Nginx 直接读取 Mogilefs 文件系统里的文件。

6.1、下载Nginx_mogilefs_module

6.2、添加Nginx_mogilefs_module模块

# tar zxvf nginx_mogilefs_module-1.0.4.tar.gz
# ./configure --prefix=/opt/nginx --add-module=/data/mfs/nginx_mogilefs_module-1.0.4
# make
# make install

6.3、配置Nginx_mogilefs_module 模块

在 nginx 配置文件中加入以下内容 :
 server {
        listen       80;
        server_name  img.test.com;
        index index.html;    
        location / {
                mogilefs_tracker 192.168.0.11:7001;
                mogilefs_domain image;
        mogilefs_pass {
               proxy_pass $mogilefs_path;
                proxy_hide_header Content-Type;
                proxy_buffering off;
 
                    }
                }
 
注: mogilefs_domain image  这里的 image 就是 mogilefs 中创建的域
 
 
 
 

七、Mogtool 工具创建文件和读取文件内容

7.1、创建文件

如将 /data/up.txt 文件创建到 image 域中 upload/up.txt 文件。命令如下 :
# mogtool --trackers=192.168.0.11:7001 --domain=image inject /data/up.txt  "upload/up.txt"
 
注 :/data/up.txt   为本地系统文件
   Upload/up.txt  为 mogilefs 文件内文件
   Mogilefs 文件系统中没有目录概念,将创建的文件名以 upload/up.txt 来代替。

7.2、读取文件

# mogtool --trackers=192.168.0.11:7001 --domain=image extract upload/up.txt -
Fetching piece 1...
        Trying http://192.168.0.22:7500/dev101/0/000/000/0000000001.fid...
Wide character in print at /usr/bin/mogtool line 1285, <Sock_192.168.0.11:7001> line 1.
up file txt
 
注 : upload/up.txt -   这里的  –  号不能却少,否则会出现语法错误
http://192.168.0.22:7500/dev101/0/000/000/0000000001.fid   为 upload/up.txt 文件的实际地址
up file txt 为 upload/up.txt 文件内容

八、FUSE API 挂载 MogileFS文件系统

8.1、安装操作系统相应fuse支持

yum install fuse fuse-devel fuse-libs

8.2、安装Perl Fuse支持

cpan -i FUSE::Client
cpan -i FUSE::Server
cpan -i FUSE::Fuse
注 : 如安装过程中提示却少模块,就安装相应模块。
 

8.3、Mount MogileFS文件系统

将 MogileFS 文件系统挂载到 /mnt 目录下。命令如下 :
# perl fuse.pl /mnt &

8.4、查看MogileFS系统文件

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda2              19G  9.8G  7.7G  57% /
/dev/hda1              99M   17M   78M  18% /boot
tmpfs                 506M     0  506M   0% /dev/shm
/dev/fuse                2     0     2   0% /mnt
注 : 这里挂载 MogileFS  文件系统到  /mnt  下,文件大小显示  2 , 这里不是很清楚,希望大家多研究。
# ls /mnt/
1111.jpg  1112.jpg  upload/up.txt
这样使用起来比较直观,操作文件就与本地文件系统一样。

九、MogileFS参考资料

 
 

http://luojianlong.blog.51cto.com/4412415/1393547

一、关于MogileFS

MongileFS是一个由Perl开发的分布式文件系统,遵循CAP理论,即Consistency:数据的一致性;Availability:数据的可用性;Tolerance of network Partition:数据的容错性;而这里的MongileFS满足了后俩者,也就是只满足数据的可用性和容错性,对于大型网站,数据的可用性和容错性要优先于数据的一致性。

MongileFS使用一致性hash来解决数据的可用性,使用虚拟节点来解决数据倾斜的问题;MongileFS特别适合存储海量小文件的数据,与之类似的分布式文件系统还有:FastDFS,MooseFS等,也适合存储海量小文件。

MongileFS的特性:

1、应用层实现,不需要特殊的核心组件;

2、无单点失败,MogileFS分布式文件存储系统安装的三个组件(存储节点、跟踪器、跟踪用的数据库),均可运行在多个机器上,因此没有单点失;

3、自动的文件复制 — 基于不同的文件“分类”,文件可以被自动的复制到多个有足够存储空间的存储4节点上,这样可以满足这个“类别”的最少复制要求;

4、简单的命名空间 –文件通过一个给定的key来确定,是一个全局的命名空间.你可以自己生成多个命名空间,只要你愿意,不过这样可能在同一MogileFS中会造成key冲突;

5、不用共享任何东西 — MogileFS分布式文件存储系统不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘;

 

实现MogileFS分布文件系统所需要的主机角色:

1、Tracker(MogileFSd 进程):这个是 MogileFS 的核心部分,他是一个调度器,MogileFSd 进程就是trackers进程程序,trackers 做了很多工作:Replication ,Deletion,Query,Reaper,Monitor 等等,这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed),,包括将请求负载平衡到多个“query workers”中,然后让 MogileFSd 的子进程去处理;

2、MySQL:用来存放 MogileFS 的元数据 (命名空间, 和文件在哪里),是Trackers 来操作和管理它,可以用mogdbsetup程序来初始化数据库,因为数据库保存了MogileFS的所有元数据,建议做成HA架构;

3、Storage Nodes:实际文件存放的地方,存储节点是一个HTTP服务器,用来做删除,存放,重命名等事情,任何WebDAV服务器都可以, 不过推荐使用mogstored,MogileFSd 可以配置到两个机器上使用不同端口,mogstored来进行所有的DAV操作和流量,IO监测, 并且你自己选择的HTTP服务器(默认为 perlbal)用来做GET操作给客户端提供文件。

 

MogileFS管理的几个概念:

1、Domain:一个MogileFS可以有多个Domain,用来存放不同文件(大小,类型),同一个Domain内key必须为一,不同Domain内,key可以相同;

2、Class:文件属性管理,定位文件存储在不同设备上的份数;

 

 

二、MongileFS工作原理图

wKiom1NGZNiTKzaNAAD4rEDUBXs571.jpg

 

 

三、实验环境

10.232.50.239 OS:CentOS 6.4 x86_64  node1.luojianlong.com

10.232.42.218 OS:CentOS 6.4 x86_64  node2.luojianlong.com

10.232.42.219 OS:CentOS 6.4 x86_64  node3.luojianlong.com

 

 

拓扑图

wKiom1NGaLOjannfAAEA7emcEBk572.jpg

 

首先,分别在node1,node2,node3上面安装cpan以及依赖的包

1
2
3
[root@node1 ~]# yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes cpan
[root@node2 ~]# yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes cpan
[root@node3 ~]# yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes cpan

 

使用cpan命令安装MogileFS::Server,MogileFS::Client,以及依赖的模块,前提是主机能够上互联网

1
2
3
4
5
6
7
8
9
10
# 安装过程中,如有提示安装依赖的模块,直接回答yes即可
[root@node1 ~]# cpan -i install MogileFS::Server
[root@node1 ~]# cpan -i install MogileFS::Client
[root@node1 ~]# cpan -i install MogileFS::Utils
[root@node2 ~]# cpan -i install MogileFS::Server
[root@node2 ~]# cpan -i install MogileFS::Client
[root@node2 ~]# cpan -i install MogileFS::Utils
[root@node3 ~]# cpan -i install MogileFS::Server
[root@node3 ~]# cpan -i install MogileFS::Client
[root@node3 ~]# cpan -i install MogileFS::Utils

安装完成以后,在node1上面安装mysql

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@node1 ~]# useradd -r mysql
[root@node1 ~]# tar zxvf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/
[root@node1 ~]# cd /usr/local/
[root@node1 local]# ln -s mysql-5.5.33-linux2.6-x86_64 mysql
[root@node1 local]# cd mysql
[root@node1 mysql]# chown -R root.mysql ./*
[root@node1 mysql]# mkdir /mydata/data -p
[root@node1 mysql]# chown -R mysql.mysql /mydata/data/
[root@node1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@node1 mysql]# chmod +x /etc/rc.d/init.d/mysqld
[root@node1 mysql]# chkconfig --add mysqld
[root@node1 mysql]# chkconfig mysqld on
[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf
[root@node1 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data
[root@node1 mysql]# vi /etc/my.cnf
# 添加如下俩行
datadir = /mydata/data
innodb_file_per_table = 1
[root@node1 mysql]# vi /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
[root@node1 mysql]# . /etc/profile.d/mysql.sh
[root@node1 mysql]# service mysqld start
Starting MySQL.... SUCCESS!

 

创建Tracker连接mysql的远程用户

1
2
3
4
mysql> grant all on *.* to 'root'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

 

配置Tracker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
[root@node1 ~]# useradd -r mogilefs
[root@node1 ~]# mkdir /var/run/mogilefsd/ -p
[root@node1 ~]# chown -R mogilefs.mogilefs /var/run/mogilefsd
[root@node1 ~]# mkdir /etc/mogilefs/
# 编辑配置文件:/etc/mogilefs/mogilefsd.conf
[root@node1 ~]# vi /etc/mogilefs/mogilefsd.conf
db_dsn = DBI:mysql:mogilefs:host=10.232.50.239;port=3306;mysql_connect_timeout=5
db_user = mogile
db_pass = 123456
conf_port = 7001
listener_jobs = 5
node_timeout = 5
rebalance_ignore_missing = 1
# 编写mogilefsd启动脚本
[root@node1 ~]# vi /etc/rc.d/init.d/mogilefsd
#!/bin/bash
#
# 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"
    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
[root@node1 ~]# chmod +x /etc/rc.d/init.d/mogilefsd
[root@node1 ~]# chkconfig --add mogilefsd
[root@node1 ~]# chkconfig mogilefsd on
# 初始化数据库
[root@node1 ~]# mogdbsetup --dbhost=127.0.0.1 --dbrootuser=root --dbpass=123456 --dbname=mogilefs --dbuser=mogile --dbpassword=123456
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 'mogilefs'? [Y/n]: y
Grant all privileges to user 'mogile', connecting from anywhere, to the mogilefs database 'mogilefs'? [Y/n]: y
[root@node1 ~]# ln -s /usr/local/bin/mogilefsd /usr/bin/
[root@node1 ~]# ln -s /usr/local/bin/mogilefsd /usr/sbin/
[root@node1 ~]# service mogilefsd start
Starting mogilefsd                                         [  OK  ]
[root@node1 ~]# ss -anptl
Recv-Q Send-Q                                                                    Local Address:Port                                                                      Peer Address:Port
0      128                                                                                  :::22                                                                                  :::*      users:(("sshd",8066,4))
0      128                                                                                   *:22                                                                                   *:*      users:(("sshd",8066,3))
0      128                                                                                   *:7001                                                                                 *:*      users:(("mogilefsd",3444,6))
0      50                                                                                    *:3306                                                                                 *:*      users:(("mysqld",1003,11))
# 启动成功
# 在node2,node3上面执行相同的操作,安装mogilefsd,不需要初始化数据

配置mogstored

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# 编辑mogstored配置文件
[root@node1 ~]# vi /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata
[root@node1 ~]# mkdir /mogdata/dev1
[root@node1 ~]# chown -R mogilefs.mogilefs /mogdata/dev1
# 编写mogstored启动脚本
[root@node1 ~]# vi /etc/rc.d/init.d/mogstored
#!/bin/bash
#
# 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
[root@node1 ~]# chmod +x /etc/rc.d/init.d/mogstored
[root@node1 ~]# chkconfig --add mogstored
[root@node1 ~]# chkconfig mogstored on
[root@node1 ~]# ln -s /usr/local/bin/mogstored  /usr/bin/
[root@node1 ~]# ln -s /usr/local/bin/mogstored  /usr/sbin/
[root@node1 ~]# service mogstored start
Starting mogstored                                         [  OK  ]
[root@node1 ~]# ss -anptl
Recv-Q Send-Q                                          Local Address:Port                                            Peer Address:Port
0      128                                                         *:7500                                                       *:*      users:(("mogstored",5108,4))
0      128                                                         *:7501                                                       *:*      users:(("mogstored",5108,9))
0      128                                                        :::22                                                        :::*      users:(("sshd",8066,4))
0      128                                                         *:22                                                         *:*      users:(("sshd",8066,3))
0      128                                                         *:7001                                                       *:*      users:(("mogilefsd",3444,6))
0      50                                                          *:3306                                                       *:*      users:(("mysqld",1003,11))
# 启动成功
# node2,node3执行相同的操作,对应的存储目录为/mogdata/dev2,/mogdata/dev3

在node2上面编译安装nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@node2 ~]# yum -y groupinstall "Development Tools" "Server Platform Deveopment"
[root@node2 ~]# yum -y install openssl-devel pcre-devel
[root@node2 ~]# groupadd -r nginx
[root@node2 ~]# useradd -r -g nginx nginx
# 解压nginx的第三方模块mogilefs模块
[root@node2 ~]# unzip nginx-mogilefs-module-master.zip
[root@node2 ~]# tar zxvf nginx-1.4.2.tar.gz
[root@node2 ~]# cd nginx-1.4.2
[root@node2 nginx-1.4.2]# ./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 \
> --add-module=/root/nginx-mogilefs-module-master
[root@node2 nginx-1.4.2]# make && make install
[root@node2 nginx-1.4.2]# mkdir /var/tmp/nginx/client -p
[root@node2 nginx-1.4.2]# nginx

 

Nginx 做为 MogileFS 的前端客户端,我们使用Nginx来吐文件,做前端的查询代理时,我们需要使用到mogilefs的这个模块,可以下载这个模块编译进Nginx就行了,直接使用 ./configure -add-module=这个参数就可以了,最新的这个模块的下载地址是:https://github.com/vkholodkov/nginx-mogilefs-module

 

在node1上,使用mogadm添加节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@node1 ~]# mogadm host add 10.232.50.239 --ip=10.232.50.239 --status=alive
[root@node1 ~]# mogadm host add 10.232.42.218 --ip=10.232.42.218 --status=alive
[root@node1 ~]# mogadm host add 10.232.42.219 --ip=10.232.42.219 --status=alive
[root@node1 ~]# mogadm check                                     
Checking trackers...
  127.0.0.1:7001 ... OK
Checking hosts...
  [ 1] 10.232.50.239 ... OK
  [ 2] 10.232.42.218 ... OK
  [ 3] 10.232.42.219 ... OK
Checking devices...
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  ---- ------------ ---------- ---------- ---------- ------
             total:     0.000      0.000      0.000   0.00%
# 添加host成功

 

为每个host添加device

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@node1 ~]# mogadm device add 10.232.50.239 1
[root@node1 ~]# mogadm device add 10.232.42.218 2
[root@node1 ~]# mogadm device add 10.232.42.219 3
[root@node1 ~]# mogadm check
Checking trackers...
  127.0.0.1:7001 ... OK
Checking hosts...
  [ 1] 10.232.50.239 ... OK
  [ 2] 10.232.42.218 ... OK
  [ 3] 10.232.42.219 ... OK
Checking devices...
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 1] dev1             7.472      2.443      5.029  32.69%  writeable   N/A
  [ 2] dev2             7.472      1.839      5.633  24.61%  writeable   N/A
  [ 3] dev3             7.472      1.647      5.825  22.04%  writeable   N/A
  ---- ------------ ---------- ---------- ---------- ------
             total:    22.416      5.928     16.488  26.45%
# 添加成功

 

添加domain

1
2
3
4
5
6
7
8
[root@node1 ~]# mogadm domain add files
[root@node1 ~]# mogadm domain add images
[root@node1 ~]# mogadm domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE
 images               default                   2        MultipleHosts() NONE
# 发现已经自动添加了default class

 

上传文件测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@node1 ~]# mogupload --trackers=10.232.50.239 --domain=files --key='/fstab' --file='/etc/fstab'
[root@node1 ~]# mogfileinfo --trackers=10.232.50.239 --domain=files --key='/fstab'
file/fstab
     class:              default
  devcount:                    3
    domain:                files
       fid:                    5
       key:               /fstab
    length:                  463
 - http://10.232.42.219:7500/dev3/0/000/000/0000000005.fid
 - http://10.232.42.218:7500/dev2/0/000/000/0000000005.fid
# 可以看到文件被自动保存为2个副本
[root@node1 ~]# curl http://10.232.42.218:7500/dev2/0/000/000/0000000005.fid
/dev/xvda1            /                    ext3       noatime,acl,user_xattr 1 1
/dev/xvdc            swap                 swap       defaults 0 0
proc                 /proc                proc       defaults              0 0
sysfs                /sys                 sysfs      noauto                0 0
debugfs              /sys/kernel/debug    debugfs    noauto                0 0
devpts               /dev/pts             devpts     mode=0620,gid=5       0 0
# 可以正常访问

模拟down掉一个节点,看文件会不会丢失

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@node1 ~]# mogadm host mark 10.232.42.218 down
[root@node1 ~]# mogadm check
Checking trackers...
  127.0.0.1:7001 ... OK
Checking hosts...
  [ 1] 10.232.50.239 ... OK
  [ 2] 10.232.42.218 ... skipping; status = down
  [ 3] 10.232.42.219 ... OK
Checking devices...
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 1] dev1             7.472      2.443      5.029  32.70%  writeable   N/A
  [ 3] dev3             7.472      1.648      5.824  22.05%  writeable   N/A
  ---- ------------ ---------- ---------- ---------- ------
             total:    14.944      4.091     10.853  27.37%
[root@node1 ~]# mogfileinfo --trackers=10.232.42.218 --domain=files --key='/fstab'
file/fstab
     class:              default
  devcount:                    1
    domain:                files
       fid:                    5
       key:               /fstab
    length:                  463
 - http://10.232.42.218:7500/dev2/0/000/000/0000000005.fid
# 发现文件依然存在

 

下面使用Nginx来替换storage nodes上 mogstored中的Perlbal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@node2 ~]# vi /etc/nginx/nginx.conf
# 添加如下
  upstream trackers {
    server 10.232.50.239:7001;
    server 10.232.42.218:7001;
    server 10.232.42.219:7001;
}
  location /files/ {
        mogilefs_tracker trackers;
        mogilefs_domain files;
        mogilefs_methods get;
        mogilefs_pass {
        proxy_pass $mogilefs_path;
        proxy_hide_header Content-Type;
        proxy_buffering off;
        }
        }
[root@node2 ~]# nginx -s reload

 

关于如上配置解释一下,比如:

http://www.a.com/files/A6B00135E24AB17E043B9B5453762438.png

这个URL中的UUID是A6B00135E24AB17E043B9B5453762438.png.这时我们使用这个做key来存到MogileFS中就行,再结合rewrite,只要key在url里有,就能直接代理到后端的mogilefs,如果使用了多个tracker的话,要配置使用多个tracker来进行负载均衡和备份,可以直接配置tracker到upstrame里面,然后后面配置tracker的连接时,直接加上mogilefs_tracker online_mogilefs就行了,如果你还想配置使用 mogilefs 的 Nginx 上传,使用其中的 put 功能然后就不要安装客户端上传送,就需要打个补丁,上面的配置一样,关键对于上传的配置,需要给方法修改为mogilefs_methods PUT DETEL。

 

 

上传文件测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 设置files domain的class复制份数为3
[root@node1 ~]# mogadm class modify files default --mindevcount=3
# 上传文件
[root@node1 ~]# echo "9966" > /tmp/index11.html
[root@node1 ~]# mogupload --trackers=10.232.50.239 --domain=files --key='index11.html' --file='/tmp/index11.html'
[root@node1 ~]# mogfileinfo --trackers=10.232.50.239 --domain=files --key='index11.html'
file: index11.html
     class:              default
  devcount:                    3
    domain:                files
       fid:                   24
       key:         index11.html
    length:                    5
 - http://10.232.42.218:7500/dev2/0/000/000/0000000024.fid
 - http://10.232.50.239:7500/dev1/0/000/000/0000000024.fid
 - http://10.232.42.219:7500/dev3/0/000/000/0000000024.fid
# 发现有3个副本
[root@node2 ~]# curl http://10.232.42.218/files/index11.html
9966

 

测试正常访问

下面模拟down掉一个节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@node1 ~]# mogadm host mark 10.232.50.239 down
[root@node1 ~]# mogadm check
Checking trackers...
  127.0.0.1:7001 ... OK
Checking hosts...
  [ 1] 10.232.50.239 ... skipping; status = down
  [ 2] 10.232.42.218 ... OK
  [ 3] 10.232.42.219 ... OK
Checking devices...
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 2] dev2             7.472      1.843      5.629  24.67%  writeable   N/A
  [ 3] dev3             7.472      1.652      5.820  22.11%  writeable   N/A
  ---- ------------ ---------- ---------- ---------- ------
             total:    14.944      3.495     11.449  23.39%
[root@node2 ~]# curl http://10.232.42.218/files/index11.html
9966

 

发现访问一切正常

如果想根据跨多机房多网段来复制不同class份数,需要安装MogileFS::Network模块

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@node1 ~]# cpan -i MogileFS::Network
# 安装完成后
# 添加网段名称,这里添加2个
[root@node1 ~]# mogadm settings set network_zones near,far
# 添加网段地址
[root@node1 ~]# mogadm settings set zone_near 10.0.0.0/8
# 修改class属性
[root@node1 ~]# mogadm class modify files default --replpolicy "HostsPerNetwork(near=2)"
# 发现修改生效
[root@node1 ~]# mogadm class list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        HostsPerNetwork(near=2) NONE
 files                index                     3        MultipleHosts() NONE
 images               default                   2        MultipleHosts() NONE
# 这里就实现了根据网段不同复制不同的class数量

 

注意:如果是多个tracker的话,每个tracker主机上都需要安装MogileFS::Network模块。

 

 

常见问题及解决方法:

如果遇到class的devcount始终为1,修改class的mindevcount也无效的话,可以设置如下:

 

1
2
3
4
5
6
7
[root@node1 ~]# perl -MSys::Syscall -e 'print $Sys::Syscall::VERSION'
0.25
# 显示为0.25版本,这就会有问题
[root@node1 ~]# cpanm http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz
[root@node1 ~]# perl -MSys::Syscall -e 'print $Sys::Syscall::VERSION'
0.23
# 降级为0.23的版本就能解决次问题了

 

到此,MogileFS, nginx-mogilefs高可用分布式文件系统配置完成。

本文出自 “龍行天下” 博客,请务必保留此出处http://luojianlong.blog.51cto.com/4412415/1393547

..............

 

posted @ 2014-10-17 09:34  陳聽溪  阅读(2198)  评论(0)    收藏  举报