IT技术互动交流平台

MogileFS分布式文件系统

作者:梅花香自苦寒来  来源:IT165收集  发布日期:2015-06-28 21:19:31

内容概述

1、分布式文件系统介绍

2、CAP理论

3、常见分布式文件系统介绍

4、MogileFS详细介绍

    4、1MogileFS组成

    4、2MogileFS特性

5、MogileFS实现

     5、1 node1配置Mariadb(过程略)

     5、2 node1配置tracker

     5、3 node2配置storage

     5、4  node3配置storage

     5、5 配置分布式集群

          5、5、1 添加主机

          5、5、2 添加设备

          5、5、3 定义domain和class

     5、6  验证分布式集群

6、MogileFS高可用

     6、1 node1配置storage

     6、2 node2配置tracker

     6、3 node3配置tracker

     6、4 验证MogileFS高可用

7、nginx反向代理MogileFS

    7、1 安装nginx

    7、2 设置反向代理

    7、3 设置负载均衡

1、分布式文件系统介绍

定义:分布式存储系统是大量普通PC服务器通过Internet互联,对外作为一个整体提供存储服务

特性

·        可扩展:分布式存储系统可以扩展到几百台至几千台的集群规模,且随着集群规模的增长,系统整体性能表现为线性增长;

·        低成本:分布式存储系统的自动容错、自动负载均衡机制使其可以构建在普通PC机之上;另外,线性扩展能力也使得增加、减少机器非常方便,可以实现自动运维;

·        高性能:无论是针对整个集群还是单台服务器,都要求分布式系统具备高性能;

·        易用:分布式存储系统需要能够提供易用的对外接口;另外,也要求具备完善的监控、运维工具,并能方便的与其他系统集成,如从Hadoop云计算系统导入数据;

挑战:在于数据、状态信息的持久化,要求在自动迁移、自动容错、并发读写的过程中保证数据的一致性;


 2、CAP理论

来自Berkerly的Eric Brewer教授提出了一个著名的CAP理论:一致性(Consistency),可用性(Availability)和分区容忍性(Tolerance of networkPartition)三者不能同时满足:

·        C:读操作总是能读取到之前完成的写操作结果,满足这个条件的系统成为强一致系统,这里的“之前”一般对同一个客户端而言;

·        A:读写操作在单台机器发生故障的情况下依然能够正常执行,而不需要等待发生故障的机器重启或者其上的服务迁移到其他机器;

·        P:机器故障、网络故障、机房停电等异常情况下仍然能够满足一致性和可用性;

分布式存储系统要求能够自动容错,即分区可容忍性总是需要满足的,因此,一致性和写操作的可用性就不能同时满足了,需要在这二者间权衡,是选择不允许丢失数据,保持强一致,还是允许少量数据丢失以获得更好的可用性;


3、常见的分布式文件系统介绍

GFS(Google File System):Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统。由于其元数据是存储在内存中,所以在存储文件数量上注定不可能达到海量存储,主要是存储大文件使用。

HDFS (Hadoop Distributed File System):Hadoop的重要组成之一,几乎完全山寨GFS

TFS:淘宝自主研发,将元数据存储于关系型数据库或其它高性能存储中,从而能维护海量文件元数据;主要用于存储海量小文件,维护难度大

GlusterFS:去中心化的设计模式;擅长处理单个大文件

Ceph:Linux内核级实现的文件系统,而已经被直接收录进Linux内核;bug较多,稳定性不佳

MooseFS:持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多

MogileFS:元数据放在数据库中,擅长处理海量小文件,性能较好

FastDFS:轻量级分布式系统,擅长处理海量小文件

备注:此处介绍不是很详细,如果需要详细了解,可以参考百度百科


4、MogileFS详细介绍

4、1 MogileFS组成

MogileFS组成的三个组件:

    tracker:追踪元数据   元数据访问路由器

    database:存储元数据 

    storage:存储数据

traker:

    mogilefsd(守护进程),它的主要职责包括:

        replication:节点间文件的复制;

        deletion:删除文件

        queryworker:响应客户请求的文件元数据访问请求

        reaper:在存储失败后将文件复制请求重新放置于队列中

        monitor:监测主机和设备的健康状态

database:

    存储mogilefs的元数据,一般使用MySQL; 建议使用冗余方案以保证其可用性;(MMM, MHA)

    mogilefs专门提供了数据结构管理工具mogdbsetup;

storage:

    mogstored(进程名),一个准备停当的mogstored节点可通过mogadm命令添加至现在的集群中;

    存储节点需定义“设备(dev)”用作存储空间;每个“设备”在当前集群都需要通过一个惟一的DevID来标识;

client:

    客户端用于与mogilefs建立通信,完成数据存取;


架构拓扑如下所示:

4、2 MogileFS特性:

    (1)工作于应用层:http, nfs;

    (2)无单点:三大组件(tracker,mogstore,database)皆可实现高可用;

    (3)自动完成文件复制:复制的最小单位不是文件,而是class;基于不同的class,文件可以被自动的复制到多个有足够存储空间的存储节点上

    (4)传输无需特殊协议:可以通过NFS或HTTP协议进行通信;

    (5)名称空间:文件通过一个给定的key来确定,是一个全局的命名空间;没有目录,基于域实现文件隔离

    (6)不共享任何数据:无需通过昂贵的SAN来共享磁盘,每个存储节点只需维护自己所属的存储设备(device)即可

 

两个关键术语:

    domain:name space,命名空间

         一个MogileFS可以有多个Domain

         用来存放不同文件(大小、类型)

         同一个Domain内,key必须唯一

         不同Domain内,key可以相同

    class:最小复制单元

        文件属性管理器

         定义文件存储在不同设备上的份数

5、MogileFS实现

环境拓扑

IP地址配置情况:

Node1:IP172.16.4.100  

Node2:IP172.16.4.101  

Node3:IP172.16.4.102   

系统环境:

[root@node1 ~]# cat/etc/redhat-release
CentOS release 6.6 (Final)
[root@node2 ~]# uname -r
2.6.32-504.el6.x86_64
[root@node2 ~]# uname -m
x86_64


5、1 Node1配置Mariadb(过程略)

Mariadb配置root用户允许远程连接

MariaDB [(none)]> GRANT ALL ON *.* TO'root'@'172.16.%.%' IDENTIFIED BY 'mogilefs' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;

5、2 Node1配置tracker

安装如下软件包,虽然只是配置tracker,但还是安装了storage的包,是因为后面做高可用时用到

MogileFS-Server-2.46-2.el6.noarch.rpm            #通行组件
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  #traker
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  #storage
MogileFS-Utils-2.19-1.el6.noarch.rpm             #工具包
perl-MogileFS-Client-1.14-1.el6.noarch.rpm      #客户端开发使用
perl-Net-Netmask-1.9015-8.el6.noarch.rpm        #机架感知能力
perl-Perlbal-1.78-1.el6.noarch.rpm               #依赖包

安装命令如下

[root@node1 ~]# yum --nogpgcheck localinstall *.rpm

由于node1是做tracker的,用到的主要程序包是MogileFS-Server-mogilefsd,其他和配置tracker没有太大关系,MogileFS-Server-mogilefsd生成的主要文件

[root@node1 ~]# rpm -ql MogileFS-Server-mogilefsd
/etc/mogilefs/mogilefsd.conf    #主配置文件
/etc/rc.d/init.d/mogilefsd      #启动脚本
/usr/bin/mogdbsetup              #数据库初始化工具
/usr/bin/mogilefsd               #mogilefsd主进程

初始化MogileFS数据库:使用可以连接到Mariadb的用户和密码,创建一个MogileFS使用的数据库和数据库的管理用户以及设置密码

 [root@node1~]# mogdbsetup --dbhost=172.16.4.100 --dbrootuser=root --dbrootpass=mogilefs  --dbname=mogdb --dbuser=moguser--dbpass=mogpass
 
This will attempt to setup or upgrade your MogileFSdatabase.
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 'mogdb'? [Y/n]: y
 
Grant all privileges to user 'moguser', connectingfrom anywhere, to the mogilefs database 'mogdb'? [Y/n]: y

补充:可以使用 --yes选项回答各种询问为yes。

 

验证初始化Mariadb:登录数据库查看mogdb数据库自动创建,而且库中自动创建了一些表

MariaDB [(none)]> show databases;
+--------------------+
| Database          |
+--------------------+
| information_schema |
| mogdb             |
| mysql             |
| performance_schema |
| test              |
+--------------------+
5 rows in set (0.01 sec)
 
MariaDB [(none)]> use mogdb;
Database changed
MariaDB [mogdb]> show tables;
+----------------------+
| Tables_in_mogdb      |
+----------------------+
| checksum             |
| class                |
| device               |
| domain               |
| file                 |
| file_on              |
| file_on_corrupt      |
| file_to_delete       |
| file_to_delete2      |
| file_to_delete_later |
| file_to_queue        |
| file_to_replicate    |
| fsck_log             |
| host                 |
| server_settings      |
| tempfile             |
| unreachable_fids     |
+----------------------+

修改mogilefsd.conf文件设置连接Mariadb的用户名和密码,mogilefsd监听的地址和端口,启用的一些线程

[root@node1 ~]# vim /etc/mogilefs/mogilefsd.conf
db_dsn = DBI:mysql:mogdb:host=172.16.4.100         #DBI:perl连接mysql的驱动,mysql数据库类型,mogdb连接的数据库,host不解释
db_user = moguser                                      #连接数据库的用户
db_pass = mogpass                                      #连接数据库的密码
listen = 172.16.4.100:7001                            #mogilefsd监听的地址
conf_port = 7001                                       #监听的端口
query_jobs = 10                                        #启用的请求线程,为10表示只能并发10个客户端;注意客户端不是用户访问量,而是连接使用mogilefsd的服务器
delete_jobs = 1                                        #用于删除的线程
replicate_jobs = 5                                     #用于作复制的线程数量
reaper_jobs = 1                                        #在存储失败后将文件复制请求重新放置于队列中的线程

设置完成启动服务并验证7001端口已经启动

[root@node1 ~]# service mogilefsd start
[root@node1 ~]# netstat -lntp | grep 7001
tcp       0      0 172.16.4.100:7001           0.0.0.0:*                   LISTEN      39558/mogilefsd

 

5、3 node2配置storage

安装如下软件包,配置storage主要用到的软件包是MogileFS-Server-mogstored

MogileFS-Server-2.46-2.el6.noarch.rpm             #通用组件
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  #tracker
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  #storage
MogileFS-Utils-2.19-1.el6.noarch.rpm             #工具包
perl-MogileFS-Client-1.14-1.el6.noarch.rpm      #客户端开发使用
perl-Net-Netmask-1.9015-8.el6.noarch.rpm        #机架感知能力
perl-Perlbal-1.78-1.el6.noarch.rpm               #依赖包

安装命令如下

[root@node2 ~]# yum --nogpgcheck localinstall *.rpm

Mogstored依赖与perl-IO-AIO这个包,需要额外安装,否则mogstored无法正常启动

[root@node2 ~]# yum -y install perl-IO-AIO

MogileFS-Server-mogstored生成的文件

[root@node2 ~]# rpm -ql MogileFS-Server-mogstored
/etc/mogilefs/mogstored.conf    #主配置文件
/etc/rc.d/init.d/mogstored      #脚本文件
/usr/bin/mogautomount            #自动挂载的工具
/usr/bin/mogstored                #主程序

创建一个目录准备存储文件,并且设置属主和属组为mogilefs,否则tracker节点会无法读取数据

[root@node2 ~]# mkdir /mogstore
[root@node2 ~]# chown -R mogilefs.mogilefs/mogstore/

将存储目录挂载到单独的分区

[root@node2 ~]# vim /etc/fstab
/dev/sda4               /mogstore               ext4    defaults        0 0
[root@node2 ~]# mount -a
[root@node2 ~]# mount
/dev/sda4 on /mogstore type ext4 (rw)

在存储目录创建设备编号目录,注意此目录各个节点不能重名

[root@node2 ~]# mkdir /mogstore/dev2

修改配置文件

[root@node2 ~]# vim /etc/mogilefs/mogstored.conf
maxconns = 10000              #最大并发连接数
httplisten = 0.0.0.0:7500    #http协议监听的端口
mgmtlisten = 0.0.0.0:7501    #管理监听的端口
docroot = /mogstore           #文件存储的目录

设置完成启动服务,并验证端口是否正常启动

[root@node2 ~]# service mogstored start
[root@node2 ~]# netstat -lntp | egrep"7500|7501"
tcp       0      0 0.0.0.0:7500                0.0.0.0:*                   LISTEN      37119/mogstored    
tcp       0      0 0.0.0.0:7501                0.0.0.0:*                   LISTEN      37119/mogstored

5、4 node3配置storage

安装如下软件包

MogileFS-Server-2.46-2.el6.noarch.rpm            #通用组件
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  #tracker
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  #storage
MogileFS-Utils-2.19-1.el6.noarch.rpm             #工具包
perl-MogileFS-Client-1.14-1.el6.noarch.rpm      #客户端开发使用
perl-Net-Netmask-1.9015-8.el6.noarch.rpm        #机架感知能力
perl-Perlbal-1.78-1.el6.noarch.rpm               #依赖包

安装命令如下

[root@node3 ~]# yum --nogpgcheck localinstall *.rpm

Mogstored依赖与perl-IO-AIO这个包,所以需要额外安装

[root@node3 ~]# yum -y install perl-IO-AIO

创建一个目录准备存储文件,并设置属主和属组为mogilefs

[root@node3 ~]# mkdir /mogstore
[root@node3 ~]# chown -R mogilefs.mogilefs/mogstore/

将存储目录挂载到单独的分区

[root@node3 ~]# vim /etc/fstab
/dev/sda4               /mogstore               ext4    defaults        0 0
[root@node3 ~]# mount -a
[root@node3 ~]# mount
/dev/sda4 on /mogstore type ext4 (rw)

在存储目录创建设备编号目录,注意此目录各个节点不能重名

[root@node3 ~]# mkdir /mogstore/dev3

修改配置文件

[root@node3 ~]# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogstore

设置完成启动服务,并验证端口是否正常启动

[root@node3 ~]# service mogstored start
[root@node3 ~]# netstat -lntp | egrep"7500|7501"
tcp       0      0 0.0.0.0:7500                0.0.0.0:*                   LISTEN      37119/mogstored    
tcp       0      0 0.0.0.0:7501                0.0.0.0:*                   LISTEN      37119/mogstored

5、5 配置分布式集群

查看MogileFS-Utils生成的命令,只列出常用的命令

[root@node1 ~]# rpm -ql MogileFS-Utils
/usr/bin/mogadm            #MogileFS管理工具,可以实现将mogstored加入到mogilefsd
/usr/bin/mogdelete        #删除文件
/usr/bin/mogfetch         #获取文件
/usr/bin/mogfileinfo      #查看文件
/usr/bin/mogupload         #上传文件

Mogadm命令的常用功能:

mogadm check             #状态检测

mogadm stats             #显示MogileFS的状态统计信息

mogadm host ...         #管理主机

mogadm device ...       #管理设备

mogadm domain ...       #管理域

mogadm class ...        #管理类

mogadm slave ...        #管理复制

mogadm fsck ...         #文件系统检查和修复

mogadm rebalance ...   #重新均衡(MogileFS运行时间久了mogstored存储的数据量可能不一样,重新均衡一下各个节点的数据就差不多了)

mogadm settings ...    #设置文件复制数

 

说明:使用mogadm –help或者man mogadm可以查看mogadm命令的详细使用说明

5、5、1 添加主机

向集群中添加主机,将node2和node3添加到集群中

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001host add node2 --ip=172.16.4.101 --status=alive
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001host add node3 --ip=172.16.4.102 --status=alive

add:表示添加主机

node2:表示主机名,这个可以随便写

--ip:表示添加的主机地址

--status=alive:表示添加之后的状态为上线

 

添加完成查看主机列表已经有了主机

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001host list
node2 [1]: alive
  IP:       172.16.4.101:7500
 
node3 [2]: alive
  IP:       172.16.4.102:7500

5、5、2 添加设备

节点虽然添加完成了,但是还不能存储数据,如果想存储数据需要追踪存储节点上面的设备

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device add node2 2
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device add node3 3

add:表示添加设备

Node2:节点名称,必须和添加主机时保持一致

2:添加的dev设备编号

 

添加完成查看device列表就已经出现了设备

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device list
node2 [1]: alive
                   used(G)    free(G)   total(G) weight(%)
   dev2:   alive     0.042     27.866     27.908        100
 
node3 [2]: alive
                   used(G)    free(G)   total(G) weight(%)
   dev3:   alive     0.042     27.866     27.908        100

 

补充:一开始不小心将node3节点的设备,添加为了dev4,然后由添加了dev3,结果node3就出现了dev3和dev4两个设备

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device add node3 4
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device list
node2 [1]: alive
                   used(G)    free(G)   total(G) weight(%)
   dev2:   alive     0.000      0.000      0.000        100
 
node3 [2]: alive
                   used(G)    free(G)   total(G) weight(%)
   dev3:   alive     0.042      27.866      27.908        100
   dev4:   alive     0.042      27.866     27.908        100

删除方法:这里没有deleted命令,需要使用mark将dev4标记为dead状态就删除了

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device mark node3 4 dead

5、5、3 定义domain和class

定义名称空间(domain):

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001domain add images
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001domain add conffiles
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001domain list
 domain               class                mindevcount   replpolicy  hashtype
-------------------- --------------------------------- ------------ -------
 conffiles            default                   2        MultipleHosts() NONE  
 
 images               default                   2        MultipleHosts() NONE

domain:domain的名字

class:domain创建完成之后会自动创建一个class,所有的文件都存放在class中

mindevcount:最小复制单元;为2表示上传的文件最少存储两个副本

replpolicy:复制策略,MultipleHosts()表示多主机实现复制,这里不用管为默认即可

hashtype:class在命名时是使用哈希进行计算的,这里表示哈希算法,NONE表示没有使用哈希算法

 

定义class:

由于创建domain会自动创建class,所以会出现class

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001class list
 domain               class                mindevcount   replpolicy  hashtype
-------------------- --------------------------------- ------------ -------
 conffiles            default                   2        MultipleHosts() NONE  
 
 images               default                   2        MultipleHosts() NONE

新添加一个class

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001class add images nc1 --mindevcount=2
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001class list
 domain               class                mindevcount   replpolicy  hashtype
-------------------- --------------------------------- ------------ -------
 conffiles            default                   2        MultipleHosts() NONE  
 
 images               default                   2        MultipleHosts() NONE  
 images               nc1                       2        MultipleHosts() NONE

5、6 验证分布式系统

这个时候分布式文件系统就搭建好了,可以使用mogupload命令上传文件测试

[root@node1 ~]# mogupload--trackers=172.16.4.100:7001 --domain=images --key='/1.jpg'--file='/usr/share/backgrounds/centos_1920x1200_logoonly.jpg'

--domain=images:表示存储到images这个domain中

--key='/1.jpg':访问文件的URL地址

--file:本地上传的文件

 

查看上传文件的信息,在node1和node2这两个节点都有了文件

[root@node1 ~]# mogfileinfo--trackers=172.16.4.100:7001 --domain=images --key='/1.jpg'
- file: /1.jpg
    class:              default
 devcount:                    2
   domain:               images
       fid:                    2
      key:               /1.jpg
   length:                57592
 -http://172.16.4.102:7500/dev3/0/000/000/0000000002.fid
 -http://172.16.4.101:7500/dev2/0/000/000/0000000002.fid

 

这个时候分别访问下面的两个URL就可以出现刚刚上传的图片了

- http://172.16.4.102:7500/dev3/0/000/000/0000000002.fid

-http://172.16.4.101:7500/dev2/0/000/000/0000000002.fid

刚刚上传了一个图片,这次上传一个文本文件试试

[root@node1 ~]# mogupload--trackers=172.16.4.100:7001 --domain=conffiles --key='/configures/fstab'--file='/etc/fstab'
[root@node1 ~]# mogfileinfo --trackers=172.16.4.100:7001--domain=conffiles --key='/configures/fstab'
- file: /configures/fstab
    class:              default
 devcount:                    2
   domain:            conffiles
      fid:                    3
      key:    /configures/fstab
   length:                  921
 -http://172.16.4.102:7500/dev3/0/000/000/0000000003.fid
 -http://172.16.4.101:7500/dev2/0/000/000/0000000003.fid

分别访问两个URL路径,查看文件都可以正常显示



不光可以上传文件,还可以下载文件,使用mogfetch指明domain是那个,key路径,使用file在指明下载之后存储到本地的那里即可

[root@node1 ~]# mogfetch--trackers=172.16.4.100:7001 --domain=conffiles --key='/configures/fstab'--file='/root/fstab'
[root@node1 ~]# ll /root/fstab
-rw-r--r-- 1 root root 921 May 27 06:34 /root/fstab

6、Mogilefsd高可用

Node1,node2,node3这三个节点否启动mogilefsd和mogstored,使客户端无论访问那一个节点都可以获取到数据,而且replpolicy设置最少2份,计算是一台节点故障下线其他节点也可以继续提供服务。

6、1 Node1配置mogstored

手动安装mogstored的依赖包,如果不安装此包,启动mogstroed时端口不会正常启动

 [root@node1~]# yum install perl-IO-AIO

创建存储目录并挂载

[root@node1 ~]# mkdir /mogstore
[root@node1 ~]# vim /etc/fstab
/dev/sda4               /mogstore               ext4    defaults        0 0
[root@node1 ~]# mount -a
[root@node1 ~]# mount
/dev/sda4 on /mogstore type ext4 (rw)

创建设备目录并授权mogilefs用户

[root@node1 ~]# mkdir /mogstore/dev1
[root@node1 ~]# chown -R mogilefs.mogilefs/mogstore/

修改配置文件,指定存储目录位置

[root@node1 ~]# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogstore

启动服务

[root@node1 ~]# service mogstored start
[root@node1 ~]# netstat -lntp | egrep"7500|7501"
tcp       0      0 0.0.0.0:7500                0.0.0.0:*                   LISTEN      41087/mogstored    
tcp       0      0 0.0.0.0:7501                0.0.0.0:*                   LISTEN      41087/mogstored


配置完成之后使用mogadm命令将自己也添加到集群中

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001host add node1 --ip=172.16.4.100 --status=alive
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001host list
node2 [1]: alive
  IP:       172.16.4.101:7500
 
node3 [2]: alive
  IP:       172.16.4.102:7500
 
node1 [3]: alive
  IP:       172.16.4.100:7500

添加node1的设备到集群中

[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device add node1 1
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device list
node2 [1]: alive
                   used(G)    free(G)   total(G) weight(%)
   dev2:   alive     0.043     27.865     27.908        100
 
node3 [2]: alive
                   used(G)    free(G)   total(G) weight(%)
   dev3:   alive     0.043     27.865     27.908        100
 
node1 [3]: alive
                   used(G)    free(G)   total(G) weight(%)
   dev1:   alive     0.042     27.866     27.908        100

由于node2和node3节点需要配置mogilefsd需要把node1上面的配置文件直接拷贝过去,省的node2和node3节点修改

[root@node1 ~]# scp /etc/mogilefs/mogilefsd.conf172.16.4.101:/etc/mogilefs/
[root@node1 ~]# scp /etc/mogilefs/mogilefsd.conf 172.16.4.102:/etc/mogilefs/

6、2 Node2配置mogilefsd

由于node1节点已经将配置文件拷贝过来了,所以直接修改配置文件的监听地址即可,其他选项无需修改

[root@node2 ~]# vim /etc/mogilefs/mogilefsd.conf
listen = 172.16.4.101

设置完成启动服务即可

[root@node2 ~]# service mogilefsd start
[root@node2 ~]# netstat -lnt | grep 7001
tcp       0      0 172.16.4.101:7001           0.0.0.0:*                   LISTEN

6、3 Node3配置mogilefsd

同node2只需要修改监听地址

[root@node3 ~]# vim /etc/mogilefs/mogilefsd.conf
listen = 172.16.4.102

启动服务即可

[root@node3 ~]# service mogilefsd start
[root@node3 ~]# netstat -lnt | grep 7001
tcp       0      0 172.16.4.102:7001           0.0.0.0:*                   LISTEN

6、4 验证MogileFS的高可用

在三个节点各自配置好了tracker和storage之后高可用的MogileFS就配置完成了。

 

验证方法如下:无论使用mogadm连接那一个节点,都可以看到节点中包含了三个主机

[root@node3 ~]# mogadm --trackers=172.16.4.100:7001host list
node2 [1]: alive
  IP:       172.16.4.101:7500
 
node3 [2]: alive
  IP:       172.16.4.102:7500
 
node1 [3]: alive
  IP:       172.16.4.100:7500
 
[root@node3 ~]# mogadm --trackers=172.16.4.101:7001host list
node2 [1]: alive
  IP:       172.16.4.101:7500
 
node3 [2]: alive
  IP:       172.16.4.102:7500
 
node1 [3]: alive
  IP:       172.16.4.100:7500
 
[root@node3 ~]# mogadm --trackers=172.16.4.102:7001host list
node2 [1]: alive
  IP:       172.16.4.101:7500
 
node3 [2]: alive
  IP:       172.16.4.102:7500
 
node1 [3]: alive
  IP:       172.16.4.100:7500

上传文件验证,由于只是设置两个复制份数,所以上传的文件会随机出现在两个节点中。

[root@node3 ~]# mogupload--trackers=172.16.4.100:7001,172.16.4.101:7001,172.16.4.102:7001--domain=conffiles --key='/issue' --file='/etc/issue'
[root@node3 ~]# mogfileinfo --trackers=172.16.4.100:7001,172.16.4.101:7001,172.16.4.102:7001--domain=conffiles --key='/issue'
- file: /issue
    class:              default
 devcount:                    2
   domain:            conffiles
      fid:                    7
      key:               /issue
   length:                  103
 -http://172.16.4.100:7500/dev1/0/000/000/0000000007.fid
 -http://172.16.4.101:7500/dev2/0/000/000/0000000007.fid

 

7、使用nginx反向代理MogileFS

拓扑图:

Nginx IP地址:172.16.4.10

系统环境和node节点一致


7、1 安装nginx

Nginx默认不支持MogileFS的配置,需要在编译nginx时指定nginx_mogilefs_module模块才可以代理MogileFS

 

nginx的mogilefs模块官方配置地址

http://www.grid.net.ru/nginx/mogilefs.en.html


编译安装nginx

[root@nginx ~]# useradd nginx
[root@nginx ~]# mkdir /var/tmp/nginx/client -p
[root@nginx ~]# yum -y install pcre-devel
[root@nginx ~]# tar xf nginx-1.6.2.tar.gz    
[root@nginx ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz   #编译nginx之前需要先解压出来,编译nginx的时候需要用
[root@nginx ~]# cd nginx-1.6.2

编译配置,这里需要指定MogileFS的模块位置

./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 \
 --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=../nginx_mogilefs_module-1.0.4/    #编译时一定要使用这一项指明mogilefs模块的解压目录位置
make && make install

编译完成提供nginx启动脚本

[root@nginx ~]# cat /etc/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginxdaemon
#
# chkconfig:  - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
#              proxy and IMAP/POP3 proxy server
# processname: nginx
# config:     /etc/nginx/nginx.conf
# config:     /etc/sysconfig/nginx
# pidfile:    /var/run/nginx.pid
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ "$NETWORKING" = "no" ]&& exit 0
 
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
 
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
 
[ -f /etc/sysconfig/nginx ] && ./etc/sysconfig/nginx
 
lockfile=/var/lock/subsys/nginx
 
make_dirs() {
   # make required directories
  user=`nginx -V 2>&1 | grep "configure arguments:" | sed's/[^*]*--user=\([^ ]*\).*/\1/g' -`
  options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in$options; do
       if [`echo $opt | grep '.*-temp-path'` ]; then
          value=`echo $opt | cut -d "=" -f 2`
           if[ ! -d "$value" ]; then
              # echo "creating" $value
              mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}
 
start() {
    [ -x$nginx ] || exit 5
    [ -f$NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n$"Starting $prog: "
    daemon$nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval-eq 0 ] && touch $lockfile
    return$retval
}
 
stop() {
    echo -n$"Stopping $prog: "
    killproc$prog -QUIT
    retval=$?
    echo
    [ $retval-eq 0 ] && rm -f $lockfile
    return$retval
}
 
restart() {
   configtest || return $?
    stop
    sleep 1
    start
}
 
reload() {
   configtest || return $?
    echo -n$"Reloading $prog: "
    killproc$nginx -HUP
    RETVAL=$?
    echo
}
 
force_reload() {
    restart
}
 
configtest() {
  $nginx -t-c $NGINX_CONF_FILE
}
 
rh_status() {
    status$prog
}
 
rh_status_q() {
    rh_status>/dev/null 2>&1
}
 
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
       rh_status_q || exit 0
        $1
        ;;
   restart|configtest)
        $1
        ;;
    reload)
       rh_status_q || exit 7
        $1
        ;;
   force-reload)
       force_reload
        ;;
    status)
       rh_status
        ;;
   condrestart|try-restart)
       rh_status_q || exit 0
           ;;
    *)
        echo$"Usage: $0{start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit2
esac

设置执行权限,并加入服务列表

[root@nginx ~]# chmod +x /etc/rc.d/init.d/nginx
[root@nginx ~]# chkconfig --add nginx

启动nginx服务

[root@nginx ~]# service nginx start
[root@nginx ~]# netstat -lntp | grep 80
tcp       0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      8841/nginx

 

7、2 设置反向代理

修改nginx配置文件添加一个location

        location /images/ {
            mogilefs_tracker172.16.4.100:7001;
            mogilefs_domainimages;
 
            mogilefs_pass {
                proxy_pass$mogilefs_path;
               proxy_hide_header Content-Type;
               proxy_buffering off;
            }

设置完成重启服务,配置生效

 

向存储中上传文件

[root@node1 ~]# mogupload --trackers=172.16.4.100:7001 --domain=images--key="2.jpg" --file="/root/2.jpg"
[root@node1 ~]# mogfileinfo --trackers=172.16.4.100:7001--domain=images --key="2.jpg"
- file: 2.jpg
     class:              default
  devcount:                    2
    domain:               images
       fid:                    8
       key:                2.jpg
    length:               150255
 -http://172.16.4.100:7500/dev1/0/000/000/0000000008.fid
 -http://172.16.4.102:7500/dev3/0/000/000/0000000008.fid

使用nginx访问/images/下的2.jpg,就可以看到刚刚上传的2.jpg文件

7、3 设置负载均衡

由于后端有3个tracker服务器,所以可以使用nginx的upstream实现负载均衡,配置方法如下所示:

  upstream mogtrackers {
      server 172.16.4.100:7001;
      server172.16.4.101:7001;
      server172.16.4.102:7001;
    }
 
server {
 省略内容……
       location /images/ {
           mogilefs_tracker mogtrackers;
           mogilefs_domain images;
 
           mogilefs_pass {
                proxy_pass $mogilefs_path;
               proxy_hide_header Content-Type;
               proxy_buffering off;
            }
        }

 

Tag标签: 分布式   文件   系统  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规