hb120973135 发表于 2019-2-1 08:27:59

分布式文件系统之——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的分布式文件系统
  实验拓扑图:
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412074044lQxD.png
  总的实验步骤如下:由于有些步骤连在一起做,所以做的时候可能并不是完全按照以下步骤进行:
  安装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节点都装上以下几个包
  # ls   
MogileFS-Server-2.46-2.el6.noarch.rpm            MogileFS-Server-mogstored-2.46-2.el6.noarch.rpmperl-MogileFS-Client-1.14-1.el6.noarch.rpmperl-Perlbal-1.78-1.el6.noarch.rpm   
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpmMogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Net-Netmask-1.9015-8.el6.noarch.rpm   
# yum install -y * perl-IO-AIO
  各自创建存储目录(2个节点分别为dev{1,2})
  第一个节点:
  # mkdir -pv /mogdata/data/dev1   
mkdir: created directory `/mogdata'   
mkdir: created directory `/mogdata/data'   
mkdir: created directory `/mogdata/data/dev1'
  第二个节点:
  # mkdir -pv /mogdata/data/dev2   
mkdir: created directory `/mogdata'   
mkdir: created directory `/mogdata/data'   
mkdir: created directory `/mogdata/data/dev2'
  修改文件夹权限
  # chown -R mogilefs.mogilefs /mogdata/data/
  数据库授权
  mysql节点安装并启动mysqld
  # yum install mysql mysql-server
  # service mysqld start
  Please report any problems with the /usr/bin/mysqlbug script!
     
Starting mysqld:                                          
  进入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端进行数据库初始化
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412074093oNLj.png
  初始化完成可以在数据库中查看
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412074150BiJg.png
  修改配置文件
  注意2个节点中都要修改
  # vim /etc/mogilefs/mogilefsd.conf
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412074258HJri.png
  然后就可以启动服务了
  # service mogilefsd start   
Starting mogilefsd                                       
  查看端口是否开启
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412074316chWJ.png
  下面修改mogstored的配置文件并启动服务(2个节点都要改)
  # vim /etc/mogilefs/mogstored.conf
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412074337InxG.png
  # service mogstored start   
Starting mogstored                                       
  查看端口是否启动
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412074388b3M7.png
  添加节点
  # mogadm --trackers=172.16.6.20:7001 host add 172.16.6.20 --ip=172.16.6.20 --status=alive   
# mogadm --trackers=172.16.6.20:7001 host add 172.16.6.30 --ip=172.16.6.30 --status=alive
  查看是否添加成功
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412074410YBjn.png
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412074434mn1U.png
  添加设备
  # mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.20 1   
# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.30 2
  查看是否添加成功
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412074449P3or.png
  发现刚刚的文件目录的权限没给。注:修改权限的步骤我没写在这里,我放到了上面的修改权限
  修改之后就OK :
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412088269HjOr.png
  创建domain:实现名称空间
  # mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 domain add files
  # mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 domain add images
  查看生成的domain
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412088269V1ih.png
  创建class:复制文件的最小单位
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412088270C8Ww.png
  解释下这里的几个参数意思:
  mindevcount:最小复制文件的份数
  replpolicy :复制份数
  hashtype:采用的hash的类型
  好了下面就可以上传一下文件试一下看看了
  上传图片文件
  # mogupload --trackers=172.16.6.20:7001 --domain=images --key='/a.jepg' --file='/root/75b4519340.jpg'
  上传文本文件
  # mogupload --trackers=172.16.6.20:7001 --domain=files --key='/init.html' --file='/etc/inittab'
  
  查看文件的fid进行访问
# 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.fidhttp://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412088271EPWv.png
# 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.fidhttp://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412088272rQIC.png
  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
  下面我们需要编译安装的包已经模块包
  这里我已经下载好了
  # ls   
anaconda-ks.cfginstall.loginstall.log.syslogmogilefsnginx-1.6.1.tar.gznginx_mogilefs_module-1.0.4.tar.gz
  创建系统用户nginx
  # groupadd -r nginx   
# useradd -g nginx -r nginx
  2个包都进行解压
  # tar xf nginx-1.6.1.tar.gz   
# tar xf nginx_mogilefs_module-1.0.4.tar.gz
  编译安装nginx
  # cd nginx-1.6.1
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412088272mDcm.png
  # make && make install
  ok,安装完毕
  修改配置文件使nginx进行反向代理
  # vim /etc/nginx/nginx.conf
  以下yellow字体为加入的配置
  worker_processes1;
  events {   
    worker_connections1024;   
}
  http {   
    include       mime.types;   
    default_typeapplication/octet-stream;
  sendfile      on;   
    #tcp_nopush   on;
  #keepalive_timeout0;   
    keepalive_timeout65;
  #gzipon;   
    upstream trackers {                                           定义上流服务器集群      
       server 172.16.6.20:7001;      
       server 172.16.6.30:7001;      
}      
    server {   
      listen       80;   
      server_namelocalhost;
  #charset koi8-r;
  #access_loglogs/host.access.logmain;
  location / {   
            root   html;   
            indexindex.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的启动脚本
  # 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  给予执行权限
  # chmod +x /etc/init.d/nginx
  启动服务
  root@localhost nginx-1.6.1]# service nginx start   
Starting nginx:                                          
  OK,下面我们就可以测试下了
  先传一张图片到服务器上
  # mogupload --trackers=172.16.6.20:7001 --domain=images --key='/img/a.jpg' --file='/root/75b4519340.jpg'
  OK,下面我们直接用key的路径进行访问
http://wiggin.blog.运维网.com/attachment/201409/30/8733640_1412088273zqSH.png
  OK,实验完成。
  那么本节的内容就讲到这里,欢迎大家的批评指正,谢谢!



页: [1]
查看完整版本: 分布式文件系统之——mogilefs