设为首页 收藏本站
查看: 1210|回复: 0

[经验分享] 分布式文件系统之——mogilefs

[复制链接]

尚未签到

发表于 2019-2-1 08:27:59 | 显示全部楼层 |阅读模式
  本节我们将来认识下分布式文件系统,不过我主要讲的是关于其中的一个比较流行的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节点都装上以下几个包
  [root@localhost 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     
[root@localhost mogilefs]# yum install -y * perl-IO-AIO
  各自创建存储目录(2个节点分别为dev{1,2})
  第一个节点:
  [root@www mog]# mkdir -pv /mogdata/data/dev1   
mkdir: created directory `/mogdata'     
mkdir: created directory `/mogdata/data'     
mkdir: created directory `/mogdata/data/dev1'
  第二个节点:
  [root@localhost mog]# mkdir -pv /mogdata/data/dev2   
mkdir: created directory `/mogdata'     
mkdir: created directory `/mogdata/data'     
mkdir: created directory `/mogdata/data/dev2'
  修改文件夹权限
  [root@www ~]# chown -R mogilefs.mogilefs /mogdata/data/
  数据库授权
  mysql节点安装并启动mysqld
  [root@localhost mog]# yum install mysql mysql-server
  [root@localhost 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个节点中都要修改
  [root@www mog]# vim /etc/mogilefs/mogilefsd.conf

  然后就可以启动服务了
  [root@www mog]# service mogilefsd start   
Starting mogilefsd                                         [  OK  ]
  查看端口是否开启

  下面修改mogstored的配置文件并启动服务(2个节点都要改)
  [root@localhost mog]# vim /etc/mogilefs/mogstored.conf

  [root@www ~]# service mogstored start   
Starting mogstored                                         [  OK  ]
  查看端口是否启动

  添加节点
  [root@www ~]# mogadm --trackers=172.16.6.20:7001 host add 172.16.6.20 --ip=172.16.6.20 --status=alive   
[root@www ~]# mogadm --trackers=172.16.6.20:7001 host add 172.16.6.30 --ip=172.16.6.30 --status=alive
  查看是否添加成功


  添加设备
  [root@www ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.20 1   
[root@www ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.30 2
  查看是否添加成功

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

  创建domain:实现名称空间
  [root@www ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 domain add files
  [root@www ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 domain add images
  查看生成的domain

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

  解释下这里的几个参数意思:
  mindevcount:最小复制文件的份数
  replpolicy :复制份数
  hashtype:采用的hash的类型
  好了下面就可以上传一下文件试一下看看了
  上传图片文件
  [root@www ~]# mogupload --trackers=172.16.6.20:7001 --domain=images --key='/a.jepg' --file='/root/75b4519340.jpg'
  上传文本文件
  [root@www ~]# mogupload --trackers=172.16.6.20:7001 --domain=files --key='/init.html' --file='/etc/inittab'
  
  查看文件的fid进行访问
[root@www ~]# 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

[root@www ~]# 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
  下面我们需要编译安装的包已经模块包
  这里我已经下载好了
  [root@localhost ~]# 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
  [root@localhost nginx-1.6.1]# groupadd -r nginx   
[root@localhost nginx-1.6.1]# useradd -g nginx -r nginx
  2个包都进行解压
  [root@localhost ~]# tar xf nginx-1.6.1.tar.gz   
[root@localhost ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz
  编译安装nginx
  [root@localhost ~]# cd nginx-1.6.1

  [root@localhost nginx-1.6.1]# make && make install
  ok,安装完毕
  修改配置文件使nginx进行反向代理
  [root@localhost 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的启动脚本
  [root@localhost 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  给予执行权限
  [root@localhost nginx-1.6.1]# chmod +x /etc/init.d/nginx
  启动服务
  root@localhost nginx-1.6.1]# service nginx start   
Starting nginx:                                            [  OK  ]
  OK,下面我们就可以测试下了
  先传一张图片到服务器上
  [root@www ~]# mogupload --trackers=172.16.6.20:7001 --domain=images --key='/img/a.jpg' --file='/root/75b4519340.jpg'
  OK,下面我们直接用key的路径进行访问

  OK,实验完成。
  那么本节的内容就讲到这里,欢迎大家的批评指正,谢谢!




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-670253-1-1.html 上篇帖子: L12 MogileFS详细应用配置与说明 下篇帖子: MogileFS + Nginx 实现基于CentOS7平台的分布式文件存储与访问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表