分佈式文件系統MogileFS——安裝與初始化

MogileFS安裝過程

1、MySQL安裝

安裝步驟以下
1:須要先安裝MySql,這個前面的課程已經有了
2:安裝MySql的開發包devel,下載了MySQL-devel-5.5.25-1.rhel5.i386.rpm,安裝:
   rpm -ivh MySQL-devel-5.5.25-1.rhel5.i386.rpm
3:安裝MySql的share包,下載了MySQL-shared-5.6.19-1.rhel5.i386.rpm,安裝:
   rpm -ivh MySQL-shared-5.6.19-1.rhel5.i386.rpm
   安裝後可使用rpm -qa|grep -i mysql 來查看安裝的包
4:須要有Perl的環境,服務器已經自帶了5.8.8版本的
5:安裝CPANMinus
   wget http://xrl.us/cpanm --no-check-certificate -O /sbin/cpanm              node

注 -o 後面是安裝目錄mysql

   chmod +x /sbin/cpanmios


2、利用cpanm來安裝MogileFS的Perl模塊,依次按照以下步驟安裝


(1):cpanm DBD::mysql

【注】:若是這一步報錯沒安裝完成 提示mysql_confi找不到sql

 

 

報錯mysql_config   說明配置文件有問題  數據庫

執行  vim  /etc/profilevim

在最後面添加mysql_config的環境變量服務器

Mysql_HOME爲 本身mysql安裝的路徑app


(2):cpanm MogileFS::Server (須要看是否所有成功,可能提示去裝別的包)


(3):cpanm MogileFS::Utils


(4):cpanm MogileFS::Client

 

基本配置步驟以下:負載均衡


1:在MySql數據庫中建立MogileFS要使用的數據庫和用戶名less

a. 
CREATE DATABASE MogileFs DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

b. 

    grant all privileges on MogileFs.* to 'mogile'@'%' identified by 'mogile';

c. 
FLUSH PRIVILEGES;

【注】若是b)受權失敗執行如下兩條SQL 再執行FLUSH PRIVILEGES;

INSERT INTO `mysql`.`user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `Event_priv`, `Trigger_priv`, `Create_tablespace_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`, `plugin`, `authentication_string`, `password_expired`) VALUES ('%', 'mogile', '*A1F1B2A7F3B2C124AE91B424477A6AC49A3D6C4B', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', '0', '0', '0', '0', 'mysql_native_password', '', 'N');
INSERT INTO `mysql`.`user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `Event_priv`, `Trigger_priv`, `Create_tablespace_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`, `plugin`, `authentication_string`, `password_expired`) VALUES ('localhost', 'mogile', '*A1F1B2A7F3B2C124AE91B424477A6AC49A3D6C4B', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', '0', '0', '0', '0', 'mysql_native_password', '', 'N');

3、配置和初始化數據庫


1) 修改mogdbsetup

cd usr/local/bin/
在usr/local/bin/目錄下修改mogdbsetup文件配置數據庫 (若是沒有使用find -name mogdbsetup 查詢)

rm mogdbsetup
nano mogilefsd.conf

#!/usr/bin/perl
use strict;
use Getopt::Long;
use lib 'lib';
use MogileFS::Store;
use MogileFS::Config;

# Rename binary in process list to make init scripts saner
$0 = $_ = $0;

my %args = (
            dbhost => "localhost",
            dbport => 3306,
            dbname => "MogileFs",
            dbrootuser => "root",
            dbrootpass => "root",
            dbuser => "mogile",
            dbpass => "mogile",

            );

my $opt_help;
my $opt_verbose = 0;
my $opt_yes = 0;
my $opt_noschemabump;
my $dbtype = "MySQL";
my $plugins;

usage()
    unless GetOptions(
                      "dbhost=s"         => \$args{dbhost},
                      "dbport=s"         => \$args{dbport},
                      "dbname=s"         => \$args{dbname},
                      "dbrootuser=s"     => \$args{dbrootuser},
                      "dbrootpassword:s" => \$args{dbrootpass},
                      "dbuser=s"         => \$args{dbuser},
                      "dbpassword:s"     => \$args{dbpass},
                      "help"             => \$opt_help,
                      "verbose"          => \$opt_verbose,
                      "yes"              => \$opt_yes,
                      "noschemabump"     => \$opt_noschemabump,
                      "type=s"           => \$dbtype,
                      "plugins=s"        => \$plugins,
                      );

usage() if $opt_help;

# Be nice about what the default admin user is called.
if(!defined($args{dbrootuser})) {
    $args{dbrootuser} = 'root' if $dbtype =~ /MySQL/i;
    $args{dbrootuser} = 'postgres' if $dbtype =~ /Postgres/i;
}
# Saner port management.
# This should default to the UNIX sockets on localhost
if(!defined($args{dbport}) and $args{dbhost} != "localhost" and $args{dbhost} != "127.0.0.1") {
    $args{dbport} = '3306' if $dbtype =~ /MySQL/i;
    $args{dbport} = '5432' if $dbtype =~ /Postgres/i;
}

sub usage {
    die <<USAGE;
Usage: mogdbsetup [opts]

Options:

                  Default      Description
                  ============ ===========================================
 --verbose        <off>        Be verbose about what\'s happening.

 --dbhost=        localhost    hostname or IP to database server.

 --dbport=        dbd default  port number to database server.

 --dbname=        mogilefs     database name to create/upgrade.

 --dbrootuser=    root         Database administrator username.  Only needed
                               for initial setup, not subsequent upgrades.

 --dbrootpass=    <blank>      Database administrator password.  Only needed
                               for initial setup, not subsequent upgrades.

 --dbuser=        mogile       Regular database user to create and/or use
                               for MogileFS database.  This is what the
                               mogilefsd trackers connect as.

 --dbpass=        <blank>      You should change this, especially if your
                               database servers are accessible to other users
                               on the network.  But they shouldn't be
                               if you're running MogileFS, because MogileFS
                               assumes your network is closed.

  --type=         MySQL        Which MogileFS::Store implementation to use.
                               Available: MySQL, Postgres

  --yes                        Run without questions.

USAGE
}

my $sclass = "MogileFS::Store::$dbtype";
eval "use $sclass; 1;" or die "Failed to load $sclass: $@";

foreach my $plugin (split /\s*,\s*/, $plugins) {
    eval "use MogileFS::Plugin::$plugin; 1;" or die "Failed to load plugin $plugin: $@";
}

confirm("This will attempt to setup or upgrade your MogileFS database.\nIt won't destroy existing data.\nRun with --help for more information.  Run with --yes to shut up these prompts.\n\nContinue?", 0);

$sclass->on_status(\&status);
$sclass->on_confirm(\&confirm);

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;

############################################################################

sub confirm {
    my $q = shift;
    my $def = shift;
    $def = 1 unless defined $def;

    return 1 if $opt_yes;
    my $deftext = $def ? "[Y/n]" : "[N/y]";

    print "\n$q $deftext: ";
    my $ans = <STDIN>;
    if ($ans =~ /^\s*$/) {
        die "Stopped.\n" unless $def;
        return 0;
    }
    return 1 if $ans =~ /^y/i;
    die "Stopped.\n";
}

sub status {
    warn "$_[0]\n" if $opt_verbose;
}


chmod 777 mogdbsetup

【注】:須要把mogdbsetup中的內容修改成本身的

mogdbsetup
--dbhost=localhost
--dbname=MogileFs
--dbuser=mogile
--dbpass=mogile

也就是說裝完server以後就有mogdbsetup

 

2) 以後初始化數據庫運行:

mogdbsetup --dbhost=localhost --dbname=MogileFs --dbuser=mogile --dbpass=mogile

檢查本身數據庫表結構是否初始化完成

【注】

1) Failed to load MogileFs::Store::MySQL xxx.perl5 at/usr/local/share/perle/MogileFS/Mysql.pm line 5

解決辦法:yum -y install perl-DBD-MySQL   # 安裝DBI組件 
 
2) Failed to connect to DBI:mysql:mysql  Cont connect to local MySQL servver through socket '/tmp/mysql.sock'
解決辦法:
在/var/lib創建mysql目錄,進入目錄軟鏈接

 ln -fs /tmp/mysql.sock mysql.sock

3) 若是報不能鏈接或X表不存在 ,請先檢查數據庫是否建立成功, 數據庫權限時候建立成功,把命令改成

mogdbsetup --dbhost=10.240.30.18 --dbname=MogileFs --dbuser=mogile --dbpass=mogile

 

 4)

3) 建立配置文件的目錄和Tracker配置文件

a. 編輯mogilefsd.conf
好比在/usr/common/mogilefs(若是沒有common就mkdir -p common/mogilefs)在該目錄結構下面

nano mogilefsd.conf
基本內容以下:

# Database connection information

db_dsn = DBI:mysql:MogileFs:host=127.0.0.1;port=3306;mysql_connect_timeout=5

db_user = mogile

db_pass = mogile

# IP:PORT to listen on for MogileFS client requests

listen = 0.0.0.0:7001

# Optional, if you don't define the port above.

conf_port = 7001

# Number of query workers to start by default.

query_jobs = 10

# Number of delete workers to start by default.

delete_jobs = 1

# Number of replicate workers to start by default.

replicate_jobs = 5

# Number of reaper workers to start by default.

# (you don't usually need to increase this)

reaper_jobs = 1


而後【Ctrl + Y】 y

【Ctrl + X】而後輸入mogilefsd.conf 【回車】

b. 因爲mogilefsd不能用root用戶啓動,因此添加mogile用戶,並使用它來啓動調度器

adduser mogile
su mogile
mogilefsd -c /usr/common/mogilefs/mogilefsd.conf --daemon

 

【注】:Store.pm line 388 說明數據庫鏈接失敗 須要檢查三個地方

1)檢查數據庫表是否初始化成功

2)檢查mogilefsd.conf文件的數據庫配置信息是否正確

3)檢查mysql是否正常


可ps看看mogilefsd的進程


測試:ps -ef |grep mogilefsd


終止服務:

pkill mogilefsd

 

c. 編輯storage.conf文件

/usr/common/mogilefs配置存儲節點,建立一個storage.conf文件,內容以下:

nano storage.conf

maxconns = 1000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501

docroot=/data/shopping/mogilefs/mogilefsdata/


數據存在什麼根路徑是由docroot來設置的 ,目錄結構須要本身去建立

mkdir -p /data/shopping/mogilefs/mogilefsdata/

 

d. 啓動存儲節點,這個能夠用root用戶

 

啓動存儲節點,這個能夠用root用戶
mogstored -c /usr/common/mogilefs/storage.conf --daemon

 

說明沒有建立目錄/data/crm/mogilefs/mogilefsdata/dev1/ 的目錄結構都要建立

測試:ps -ef | grep mogst


中止:pkill mogstored

 

 

這樣就安裝完畢!

MogileFS 使用說明:

1、MogileFS 中的存儲節點

咱們先看下面的圖

 

各角色和服務之間都是基於套接字來進行通訊的,就服務自己就沒有耦合性,因此能夠在服務器設備有限的場景下運行多種服務或角色.

下面多了幾個存儲節點,他們都是單獨的,便宜的,多硬盤的機器.每一個機器下面有多個分區,能夠用來存放這個存儲系統的數據的"device".下面咱們來詳細講講:

存儲主機(節點)
這個是 MogileFS 存儲文件存放在這些機器上,也是 mogstored 節點,也叫 Storage Server,一臺存儲主要都要啓動一個 mogstored 服務.擴容就是增長這些機器.

設備(device)
一個存儲節點,以就是上面的主機,能夠有多個 device, 就是用來存放文件的目錄(比較掛載的目錄),每一個設備都有一個設備 id,須要在 mogstored 的配置文件中的 docroot 配置的項目 指定的目錄下面建立相應的設備的目錄,目錄名爲 $docroot/dev$id,設備是不能刪除的.只能將其設備的狀態的值置爲dead,當一個設備 dead 以後,就真的 dead了,裏面的數據也沒法恢復了,且這個dead了的設備的 id 也不能再用.

2、MogileFS 內部的管理關係

 

從上面咱們能夠見到,整個 MogileFS 分幾個小的部分,全部文件的操做,都是經過 Key 來取的.一個 Key 對應一個 MogileFS 中的文件.在這個中,有幾個東西咱們須要知道,就是域,和類的做用.

域(domain)
在一個 MogileFS 中,能夠有多個域,用來存放不一樣的文件,好比,不一樣大小的文件,不一樣類型的文件.在上圖中全部 alive 的"設備"是一個大的總體,造成一個統一的存儲空間,裏面的數據能夠根據 "域" domain 和類 class 來分類管理,屬於同一個 domain,即便是屬於不一樣的class,文件的key也必須是惟一的.不一樣域的 key 才能重複

類(class)
在一個域中,能夠有多個類,主要是用來控制複製單元的,類是用來作屬性管理的,類是比域 domain 低一個級別,能夠定義一個文件存儲在不一樣 device 中的份數.一個文件必須經過 domain,class 和 key 才能找出來.咱們能夠給不一樣的重要程度的文件,不一樣熱度的文件,來分別用類來控制份數.

3、MogileFS 數據庫表結構

 

4、初始化MogileFS(紅色子標題爲初始化)

1)添加Storeage節點到Tracker

 

[root@localhost mogilefs]# mogadm --trackers=192.168.119.129:7001 host add shopping1 --ip 192.168.119.129  --port=7500 --status=alive

 

mogadm --trackers=112.124.66.244:7001 host add shopping1--ip 112.124.66.244 --port=7500 --status=alive

添加完以後數據庫host表中將會多一條數據

 

 

若是想修改MogileFS中主機的信息,必定要加上狀態--status=alive,否則不能修改

mogadm host modify storage_node_name --ip=192.168.119.129 --status=alive

【注】修改時不要在數據庫中直接修改,及時修改爲功MogileFs也不會生效

檢查節點:

[root@localhost mogilefs]# mogadm host list

--------------------

mogadm -trackers=192.168.119.129:7001 check

 

2)添加存儲設備到Storeage節點

mogadm device add shopping1 dev1

 

使用下面的語句來檢查「設備」信息

mogadm device list

若是要標記設備失效,能夠用下面的語句

mogadm device mark shopping1 dev1 dead

要恢復的話,再一次add 設備就行了

【注】Device ID是惟一的,一旦建立將沒法刪除,只能mark爲dead。因此,若是你某個磁盤壞了,你mark爲dead, 後來又修好了,那麼你必須從新格式化並命名爲新的device id, 不支持將device從dead變爲

alive.

3)建立域

mogadm domain add imgage

檢查「域」,顯示存在的域:

mogadm domain list

 

4)在「域」中建「類」,並加入最小保存份數

mogadm class add image img --mindevcount=2

檢查「類」:

mogadm class list

 

若是建立時域的名字建立錯了,能夠在數據庫中直接修改domain表的namespace字段響應的值。

檢查整個系統:mogadm --trackers=192.168.119.129:7001 check

5)使用mogtool來操做文件

上傳文件:

cd usr/local/bin/

mogtool inject <file_name> <key_name> --trackers=192.168.119.129:7001 -

-domain=<domain_name> --class=<class_name>

Eg:

mogtool inject logo2.png logo --trackers=192.168.119.129:7001 --domain=image --class=img

下載文件:

mogtool extract <key_name> <file_name> --trackers=192.168.119.129:7001

--domain=<domain_name> --class=<class_name>

Eg:

mogtool extract logo logo.png --trackers=192.168.119.129:7001 --domain=image --class=img

若是文件超過64M,mogtool會自動按照64M分割塊

上傳大文件:

mogtool inject --bigfile <file_name> <key_name> --

trackers=192.168.119.129:7001 --domain=<domain_name> --class=<class_name>

下載大文件:

mogtool extract --bigfile <key_name> <file_name> --

trackers=192.168.119.129:7001 --domain=<domain_name> --class=<class_name>

上傳文件2:

./mogupload --trackers=192.168.119.129:7001 --domain=image --class=img --key='log' --file='logo.png'

下載文件2

./mogfetch --trackers=192.168.119.129:7001 --domain=image  --class=img --key='log' --file='tttt'

6)mogstats:察看分佈式存儲的狀態

./mogstats --config=/usr/common/mogilefs/mogilefsd.conf

--config=/ 後面跟此節點的mogilefs的配置文件

./mogstats --config=/usr/common/mogilefs/mogilefsd.conf --stats="devices"

僅顯示某個devices的信息, --stats可選值: devices,files,all

5、MogileFS執行流程

1) 應用程序請求寫入一個文件,tracker接受到這個請求,會調用「create_open」。

2) Tracker 作一些負載均衡的處理,決定應該去訪問那些機器,而後給應用程序一些可用的機器位置。

3) 應用程序寫到其中的一個機器,若是寫失敗,會從新嘗試並寫到另外一個機器。

4) 應用程序經過「create_close」告訴tracker文件寫到哪裏去了。

5) Tracker經過數據庫將該名稱和域名的空間關聯。

6) Tracker在後臺開始複製文件,以知足該文件類別設定的複製規則。

7) 應用程序經過「get_paths」請求domain+key(key默認爲「filename」)文件,tracker基於每一位置的I/O繁忙狀況,返回該文件可用的完整URLs地址列表。

8) 應用程序而後按順序嘗試這些URL地址,(tracker持續監測主機和設備的狀態,所以不會返回死連接,默認狀況下對返回列表中的第一個元素作雙重檢查)。

6、MogileFs存儲節點

存儲節點的做用

首先是用來存儲文件,其次須要對存儲節點的信息作維護查詢,包括:

1) 檢查在該存儲節點上的文件狀態,須要遍歷存儲的目錄

2) 檢查存儲節點上的磁盤空間使用狀況(DiskUsage)

3) 檢查本地設備上的每個存儲文件的大小(FIDSizes)

4) 檢查設備的繁忙程度(IOState)

5) 提供Http服務作命令控制,並提供前面幾種的查詢,基本命令以下:

size uri:檢查一個uri地址的文件大小,返回文件size

watch:檢查設備的繁忙程度(iostat)

fid_size start end raw_devs:檢查一系列設備上存儲的文件的大小,返回信息多行

device fid size:檢查某個設備上 fid的文件大小

6) 文件類型xxx.fid

相關文章
相關標籤/搜索