MogileFS的使用
文件下载
1
|
mogfetch —trackers=cluster–master01:7001 —domain=abc —key=“speach_of_dependence” —file=./speach_of_dependence_income.words
|
文件是存在与domain里的,在下载的时候要指定domain参数
文件上传
1
|
mogupload —trackers=cluster–master01:7001 —domain=abc —class=test01.abc —key=“speach_of_dependence” —file=./speach_of_dependence.words
|
文件具备class属性,所以在上传的时候要指定class参数,和domain参数
文件查看
1
|
moglistkeys —trackers=cluster–master01:7001 —domain=abc
|
存储设备查看
1
|
mogadm —trackers=cluster–master01:7001 device list
|
节点设备查看
1
|
mogadm —trackers=cluster–master01:7001 host list
|
domain查看
1
|
mogadm —trackers=cluster–master01:7001 domain list
|
class查看
1
|
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
程序代码分析
调用模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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的任务分派
程序代码分析
调用模块
1
2
3
4
5
6
7
8
9
10
11
12
|
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节点进程,负责文件的真实操作
程序代码分析
调用模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
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();
|
文章转载来自:ttlsa.com