文档章节

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

侠客人生
 侠客人生
发布于 2017/07/02 21:48
字数 3461
阅读 61
收藏 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
朝阳
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
实现企业级分布式储存之mogilefs和fastdfs的应用

(1)关于mogilefs Web 2.0 时代的到来,使得单个计算机节点远远无法满足用户对海量数据和应用程序运行空间的需求。个人和企业都有安全而持久的存储信息的需求,备份成为最通俗的手段。个人用...

LUksl
06/26
0
0
分布式文件系统MogileFS简介

一、关于MogileFS 二、常见分布式文件系统 三、MogileFS基本原理 四、MogileFS的实现 一、关于MogileFS 当下我们处在一个互联网飞速发展的信息社会,在海量并发连接的驱动下每天所产生的数据...

OutManLinux
07/01
0
0
mogilefs-企业级分布式存储应用与实战

mogilefs-企业级分布式存储应用与实战 项目场景: 公司已经有了大量沉淀用户,为了让这些沉淀用户长期使用公司平台,公司决定增加用户粘性,逐步发展基于社交属性的多样化业务模式,决定开展...

lc01081314
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算卷积神经网络浮点数运算量

前言 本文主要是介绍了,给定一个卷积神经网络的配置之后,如何大概估算它的浮点数运算量。 相关代码:CalFlops,基于MXNet框架的 Scala 接口实现的一个计算MXNet网络模型运算量的demo。 正文...

Ldpe2G
今天
1
0
Sql语言与MySql数据库

1. 数据库简介 1. 数据库,就是存储数据的仓库,只能通过sql语言来访问,数据库也是一个文件系统。通常,MySQL、Oracle等数据库,也被称为关系型数据库,其保存的不仅仅只是数据,还包括数据...

江左煤郎
今天
1
0
IDEA 取消自动import .*

打开设置 > Editor > Code Style > Java > Scheme Default > Imports ① 将 Class count to use import with "*" 改为 99 (导入同一个包的类超过这个数值自动变为 * ) ② 将 Names count ......

乔老哥
今天
3
0
PostGIS学习笔记(开篇)

PostGIS事实上算是笔者开始写博客的第一篇内容。而事实上那篇博文的内容并不丰富,笔者对PostGIS的了解仍然不多,然而17年在OSGeo课程学习时对PostGIS又有了进一步了解,并逐步发现它的强大。...

胖胖雕
今天
3
0
【Centos】在nginx服务器中配置php和mysql

接上一章《【Centos】利用Vultr服务器和namesilo布网》(https://my.oschina.net/u/3776619/blog/2051986),在Centos中配置好nginx,并在iptables中开启了80端口,和为了远程mysql操作方便开...

yongh701
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部