分布式文件系统之——mogilefs

本节我们将来认识下分布式文件系统,不过我主要讲的是关于其中的一个比较流行的mogilefs进行介绍,好了其他的不多说了,下面我们就开始吧。

什么是分布式文件系统?

什么是分布式文件系统(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的特性:

1、 应用层: 用户空间文件系统,无须特殊的核心组件

2、无单点:(tracker, mogstore, database(MySQL))

3、自动文件复制:复制的最小单位不是文件,而class;

4、传输中立,无特殊协议:可以通过NFS或HTTP进行通信;

5、比RAID好多了

6、简单的命名空间: 每个文件对应一个key:用于domain定义名称空间

7、不共享任何数据:

MogileFS组件:

Tracker nodes: MogileFS的核心,是一个调度器;服务进程为mogilefsd; 职责:删除、复制、监控、查询等;

storge nodes:mogstored进程: 数据存储的位置,通常是一个HTTP(WebDAV)服务器,用来数据的创建、删除、获取;

Database nodes(MySQL):用于为tracker存储元数据信息,mogileFS

实验:构建基于Nginx+mogilefs的分布式文件系统

实验拓扑图:

总的实验步骤如下:由于有些步骤连在一起做,所以做的时候可能并不是完全按照以下步骤进行:

安装tracker:

1、安装相关的包:

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

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

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

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

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

2、授权数据库用户,并初始mysql数据库

# mogdbsetup

3、修改配置文件

db_dsn = DBI:mysql:DBNAME:host=HOSTNAME

4、启动mogilefsd进程

安装mogstord:

1、安装相关的包

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

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

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

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

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

perl-IO-AIO

2、准备存储设备

挂载至某路径下,确认此路径下存在文件devN

此路径的属主和属组为mogilefs.mogilefs

3、修改配置文件/etc/mogilefs/mogstored.conf

docRoot=

前面的挂载路径;

配置mogielfs:

1、向tracker添加各mogstored主机

mogadm --trackers=TRACKER_NODE host add

2、向tracker添加各设备

mogadm --trackers=TRACKER_NODE device add

3、为tracker定义名称空间domain

mogadm --trackers=TRACKER_NODE domain add

4、为domain添加一个或多个class

mogadm --trackers=TRACKER_NODE class add

可同时副本的最少个数;

好了下面就开始安装了。

2个storage节点都装上以下几个包

[[email protected] mogilefs]# ls    
MogileFS-Server-2.46-2.el6.noarch.rpm            MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  perl-MogileFS-Client-1.14-1.el6.noarch.rpm  perl-Perlbal-1.78-1.el6.noarch.rpm    
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Net-Netmask-1.9015-8.el6.noarch.rpm    
[[email protected] mogilefs]# yum install -y * perl-IO-AIO

各自创建存储目录(2个节点分别为dev{1,2})

第一个节点:

[[email protected] mog]# mkdir -pv /mogdata/data/dev1    
mkdir: created directory `/mogdata‘    
mkdir: created directory `/mogdata/data‘    
mkdir: created directory `/mogdata/data/dev1‘

第二个节点:

[[email protected] mog]# mkdir -pv /mogdata/data/dev2    
mkdir: created directory `/mogdata‘    
mkdir: created directory `/mogdata/data‘    
mkdir: created directory `/mogdata/data/dev2‘

修改文件夹权限

[[email protected] ~]# chown -R mogilefs.mogilefs /mogdata/data/

数据库授权

mysql节点安装并启动mysqld

[[email protected] mog]# yum install mysql mysql-server

[[email protected] mog]# service mysqld start

Please report any problems with the /usr/bin/mysqlbug script!

[  OK  ]    
Starting mysqld:                                           [  OK  ]

进入mysql进行授权

mysql> grant all on mogilefs.* to ‘moguser‘@‘172.16.%.%‘ identified by ‘mogpass‘;    
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;    
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on *.* to ‘root‘@‘172.16.%.%‘ identified by ‘mageedu‘;    
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;    
Query OK, 0 rows affected (0.00 sec)

OK,下面到storage端进行数据库初始化

初始化完成可以在数据库中查看

修改配置文件

注意2个节点中都要修改

[[email protected] mog]# vim /etc/mogilefs/mogilefsd.conf

然后就可以启动服务了

[[email protected] mog]# service mogilefsd start    
Starting mogilefsd                                         [  OK  ]

查看端口是否开启

下面修改mogstored的配置文件并启动服务(2个节点都要改)

[[email protected] mog]# vim /etc/mogilefs/mogstored.conf

[[email protected] ~]# service mogstored start    
Starting mogstored                                         [  OK  ]

查看端口是否启动

添加节点

[[email protected] ~]# mogadm --trackers=172.16.6.20:7001 host add 172.16.6.20 --ip=172.16.6.20 --status=alive    
[[email protected] ~]# mogadm --trackers=172.16.6.20:7001 host add 172.16.6.30 --ip=172.16.6.30 --status=alive

查看是否添加成功

添加设备

[[email protected] ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.20 1    
[[email protected] ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.30 2

查看是否添加成功

发现刚刚的文件目录的权限没给。注:修改权限的步骤我没写在这里,我放到了上面的修改权限

修改之后就OK :

创建domain:实现名称空间

[[email protected] ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 domain add files

[[email protected] ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 domain add images

查看生成的domain

创建class:复制文件的最小单位

解释下这里的几个参数意思:

mindevcount:最小复制文件的份数

replpolicy :复制份数

hashtype:采用的hash的类型

好了下面就可以上传一下文件试一下看看了

上传图片文件

[[email protected] ~]# mogupload --trackers=172.16.6.20:7001 --domain=images --key=‘/a.jepg‘ --file=‘/root/75b4519340.jpg‘

上传文本文件

[[email protected] ~]# mogupload --trackers=172.16.6.20:7001 --domain=files --key=‘/init.html‘ --file=‘/etc/inittab‘

查看文件的fid进行访问

[[email protected] ~]# mogfileinfo --trackers=172.16.6.20:7001 --domain=images --key=‘/a.jepg‘    
- file: /a.jepg    
     class:              default    
  devcount:                    2    
    domain:               images    
       fid:                    4    
       key:              /a.jepg    
    length:               432441    
- http://172.16.6.30:7500/dev2/0/000/000/0000000004.fid    
- http://172.16.6.20:7500/dev1/0/000/000/0000000004.fid

[[email protected] ~]# mogfileinfo --trackers=172.16.6.20:7001 --domain=files --key=‘/init.html‘    
- file: /init.html    
     class:              default    
  devcount:                    2    
    domain:                files    
       fid:                    5    
       key:           /init.html    
    length:                  884    
- http://172.16.6.20:7500/dev1/0/000/000/0000000005.fid    
- http://172.16.6.30:7500/dev2/0/000/000/0000000005.fid

OK,成功了。

但是如果是通过fid来访问的方式实在是太过拙劣,我们能不能通过直接访问如172.16.6.20/a.jpeg这种方式来访问呢

没错,那这就是用nginx来反向代理的意义了,我们可以通过nginx上的mogilefs模块来实现这种功能,那么下面就来让我们安装配置吧

nginx的编译安装

由于yum安装的nginx不支持mogilefs这个模块,因此我们只能编译安装了

编译之前确保编译环境准备就绪

# yum groupinstall "Development Tools" "Server Platform Deveopment"    
# yum install openssl-devel pcre-devel

下面我们需要编译安装的包已经模块包

这里我已经下载好了

[[email protected] ~]# ls  
anaconda-ks.cfg  install.log  install.log.syslog  mogilefs  nginx-1.6.1.tar.gz  nginx_mogilefs_module-1.0.4.tar.gz

创建系统用户nginx

[[email protected] nginx-1.6.1]# groupadd -r nginx    
[[email protected] nginx-1.6.1]# useradd -g nginx -r nginx

2个包都进行解压

[[email protected] ~]# tar xf nginx-1.6.1.tar.gz    
[[email protected] ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz

编译安装nginx

[[email protected] ~]# cd nginx-1.6.1

[[email protected] nginx-1.6.1]# make && make install

ok,安装完毕

修改配置文件使nginx进行反向代理

[[email protected] nginx-1.6.1]# vim /etc/nginx/nginx.conf

以下yellow字体为加入的配置

worker_processes  1;

events {    
    worker_connections  1024;    
}

http {    
    include       mime.types;    
    default_type  application/octet-stream;

sendfile        on;    
    #tcp_nopush     on;

#keepalive_timeout  0;    
    keepalive_timeout  65;

#gzip  on;    
    upstream trackers {                                           定义上流服务器集群      
       server 172.16.6.20:7001;      
       server 172.16.6.30:7001;      
}      
    server {    
        listen       80;    
        server_name  localhost;

#charset koi8-r;

#access_log  logs/host.access.log  main;

location / {    
            root   html;    
            index  index.html index.htm;    
        }    
       location ~* ^(/img/.*)$ {                 注意为了方便起见,这里我只是对图片这个区域进行了定义,

mogilefs_tracker trackers;     这里 并没有对其他区域定义,对其他区域定义的方式也一样      
           mogilefs_domain images;     指定区域        
           mogilefs_noverify on;

mogilefs_pass $1{

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;    
                  }

}

}

为nginx提供类似service的启动脚本

[[email protected] nginx-1.6.1]# vim /etc/init.d/nginx

#!/bin/sh    

#     

# nginx - this script starts and stops the nginx daemon     

#     

# 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/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}"     

        exit 2     

esac

给予执行权限

[[email protected] nginx-1.6.1]# chmod +x /etc/init.d/nginx

启动服务

[email protected] nginx-1.6.1]# service nginx start    
Starting nginx:                                            [  OK  ]

OK,下面我们就可以测试下了

先传一张图片到服务器上

[[email protected] ~]# mogupload --trackers=172.16.6.20:7001 --domain=images --key=‘/img/a.jpg‘ --file=‘/root/75b4519340.jpg‘

OK,下面我们直接用key的路径进行访问

OK,实验完成。

那么本节的内容就讲到这里,欢迎大家的批评指正,谢谢!

时间: 11-23

分布式文件系统之——mogilefs的相关文章

CentOS 6.5 分布式文件系统之MogileFS工作原理及实现过程

   MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上.MogileFS由3个部分组成:    第1个部分:是server端,包括mogilefsd和mogstored两个程序.前者即是mogilefsd的tracker,它将一些全局信息保存在数据库里,例如站点domain,class,host等.后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份

分布式文件系统之MogileFS工作原理及实现过程

MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上.MogileFS由3个部分组成:   第1个部分:是server端,包括mogilefsd和mogstored两个程序.前者即是mogilefsd的tracker,它将一些全局信息保存在数据库里,例如站点domain,class,host等.后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求.在

分布式文件系统之MogileFS实现

一.简介    1.分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连,也就是集群文件系统,可以支持大数量的节点以及PB级的数量存储. 相对地,在一个分享的磁盘文件系统中,所有节点对数据存储区块都有相同的访问权,在这样的系统中,访问权限就必须由客户端程序来控制. 分布式文件系统可能包含的功能有:透通的数据复制与容错.也就是说,即使系统中有一小部份的节点脱机,整体来说系统仍然可以持续

分布式文件系统之MogileFS的使用

一.mogilefs简介 MogileFS 是一个开源的分布式文件系统,用于组建分布式文件集群,由 LiveJournal 旗下 Danga Interactive 公司开发,Danga 团队开发了包括 Memcached.MogileFS.Perlbal 等不错的开源项目:(注:Perlbal 是一个强大的 Perl 写的反向代理服务器). MogileFS由3个部分组成: 第1个部分: 是server端,包括mogilefsd和mogstored两个程序.前者即是mogilefsd的trac

MogileFS的分布式文件系统的实现

MogileFS:是一套分布式文件存储的解决方案,它不需要特殊的核心组件.无单点失败.自动的文件复制.比RAID好多了.传输中立,无特殊协议(客户端可以通过NFS或HTTP来和MogileFS通信).简单的命名空间.不用共享任何东西.不需要RAID.不会碰到文件系统本身的不可知情况 等等优点. server端由mogilefsd和mogstored两个程序组成,mogilefsd既tracker,用来存数全局元数据放在数据库中,mogstored既存储节点. 实验目的: 实现mogilefs分布

Nginx+MogileFS分布式文件系统部署实验

实验要求 1.  部署mogilefs分布式文件系统 2.  nginx代理 实验环境 1.拓扑 2.网络地址规划 node1:172.16.76.10 nginx (centos6.8) node2:172.16.76.20 Trackers .storage Node   (centos7.2) node3:172.16.76.30 storage Node                   (centos7.2) node4:172.16.76.40 storage Node  (Mar

Mogilefs分布式文件系统-Keepalived+Nginx双主模型实现图片分布式存储、访问

一.分布式文件系统: 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.计算机通过文件系统管理.存储数据,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量的方式,在容量大小.容量增长速度.数据备份.数据安全等方面的表现都差强人意. 分布式文件系统可以有效解决数据的存储和管理难题:将固定于某个地点的某个文件系统,扩展到任意多个地点/多个文件系统,众多的节点组成一个文件系统网络.每个节点可以分布在

MogileFS分布式文件系统

内容概述 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.Mog

共享存储之分布式文件系统应用及MogileFS基础应用

 **什么是分布式存储:    分布式存储系统,是将数据分散存储在多台独立的设备上.传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要.分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性.可用性和存取效率,还易于扩展. 分布式文件系统设计目标: ** 访问透明** 位置透明** 并发透明** 失效透明** 硬件透明** 可扩展性** 复制