MogileFS的使用 – 浅谈分布式文件系统MogileFS(3)

凉白开 分布式MogileFS的使用 – 浅谈分布式文件系统MogileFS(3)已关闭评论7,851字数 4346阅读14分29秒阅读模式

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参数文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

文件查看

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节点。文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

Inner MogileFS

Key-file

MogileFS不维护原来的文件名,所谓的file是storage node收到的bit流。在MogileFS内部以在domain中可见的key来标记文件。文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

文件存放

MogileFS对每个文件分配fid,文件以.fid为后缀存放,系统维护fid到path的映射关系。fid按照(\d)(\d{3})(\d{3})(\d{3})分割成四部分后,文件放置于目录/devid/$1/$2/$3下,对于是哪个devid则由master提供给客户端决定。文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

文件冗余

通过class的dvcont属性来保证文件在系统内的冗余文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

look into MogileFS

既然MogileFS是用Perl写成的,我们就来看看程序相关的源代码吧文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

Mogdbsetup

本程序在安装database节点时初始化meta database文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

程序代码分析文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

调用模块文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

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来判断当前操作是在安装还是升级中。文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

MogileFSd

Tracker节点进程,完成整个cluster的任务分派文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

程序代码分析文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

调用模块文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

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。文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

整个MogileFS是一个event-based的cluster。文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

Mogstored

Storage node节点进程,负责文件的真实操作文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

程序代码分析文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

调用模块文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

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();

 文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

请看下一篇:浅谈分布式文件系统MogileFS(4)文章源自运维生存时间-https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
凉白开
  • 本文由 发表于 02/06/2015 09:48:28
  • 转载请务必保留本文链接:https://www.ttlsa.com/fbs/talk-about-dfs-mogilefs-03/