分布式文件系统MogileFS介绍/安装配置/使用/管理

MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上。

MogileFS由3个部分组成:

第1个部分是server端,包括mogilefsd和mogstored两个程序。前者即是mogilefsd的tracker,它将一些全局信息保存在数据库里,例如站点domain,class,host等。后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。

第2个部分是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。

第3个部分是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能

介绍

mogilefs曾经带我入门进入到分布式文件系统的领域,既然ttlsa上讲了gearman,也讲下mogilefs吧,都是一个人开发的,mogilefs巧妙的用http put实现了一个分布式服务器,适用于存储小文件
方法论

认识一个系统,我觉得我的步骤是如下的:

    这个系统是干什么的,是为了解决什么问题而存在;
    这个系统是长什么样子;
    如何跟这个系统进行对话。

于是本文从MogileFS的来源谈起,继而勾画MogileFS的架构,介绍MogileFS的基本使用方法,最后介绍了MogileFS的管理。

文后介绍了如何将MogileFS纳入第三方应用的方法。
mind map

 
背景

MogileFS由Danga Interactive 公司开发出来的分布式文件系统,为解决当时所运营的LiveJournal站点的存储难题而产生。

在此之前该技术团队已经采取了数据库分区等技术,这意味着MogileFS中也包含着分而治之的思想。当前MogileFS已经广泛应用于一些高性能的web2.0网站之中,最典型的是Instagram使用它作为图片存储集群。

术语及解释

了解在MogileFS中出现的术语,对于掌握MogileFS的架构至关重要
术语     解释
application     thing that wants to store/load files
database     the database that stores the MogileFS metadata (the namespace, and which files are where). This should be setup in a HA config so you don’t have a single point of failure.
tracker     event-based parent process/message bus that manages all client communication from applications (requesting operations to be performed), including load balancing those requests onto “query workers”, and handles all communication between mogilefsd child processes.
storage node     where files are stored. The storage nodes are just HTTP servers that do DELETE, PUT, etc. Any WebDAV server is fine, but mogstored is recommended. mogilefsd can be configured to use two servers on different ports… mogstored for all DAV operations (and sideband monitoring), and your fast/light HTTP server of choice for GET operations. Typically people have one fat SATA disk per mountpoint, each mounted at /var/mogdata/devNN.
domain     A domain is the top level separation of files. File keys are unique within domains. A domain consists of a set of classes that define the files within the domain. Examples of domains: fotobilder, livejournal.
class     Every file is part of exactly one class. A class is part of exactly one domain. A class, in effect, specifies the minimum replica count of a file. Examples of classes: userpicture, userbackup, phonepost. Classes may have extra replication policies defined.
minimum replica count (mindevcount)     This is a property of a class. This defines how many times the files in that class need to be replicated onto different devices in order to ensure redundancy among the data and prevent loss.
key     A key is a unique textual string that identifies a file. Keys are unique within domains. Examples of keys: userpicture:34:39, phonepost:93:3834, userbackup:15. Fake structures work too: /pics/hello.png, any string.
file     A file is a defined collection of bits uploaded to MogileFS to store. Files are replicated according to their minimum replica count. Each file has a key, is a part of one class, and is located in one domain. Files are the things that MogileFS stores for you.
fid     A fid is an internal numerical representation of a file. Every file is assigned a unique fid. If a file is overwritten, it is given a new fid.

mogilefs安装配置

MogileFS的架构

MogileFS的架构如下

在一个MogileFS集群里,存在三种角色的节点

    Tracker node

    任务分发调度

    Meta Database node

     存储集群的元信息
    Host信息
    Device信息
    Domain信息
    Class信息
    Key信息
    File信息

    Storage node

    文件存储

 
MogileFS两种程序

    MogileFSd        #负责实现tracker角色功能
    Mogstored        #负责实现storage node角色功能

在MogileFS中file被定义为上传到storage node的一系列bits,在系统内以domain内唯一的key来标识。一个file属于一个class,class为一组属性值。
MogileFS的安装
服务器环境
ip     hostname
10.1.192.63     cluster-database
10.1.192.58     cluster-master01
10.1.192.59     cluster-master02
10.1.192.60     cluster-segment01
10.1.192.61     cluster-segment02
10.1.192.62     cluster-segment03

 

此五台服务器是vmware vSphere上的五台虚拟机,虚拟机挂在一个新增vmware network2端口下,服务器之间通过vmware switch连接,端口速率为10000Mbps;


 

由于模块间的依赖关系并没有按照服务器角色区分严格,建议在所有的服务器下安装如下模块:

    MogileFS-Utils-2.28.tar.gz
    MogileFS-Server-2.70.tar.gz
    MogileFS-Client-1.17.tar.gz

 
MogileFS的安装过程

在cluster-database上初始化数据库

建立用户与database
CREATE DATABASE mogilefs;
GRANT ALL ON mogilefs.* TO 'mogile'@'cluster-database';
SET PASSWORD FOR 'mogile'@'ibm01' = OLD_PASSWORD( 'mo' );
GRANT ALL ON mogilefs.* TO 'mogile'@'%';
SET PASSWORD FOR 'mogile'@'%' = OLD_PASSWORD( 'mo' );
FLUSH PRIVILEGES;

初始化数据库
mogdbsetup --dbname=mogilefs --dbuser=mogile --dbpass=mo
 配置tracker节点
 
mkdir -p /etc/mogilefs
echo << END > mogilefsd.conf
db_dsn = DBI:mysql:mogilefs:host=cluster-database;port=3306;mysql_connect_timeout=5        
#db连接串
db_user = mogile
db_pass = mo
conf_port = 7001        
#管理端口
listener_jobs = 5
node_timeout = 5
rebalance_ignore_missing = 1
 
END

 
配置storage node节点
mkdir -p /etc/mogilefs
echo << END > mogstored.conf  
httplisten=0.0.0.0:7500
mgmtlisten=0.0.0.0:7501
docroot=/data/mogData                
#http server侦听目录
 
END

 
在storage node节点建立device目录
mkdir -p /data/mogData/dev[1-n]
增加host与device

启动tracker
mogilefsd -c /etc/mogilefs/mogilefsd.conf --daemon

增加host与device
view source
print
?
mogadm --trackers=cluster-master01:7001 host add segment01 --ip=10.1.192.60 --status=alive
mogadm --trackers=cluster-master01:7001 host add segment02 --ip=10.1.192.61 --status=alive
mogadm --trackers=cluster-master01:7001 host add segment03 --ip=10.1.192.62 --status=alive
mogadm --trackers=cluster-master01:7001 device add segment01 1
mogadm --trackers=cluster-master01:7001 device add segment02 2
mogadm --trackers=cluster-master01:7001 device add segment03 3

MogileFS的使用

MogileFS的使用
文件下载
mogfetch --trackers=cluster-master01:7001 --domain=abc --key="speach_of_dependence" --file=./speach_of_dependence_income.words

文件是存在与domain里的,在下载的时候要指定domain参数
文件上传
mogupload --trackers=cluster-master01:7001 --domain=abc --class=test01.abc --key="speach_of_dependence" --file=./speach_of_dependence.words

文件具备class属性,所以在上传的时候要指定class参数,和domain参数
文件查看
moglistkeys --trackers=cluster-master01:7001 --domain=abc
存储设备查看
mogadm --trackers=cluster-master01:7001 device list
节点设备查看
mogadm --trackers=cluster-master01:7001 host list
domain查看
mogadm --trackers=cluster-master01:7001 domain list
 class查看
mogadm --trackers=cluster-master01:7001 class list

所有的请求都是发送到tracker节点。
Inner MogileFS
Key-file

MogileFS不维护原来的文件名,所谓的file是storage node收到的bit流。在MogileFS内部以在domain中可见的key来标记文件。
文件存放

MogileFS对每个文件分配fid,文件以.fid为后缀存放,系统维护fid到path的映射关系。fid按照(\d)(\d{3})(\d{3})(\d{3})分割成四部分后,文件放置于目录/devid/$1/$2/$3下,对于是哪个devid则由master提供给客户端决定。
文件冗余

通过class的dvcont属性来保证文件在系统内的冗余
look into MogileFS

既然MogileFS是用Perl写成的,我们就来看看程序相关的源代码吧
Mogdbsetup

本程序在安装database节点时初始化meta database

程序代码分析

调用模块
use MogileFS::Config;
use MogileFS::Store;
 
#!/usr/bin/perl
 
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
   if 0;
# not running under some shell
use strict;
use Getopt::Long;
use lib 'lib';
use MogileFS::Store;
use MogileFS::Config;
#
#省略usage与opt设置部分
#
MogileFS::Config->load_config;
 
my $sto = $sclass->new_from_mogdbsetup(
                                       map { $_ => $args{$_} }
                                       qw(dbhost dbport dbname
                                         dbrootuser dbrootpass
                                         dbuser dbpass)
                                       );
my $dbh = $sto->dbh;
 
$sto->setup_database
   or die "Database upgrade failed.\n";
 
my $latestver = MogileFS::Store->latest_schema_version;
if ($opt_noschemabump) {
   warn "\n*\n* Per your request, NOT UPGRADING to $latestver. I assume you understand why.\n*\n";
} else {
   $sto->set_schema_vesion($latestver);
}
 
 
warn "Done.\n" if $opt_verbose;
exit 0;

Mogdbsetup程序调用了MogileFS::Store中的setup_database subroutine初始化了数据库,通过SCHEMA_VERSION来判断当前操作是在安装还是升级中。
MogileFSd

Tracker节点进程,完成整个cluster的任务分派

程序代码分析

调用模块
use MogileFS::Server;
 
#!/usr/bin/perl
 
......
# Rename binary in process list to make init scripts saner
$0 = "MogileFSd";
 
my $s = MogileFS::Server->server;
$s->run;
 
1;

程序简单了调用了MogileFS::Server中的run subroutine。

整个MogileFS是一个event-based的cluster。
Mogstored

Storage node节点进程,负责文件的真实操作

程序代码分析

调用模块
use Perlbal 1.73;
use FindBin qw($Bin $RealScript);
use Mogstored::HTTPServer;
use Mogstored::HTTPServer::Perlbal;
use Mogstored::HTTPServer::Lighttpd;
use Mogstored::HTTPServer::None;
use Mogstored::HTTPServer::Apache;
use Mogstored::HTTPServer::Nginx;
use Mogstored::SideChannelListener;
use Mogstored::SideChannelClient;
 
......
# initialize basic required Perlbal machinery, for any HTTP server
my $perlbal_init = qq{
   CREATE SERVICE mogstored
     SET role = web_server
     SET docroot = $docroot
 
   
# don't listen... this is just a stub service.
   CREATE SERVICE mgmt
       SET role = management
     ENABLE mgmt
};
$perlbal_init .= "\nSERVER pidfile = $pidfile" if defined($pidfile);
Perlbal::run_manage_commands($perlbal_init , sub { print STDERR "$_[0]\n"; });
 
# start HTTP server
my $httpsrv_class = "Mogstored::HTTPServer::" . ucfirst($server);
my $httpsrv       = $httpsrv_class->new(
                                      listen   => $http_listen,
                                       docroot => $docroot,
                                       maxconns => $max_conns,
                                       bin     => $serverbin,
                                      );
 
# Configure Perlbal HTTP listener after daemonization since it can create a
# kqueue on *BSD. kqueue descriptors are automatically invalidated on fork(),
# making them unusable after daemonize. For non-Perlbal, starting the
# server before daemonization improves error reporting as daemonization
# redirects stdout/stderr to /dev/null.
$httpsrv->start if $server ne "perlbal";
 
if ($opt_daemonize) {
   $httpsrv->pre_daemonize;
   Perlbal::daemonize();
} else {
   print "Running.\n";
}
 
# It is now safe for Perlbal to create a kqueue
$httpsrv->start if $server eq "perlbal";
 
$httpsrv->post_daemonize;
 
# kill our children processes on exit:
my $parent_pid = $$;
 
$SIG{TERM} = $SIG{INT} = sub {
   return unless $$ == $parent_pid;
# don't let this be inherited
   kill 'TERM', grep { $_ } keys %on_death;
   POSIX::_exit(0);
};
 
setup_iostat_pipes();
start_disk_usage_process();
start_iostat_process() if $opt_iostat;
harvest_dead_children();
# every 2 seconds, it reschedules itself
setup_sidechannel_listener();
 
# now start the main loop
Perlbal::run();

管理 MogileFS

1. 系统的启动与停止

启动tracker
mogilefsd -c /etc/mogilefs/mogilefsd.conf --daemon

启动storage node
mogstored --daemon

停止tracker
echo !shutdown | nc cluster-master01 7001

停止storage node
killall mogstored

2. 查看系统状态

#mogadm check
dfs

mogilefs-04

【系统内流量分布】

系统内存在三种流量

Tcp7001 on tracke #Client客户端发送给tracker请求流量
Tcp3306 on mysql #tracker与meta database的流量
Tcp7500 on storage node #Client与storage node数据流量
Tcp7501

时间: 2024-09-20 19:54:11

分布式文件系统MogileFS介绍/安装配置/使用/管理的相关文章

Moosefs分布式文件系统集群讲解配置

MFS的官方网站为http://www.moosefs.org ,详细信息您可以去官网进行更多的了解,在这里我只将简单的知识和大家分享. MFS的网络组成有三部分,Master Server;Chunk Server;Client.其中Chunk Server和Client可以有多个,而Master主控端只能一个. MFS文件系统结构: 1 管理服务器(master-server):负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝 2 元数据日志服务器(changel

【Hadoop】 分布式Hadoop集群安装配置

第一次安装hadoop 集群,记录其安装过程! 1 前期准备,配置所有的机器的/etc/hosts 文件 # cat /etc/hosts # Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1       rac localhost ::1             rac3 localhost 10.250.7.225  

开源分布式文件系统比较

要使用分布式文件系统来降低成本,于是搜寻了开源的分布式文件系统.   经过安装部署和测试,把我使用中碰到的一些问题总结一下, 希望对大家有所帮助, 我也有一些问题没有搞懂,希望和大家一起交流,共同进步.   第一:CEPH 网上搜索了一些资料, 说 ceph 性能最高,C++编写的代码,支持Fuse,并且没有单点故障依赖, 于是下载安装, 由于 ceph 使用 btrfs 文件系统, 而btrfs 文件系统需要 Linux 2.6.34 以上的内核才支持, 显然我使用的 RHEL5 的内核还不支

FastDFS 集群 安装 配置

这篇文章介绍如何搭建FastDFS 集群 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服务,如相册网站.视频网站等等. FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传.下载等服务. 环境准备 系统系统 centos6.5 六台服

TFS分布式文件系统应用

TFS是淘宝开源的一套高性能文件存储系统,在阿里广泛应用, 除了自建文件系统,在应用上云的大趋势下,还可以使用阿里云的对象存储OSS服务:阿里云对象存储OSS首页 一.关于TFS TFS(Taobao File System)是一个高可扩展.高可用.高性能.面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问. TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用在淘宝各

当下流行的分布式文件系统大阅兵

当下流行的分布式文件系统大阅兵 本文对目前数种分布式文件系统进行简单的介绍.当前比较流行的分布式文件系统包括:Lustre.Hadoop.MogileFS.FreeNAS.FastDFS.NFS.OpenAFS.MooseFS.pNFS.以及GoogleFS. Lustre(www.lustre.org) lustre是一个大规模的.安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护.该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数量存储系

centos安装FastDFS+nginx+fastdfs-nginx-module安装配置

前言: 以前的项目上传的文件都是保存到本地或者是局域网内的共享文件夹下,由于数据量,服务器的负载均衡(分机的某些图片无法访问的问题处理)等因素的情况下,就想到用fastdfs来文件管理,花了几天时间硬着头皮去学习怎样安装配置,由于linux基础不好,安装配置起来感觉有点费力,不得不随时去查找一些资料,好在经过这几天的努力安装配置fastdfs最终还是搞定了,最终的付出并没有白费,以下是个人的见解,如有误差,请多多指导.不了解fastdfs的童鞋可以先去了解下, 一.简介 FastDFS是一个开源

Hypertable + Ceph 分布式文件系统

我最近在研究Hypertable, Hypertable 安装分为单机安装与分布式文件系统,单击安装主要用于开发环境.生产环境一般都是采用分布式文件系统.Hypertable 系统以下几种组合.   Hypertable + HDFS(Hadoop) Hypertable + KFS Hypertable + MapR Hypertable + ThriftBroker   前面三种,我既然选择了 Hypertable  而不用 HBase 就是不喜欢Java 所以我不会使用 Hadoop. 第

GlusterFS分布式文件系统的安装配置教程

GlusterFS主要应用在集群系统中,具有很好的可扩展性.软件的结构设计良好,易于扩展和配置,通过各个模块的灵活搭配以得到针对性的解决方案.可解决以下问题:网络存储,联合存储(融合多个节点上的存储空间),冗余备份,大文件的负载均衡(分块). 由于缺乏一些关键特性,可靠性也未经过长时间考验,还不适合应用于需要提供 24 小时不间断服务的产品环境.目前适合应用于大数据量的离线应用,下面一起来看GlusterFS分布式文件系统的安装配置 GlusterFS是一个开源的分布式文件系统,用户可以使用多台