什么是分布式文件系统?

什么是分布式文件系统(Distributed File System)?顾名思义,就是分布式+文件系统。它包含了2方面,从文件系统的客户端的角度来看,他就是一个标准的文件系统,提供了API,由此可以进行文件的创建、删除、读写等操作;从内部来看的话,分布式文件系统则与普通的文件系统不同,它不在是本地的磁盘中,它的内容和目录都不是存储在本地磁盘中,而是通过网络传输到远程主机上,并且同一个文件存储在不只一台远程主机中,而是在一簇主机中进行分布式存储,协同提供服务。

常见的分布式文件系统

      GFS :Google File System

      HDFS:适合存储大文件;

      TFS:在名称节点上将元数据存储于关系型数据中,文件数量不再受限于名称节点的内存空间;可以存储海量小文件;

      Lustre: 企业级应用,重量级;

      GlusterFS: 适用于存储少量大文件 ,流媒体,云

      MooseFS: 通用简便,适用于存储小文件,大文件也不错

      Mogilefs: 使用Perl语言,FastDFS

      FastDFS:在内存中存储

      Ceph:内核级别,支持PB级别存储

MogileFS

  MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的DangaInteractive公司开发。Danga团队开发了包括Memcached、MogileFS、Perlbal等多个知名的开源项目。目前使用MogileFS的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片。

MogileFS:3 个重要组成

tracker:追踪原数据

database :存储元单元

storage:存储数据

     tracker:

           tracker(跟踪器) MogileFS的核心,是一个高度器,服务进程为mogilefsd。mogadm,mogtool的所有操作都要跟trackers打交道,Client的一些操作也需要定义好tracker,因此最好同时运行多个tracker来做负载均衡。

        database : 

             使用mogdbsetup程序来初始化数据库。数据库保存了Mogilefs的所有元数据,因此数据库部分非常重要,如果这儿挂了,那么整个Mogilefs将处于不可用状态。所以最好是HA结构。

       storage:

             mogstored(进程名),一个准备停当的mogstored节点可通过mogadm命令添加到现在现在集群中,存储节点需定义“设备(dev)用做存储空间”,每个“设备”在当前集群都需要通过一个惟一的设备ID(DevID)来识别

       client:客户端用与mogilefs建立通讯,完成数据存取。


特性:(1) 工作在应用层

          (2)无单点故障

          (3)自动完成文件复制,复制的最小单位不是文件,而class,也就是是把需要的冗余的文件组成了一块了,而这一块就是class

          (4)传输无需特殊协议

          (5)名称空间

           (6)不共享任何数据,只通过数据副本做冗余

           (7)简单的命名空间:用于domain定义名称空间(相当一个目录), 每个文件对应一个key,同一个domain内key是唯一的。

            (8) 定位文件时,在domain,定位文件的id号。

wKioL1cRsxnC1wmMAAKuR9iKxlQ114.jpg

-------------------------------------------------------------------------------------------------------------------------------------------

一:环境介绍:1台Trcacker,2台StoreNode. 

                      MYSQL和Trcacker 共用一台。Tracker IP :192.168.2.20    Mysql:192.168.2.20

                      StoreNode: 192.168.2.35    192.168.2.36

wKioL1cQ9MDAHIiNAABCSpC0Nn0305.png

二:Trcacker 服务 安装如下软件,建议使用elpo源解决依赖

         MogileFS-Server.noarch 0:2.46-2.el6           

         MogileFS-Server-mogilefsd.noarch 0:2.46-2.el6

         MogileFS-Server-mogstored.noarch 0:2.46-2.el6 

         MogileFS-Utils.noarch 0:2.19-1.el6           

         perl-IO-AIO.x86_64 0:3.71-2.el6               

         perl-MogileFS-Client.noarch 0:1.14-1.el6     

         perl-Net-Netmask.noarch 0:1.9015-8.el6      

         perl-Perlbal.noarch 0:1.78-1.el6    


(2)安装mysql给root 远程授权

MariaDB [(none)]> GRANT ALL ON *.* TO 'root'@'192.168.2.%' IDENTIFIED BY '123456' WITH GRANT OPTION;

MariaDB [(none)]> FLUSH PRIVILEGES;


(2):初始化mysql

   # mogdbsetup --dbhost=192.168.2.20 --dbrootuser=root --dbrootpass=123456 --dbname=mogdb --dbuser=moguser --dbpass=mogpass

 下面为初始化的过程

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 'mogdb'? [Y/n]: y

Grant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogdb'? [Y/n]: y


(3)配置 tracker端(mogilefsd)


 配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置选项如下: 
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogdb:host=192.168.2.20     //连接数据库为moddb. 主机为192.168.2.20

db_user = moguser                                               //连接名为moguser

db_pass = mogpass                                               //连接密码为 mogpass
listen = 192.168.2.20:7001                                    //tracker自己监听ip为192.168.2.20
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1

# service mogilefsd start      //重启mogilefsd


三:配置StoreNode.2个节点,分别安装下面软件:

    MogileFS-Server-2.46-2.el6.noarch.rpm 

    MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm 

    MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm

    MogileFS-Utils-2.19-1.el6.noarch.rpm

    perl-Net-Netmask-1.9015-8.el6.noarch.rpm 

    perl-Perlbal-1.78-1.el6.noarch.rpm 

    perl-MogileFS-Client-1.14-1.el6.noarch.rpm 

    perl-IO-AIO


(1)配置mogstared

 配置文件 /etc/mogilefs/mogstared.conf,主要的配置选项如下

maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501

docroot = /mogdata/data                //文件存取目录 


(2)这里假设存储数据目录是/mogdate/data下,在实际中会是单独的存储设备。


#  mkdir -p /mogdata/data

#  chown mogilefs.mogilefs /mogdata/data/ -R

#  service mogstored start

 

上面步骤在192.168.2.35 192.168.2.36 分别进行相同的操作。




(3)配置 tracker端,首先查看数据源

# mogstats --db_dsn="DBI:mysql:mogdb:host=192.168.2.20" --db_user="moguser" --db_pass="mogpass" --stats="all"


  (4)tracker端上用mogadm 添加主机

  # mogadm --trackers=192.168.2.20:7001 host add 192.168.2.35 --ip=192.168.2.35 --status=alive

  # mogadm --trackers=192.168.2.20:7001 host add 192.168.2.36 --ip=192.168.2.36 --status=alive

    查看添加后的主机

  # mogadm  --trackers=192.168.2.20:7001 host list

wKiom1cQ4PzzTyZZAAAc_L9-J80318.png

  (5)添加设备,并设定设备号,设备号不能重复

  # mogadm --trackers=192.168.2.20:7001 device add 192.168.2.35 1

  # mogadm --trackers=192.168.2.20:7001 device add 192.168.2.36 3

     查看添加后的设备

  # mogadm  --trackers=192.168.2.20:7001 device listwKioL1cQ4wqiOUlmAAA6BW0sK1k105.png

分别在/mogdata/data/目录下建立dev1  和dev3,并把属主属主改成mogilefs


在192.168.2.35:

# mkdir /mogdata/data/dev1

# chown -R mogilefs.mogilefs /mogdata/data


在192.168.2.36:
# mkdir /mogdata/data/dev3

# chown -R mogilefs.mogilefs /mogdata/data


(6)添加域images, files

# mogadm  --trackers=192.168.2.20:7001 domain add images

   # mogadm  --trackers=192.168.2.20:7001 domain add files

   查看域

# mogadm  --trackers=192.168.2.20:7001 domain list

wKioL1cQ5ZjTgbWaAAAqhl-QG0Q724.png

   (7)添加一个class (这个根据实际需要添加,在这里是非必要步骤)

   # mogadm  --trackers=192.168.2.20:7001 class add images class1 --mindevcount=2    (2为保留2个副本)

添加后查看

   # mogadm  --trackers=192.168.2.20:7001 class list

 wKioL1cQ5rXS3WOoAAAnPYYEJmo965.png

四:测试:

上传文件:mogupload

    # mogupload  --trackers=192.168.2.20:7001 --domain=files --key='/33.jpg' --file=/root/linux.jpg 

    # mogupload  --trackers=192.168.2.20:7001 --domain=images --key='/22.jpg' --file=/root/2222.jpg 

    # mogupload  --trackers=192.168.2.20:7001 --domain=images --key='/11.jpg' --file=/root/1111.jpg

查看文件信息:mogfileinfo

    # mogfileinfo --trackers=192.168.2.20:7001 --domain=files --key='/33.jpg'

    # mogfileinfo --trackers=192.168.2.20:7001 --domain=images --key='/11.jpg'

    # mogfileinfo --trackers=192.168.2.20:7001 --domain=images --key='/22.jpg'

wKioL1cRLOiTOcnvAABqzqrvikU783.png

红把部分可以用浏览器访问


下载图片:

   # mogfetch --trackers=192.168.2.20:7001 --domain=images --key='/11.jpg' --file='/tmp/3.jpg'

列出domain中已存文件

# moglistkeys --trackers=192.168.2.20:7001 --domain=files;

# moglistkeys --trackers=192.168.2.20:7001 --domain=images;

试验2:NGINX反向代理

wKioL1cRt97Di_XKAAB5kfvCR-U825.png

添加一台服务器,ip为192.168.2.30,服务器同时做为 Tracker和Storaged:

(1)安装

   # yum install MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-IO-AIO.x86_64 0:3.71-2.el6


(2)在192.168.2.30上初始化数据库

  # mogdbsetup --dbhost=192.168.2.20 --dbrootuser=root --dbrootpass=123456 --dbname=mogdb --dbuser=moguser --dbpass=mogpass




(3) 配置 tracker端(mogilefsd)

 配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置选项如下: 
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogdb:host=192.168.2.20       //连接数据库为mogdb, ip为192.168.2.20
db_user = moguser                                                 // 连接用户名为moguser
db_pass = mogpass                                                  // 连接密码为mogpass
listen = 192.168.2.30:7001                                      //自己监听的ip:192.168.2.30
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1

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


# service mogilefsd start             //配置文件修改后重启mogilefsd


(4)下面为重启mogilefsd 后就能从192.168.2.30上查看到原已添加的主机。

wKioL1cREA_Bnk9cAABb1mU5iT0595.png


(5)配置mogstared

  # cat /etc/mogilefs/mogstored.conf 

maxconns = 10000

httplisten = 0.0.0.0:7500

mgmtlisten = 0.0.0.0:7501

docroot = /mogdata/data/


(6)  建立目录

  # mkdir -p /mogdata/data

  # chown mogilefs.mogilefs /mogdata/data/ -R

  # service mogstored start


(7)添加主机,因为192.168.2.30服务器同时做为 Tracker和Storaged,所以Tracker的ip为192.168.2.30,Storaged的ip 也为192.168.2.30,添加的主机名,这里用的是ip,所以也为192.168.2.30


  # mogadm  --trackers=192.168.2.30:7001 host add 192.168.2.30 --ip=192.168.2.30 --status=alive


添加设备为192.168.2.30,设备号为4,

  # mogadm  --trackers=192.168.2.30:7001 device add 192.168.2.30 4

建立dev4目录,为改变权限

   # mkdir /mogdata/data/dev4 

   # chown -R mogilefs.mogilefs /mogdata/data

查看trackers:如下图

wKiom1cRGF-yDfLrAABrtq9Q91M902.png


NGINX在编译时添加第三方模块:

useradd -r nginx
tar xf nginx_mogilefs_module-1.0.4.tar.gz
tar xf nginx-1.6.2.tar.gz
cd nginx-1.6.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 --with-debug \
  --add-module=../nginx_mogilefs_module-1.0.4

make && make install


NGINX.conf 文件配置如下:

upstream trackers{

    server 192.168.2.20:7001;

    server 192.168.2.30:7001;

}

location  /upload {

         mogilefs_tracker trackers;

         mogilefs_domain images;    //指定使用的domain,这个很关键,

         mogilefs_methods GET;     // GET PUT DELETE; 允许上传,删除时方法

         mogilefs_noverify on;

         mogilefs_pass {

                    proxy_pass $mogilefs_path;

                    proxy_hide_header Content-Type;

                    proxy_buffering off;

            }

}

访问如下:

wKiom1cRLmrQh2OnAAULsZ9hDho494.png


# curl -X DELETE http://192.168.2.10/upload/66.jpg  请求方法允许删除时,可以直接删除