文档章节

分布式文件系统MogileFS——安装与初始化

侠客人生
 侠客人生
发布于 2017/07/02 21:48
字数 3461
阅读 72
收藏 1

MogileFS安装过程

一、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              

注 -o 后面是安装目录

   chmod +x /sbin/cpanm


二、利用cpanm来安装MogileFS的Perl模块,依次按照如下步骤安装


(1):cpanm DBD::mysql

【注】:如果这一步报错没安装完成 提示mysql_confi找不到

 

 

报错mysql_config   说明配置文件有问题  

执行  vim  /etc/profile

在最后面添加mysql_config的环境变量

Mysql_HOME为 自己mysql安装的路径


(2):cpanm MogileFS::Server (需要看是否全部成功,可能提示去装别的包)


(3):cpanm MogileFS::Utils


(4):cpanm MogileFS::Client

 

基本配置步骤如下:


1:在MySql数据库中创建MogileFS要使用的数据库和用户名

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

三、配置和初始化数据库


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 使用说明:

一、MogileFS 中的存储节点

我们先看下面的图

 

各角色和服务之间都是基于套接字来进行通信的,就服务本身就没有耦合性,所以可以在服务器设备有限的场景下运行多种服务或角色.

下面多了几个存储节点,他们都是单独的,便宜的,多硬盘的机器.每个机器下面有多个分区,可以用来存放这个存储系统的数据的"device".下面我们来详细讲讲:

存储主机(节点)
这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增加这些机器.

设备(device)
一个存储节点,以就是上面的主机,可以有多个 device, 就是用来存放文件的目录(比较挂载的目录),每个设备都有一个设备 id,需要在 mogstored 的配置文件中的 docroot 配置的项目 指定的目录下面创建相应的设备的目录,目录名为 $docroot/dev$id,设备是不能删除的.只能将其设备的状态的值置为dead,当一个设备 dead 之后,就真的 dead了,里面的数据也无法恢复了,且这个dead了的设备的 id 也不能再用.

二、MogileFS 内部的管理关系

 

从上面我们可以见到,整个 MogileFS 分几个小的部分,所有文件的操作,都是通过 Key 来取的.一个 Key 对应一个 MogileFS 中的文件.在这个中,有几个东西我们需要知道,就是域,和类的作用.

域(domain)
在一个 MogileFS 中,可以有多个域,用来存放不同的文件,比如,不同大小的文件,不同类型的文件.在上图中所有 alive 的"设备"是一个大的整体,形成一个统一的存储空间,里面的数据可以根据 "域" domain 和类 class 来分类管理,属于同一个 domain,即使是属于不同的class,文件的key也必须是唯一的.不同域的 key 才能重复

类(class)
在一个域中,可以有多个类,主要是用来控制复制单元的,类是用来做属性管理的,类是比域 domain 低一个级别,可以定义一个文件存储在不同 device 中的份数.一个文件必须通过 domain,class 和 key 才能找出来.我们可以给不同的重要程度的文件,不同热度的文件,来分别用类来控制份数.

三、MogileFS 数据库表结构

 

四、初始化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

五、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持续监测主机和设备的状态,因此不会返回死链接,默认情况下对返回列表中的第一个元素做双重检查)。

六、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

 

© 著作权归作者所有

共有 人打赏支持
侠客人生
粉丝 15
博文 43
码字总数 82954
作品 0
朝阳
私信 提问
Nginx反代Mogilefs分布式储存示例

一、分布式存储系统简介   随着信息技术不断的发展,给我们带来便利的同时,不断增加的数据量级、信息之间的连接关联越来越复杂、数据访问的并发量日益增加对I/O的要求越来越高、数据类型越...

Ala6
11/04
0
0
MogileFS-2.44 安装与配置

MogileFS-2.44 安装与配置 一、MogileFS 介绍< xmlnamespace prefix ="o" /> MogileFS 是一个开源的分布式文件系统,用于组建分布式文件集群,由 LiveJournal 旗下 Danga Interactive 公司开...

youyu2299
2013/12/07
0
0
分布式存储MogileFS介绍

MogileFS介绍 MogileFS 是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。 Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。 目前...

cstsncv
04/13
0
0
分布式文件系统小搜罗

hadoop DFS java 写的 KosmosFS c++ 写的 MogileFS 用的比较多,Perl写的,用mysql做元数据的保存。由于Mogilefs不支持对一个文件的随机读写,因此注定了只适合做一部分应用。比如图片服务,...

ZhaoChengye
2010/04/20
1K
0
mogileFS 分布式存储-安装手记

环境是centos 呃,装个玩意儿走了好多弯路,以为依赖太多的包河模块,搞了很久. 后来发现其实安装可以简化的,yum没有mogilefs,可以通过epel来安装. 第一种安装方法,用epel # rpm -Uvh http://do...

晨曦之光
2012/03/09
368
0

没有更多内容

加载失败,请刷新页面

加载更多

零距离接触阿里云时序时空数据库TSDB

概述 最近,Amazon新推出了完全托管的时间序列数据库Timestream,可见,各大厂商对未来时间序列数据库的重视与日俱增。 阿里云TSDB是阿里巴巴集团数据库事业部研发的一款高性能分布式时序时空...

阿里云云栖社区
15分钟前
0
0
OkHttpClient封装

import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Map; import java.util.TreeMap; import java.util.Map.Entry; import o......

尘叙缘
16分钟前
1
0
零距离接触阿里云时序时空数据库TSDB

概述 最近,Amazon新推出了完全托管的时间序列数据库Timestream,可见,各大厂商对未来时间序列数据库的重视与日俱增。 阿里云TSDB是阿里巴巴集团数据库事业部研发的一款高性能分布式时序时空...

阿里云官方博客
17分钟前
0
0
centos 7 nginx_install.sh

#!/bin/bashset -eprintf "============开始安装nginx\n"printf "============输入nginx下载url,按Enter默认下载1.14.2版本\n"download_url='';while truedoread down...

偶遇一只小仙女
17分钟前
0
0
数据库高并发下乐观锁的原理

在高并发下,经常需要处理SELECT之后,在业务层处理逻辑,再执行UPDATE的情况。 若两个连接并发查询同一条数据,然后在执行一些逻辑判断或业务操作后,执行UPDATE,可能出现与预期不相符的结...

hansonwong
19分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部