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 |
1 | mogadm — trackers = cluster – master01 : 7001 domain list |
1 | mogadm — trackers = cluster – master01 : 7001 class list |
所有的请求都是发送到tracker节点。
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属性来保证文件在系统内的冗余
既然MogileFS是用Perl写成的,我们就来看看程序相关的源代码吧
本程序在安装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来判断当前操作是在安装还是升级中。
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。
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 ( ) ; |
文章转载来自:trustauth.cn