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/

评论