首页域名资讯 正文

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

2024-12-17 3 0条评论

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

 

 

文章转载来自:trustauth.cn

文章版权及转载声明

本文作者:亿网 网址:https://edns.com/ask/post/150611.html 发布于 2024-12-17
文章转载或复制请以超链接形式并注明出处。