分布式文件系统及Mogilefs

分布式系统?这是个啥?听上去还听让人费解的,其实拿最简单的词来说,分布式系统,就是将一个完整的能提供服务的平台拆分为一个个小小的零件,比如讲LAMP中httpd mariadb php拆分为三台主机上去,就算分布式系统!那么分布式文件系统就更好理解了。

分布式文件系统其实可以理解为将多个文件进行拆分,或者将完整的文件拆分放到多个不同的主机上,进行冗余和协调工作!

为什么我们需要分布式系统 | 分布式文件系统?

  1. 向上扩展的性价比越来越低,现在民用硬件的更新速度大幅下滑已经处于饱和状态!
  2. 单机扩展存在性能上升临界点。
  3. 出于稳定性及可用性考虑,单机会存在单点故障。

分布式系统实现难点:

  1. 缺乏全局时钟
  2. 面对故障时的独立性
  3. 处理单点故障
  4. 事物处理

分布式文件系统 & 分布式存储:

对于文件系统和存储来说其实都是存储数据使用,不过这些存储数据可以分为两种类型:

  • 集中式:(共享存储)

NAS: Network Attached Storage; 文件系统级别
SAN: Storage Aera Network; 块级别存储

  • 分布式:

专用的元数据节点:集中元数据存储;数据节点只负载存储数据
无专用元数据节点:所有节点均完成存储元数据;每个节点存储了部分数据

上述大家基本都了解了什么是分布式系统、分布式文件系统、分布式存储。关于分布式系统和存储今天不是重点讨论项目,今天来说说分布式文件系统。

关于分布式文件系统实现方案:

GFS: Google File System
分布式系统的开山鼻祖, 由于Google内部需要遂开发, 后来发布论文公布其技术细节, 但是没有开源
HDFS: Hadoop Distribution File System
使用了Google论文The Google FileSystem的开源实现
注:GFS和HDFS都将元数据存储于内存中, 定期存储在持久存储中 、只适合存储百万、千万级别的大文件
GlusterFS:
去中心化设计, 每一个节点存储了一部分数据
Ceph:
Linux内核级实现的分布式文件系统, 已经收录Linux内核
MogileFS:
适用于存储海量小文件, 使用perl语言编写, 国内有人使用C语言重写并开源为FastDFS
TFS:
TaoBao FileSystem, 基于HDFS开发 适用于存储海量小文件!淘宝的哦!

看来实现方案这么多!不过我肯定不会全部写出来,这次咱写写海量存储小文件(比如图片,在电商站点、大众点评之类的网站绝对会用到!)的文件系统MogileFS!


MogileFS基本结构:

tracker:

借助数据库保存各个节点文件的元数据信息, 便于检索定位数据位置并监控各个节点, 告知客户端存储区的位置并指挥storage节点复制数据副本, 进程为mogilefsd

storage:

将指定域中的键转换为特有的文件名存储于在特定的设备文件中, 转换后文件名为值, storage自动维护键值之间的对应关系, storage节点使用http进行数据传输, 依赖于perbal, 进程为mogstored, perbal

database:

为tracker节点存储节点文件的元数据信息,其实就是存储在关系型数据库中!

MogileFS internal:基本核心概念

Domain:

一个MogileFS可以有多个domain用来存放不同文件(大小、类型)在同一个Domain内,key的值必须唯一,不过在不同Domain内key的值可以相同。

class:

文件属性管理,定义文件存储在不同设备上的份数,实现让多个子文件复制为一个大的冗余单元。


MogileFS编译安装和使用配置:

总算是说到重点了,这次带来的是编译安装而不是网上许多山寨版的RPM包进行安装!而且这个RPM包已经绝版要是版本更新就麻烦了!

首先MogileFS使用的是perl语言研发的,所以编译安装有两种方式,第一种使用cpan进行一键编译安装,类似于yum但是yum是安装的二进制格式包。第二种在search.cpan.org中查找包以及其依赖包进行编译安装,不过这样做比较麻烦而且安装顺序不能错。所以要从官方下载cpan程序的rpm包安装完毕以后使用cpan进行安装MogileFS!

实验拓扑:

Mogilefs01

其中Tracker地址为128.168.1.200
storage1地址为128.168.1.201
storage2地址为128.168.1.202
mariadb地址为128.168.1.203

cpan的安装、初始化、命令讲解:

CPAN是Comprehensive Perl Archive Network的缩写,“perl档案智能网络”的意思,其中包括了大量的perl模块,软件和文档。

安装CPAN:
使用yum install -y perl-CPAN

CPAN的初始化讲解:

[root@localhost ~]# cpan 直接使用cpan命令进行初始化

CPAN.pm requires configuration, but most of it can be done automatically.
If you answer 'no' below, you will enter an interactive dialog for each
configuration option instead.

Would you like to configure as much as possible automatically? [yes] yes 
#是否使用自动安装方式,(推荐自动,如果选择手动会有60多项选择。)

 <install_help>

Warning: You do not have write permission for Perl library directories.

To install modules, you need to configure a local Perl library directory or
escalate your privileges. CPAN can help you by bootstrapping the local::lib
module or by configuring itself to use 'sudo' (if available). You may also
resolve this problem manually if you need to customize your setup.

What approach do you want? (Choose 'local::lib', 'sudo' or 'manual')
 [local::lib] #安装选项,默认即可,不推荐第三个最小化安装!

Autoconfigured everything but 'urllist'.

Now you need to choose your CPAN mirror sites. You can let me
pick mirrors for you, you can select them from a list or you
can enter them by hand.

Would you like me to automatically choose some CPAN mirror
sites for you? (This means connecting to the Internet) [yes] no 
#这个选项比较重要为是否自动选择镜像文件,推荐选择NO因为如果是自动选择会经常选到日本,泰国,台湾等地方。中国有防火墙所以访问速度极慢!

Would you like to pick from the CPAN mirror list? [yes] yes #是否列出镜像表?必须是yes
Trying to fetch a mirror list from the Internet
Fetching with HTTP::Tiny:
http://www.perl.org/CPAN/MIRRORED.BY

First, pick a nearby continent and country by typing in the number(s)
in front of the item(s) you want to select. You can pick several of
each, separated by spaces. Then, you will be presented with a list of
URLs of CPAN mirrors in the countries you selected, along with
previously selected URLs. Select some of those URLs, or just keep the
old list. Finally, you will be prompted for any extra URLs -- file:,
ftp:, or http: -- that host a CPAN mirror.

You should select more than one (just in case the first isn't available).

(1) Africa
(2) Asia
(3) Europe
(4) North America
(5) Oceania
(6) South America
Select your continent (or several nearby continents) [] 2 
#选择亚洲
(1) Bangladesh
(2) China
(3) India
(4) Indonesia
(5) Iran
(6) Israel
(7) Japan
(8) Kazakhstan
(9) Philippines
(10) Qatar
(11) Republic of Korea
(12) Singapore
(13) Taiwan
(14) Turkey
(15) United Arab Emirates
(16) Viet Nam
Select your country (or several nearby countries) [] 2 
#选中国
(1) ftp://ftp.cuhk.edu.hk/pub/packages/perl/CPAN/
(2) ftp://mirrors.ustc.edu.cn/CPAN/
(3) ftp://mirrors.xmu.edu.cn/CPAN/
(4) http://cpan.communilink.net/
(5) http://cpan.metacpan.org/
(6) http://ftp.cuhk.edu.hk/pub/packages/perl/CPAN/
(7) http://mirror.lzu.edu.cn/CPAN/
(8) http://mirrors.163.com/cpan/
(9) http://mirrors.hust.edu.cn/CPAN/
(10) http://mirrors.neusoft.edu.cn/cpan/
(11) http://mirrors.sohu.com/CPAN/
(12) http://mirrors.ustc.edu.cn/CPAN/
(13) http://mirrors.xmu.edu.cn/CPAN/
(14) http://mirrors.zju.edu.cn/CPAN/
Select as many URLs as you like (by number),
put them on one line, separated by blanks, hyphenated ranges allowed
 e.g. '1 4 5' or '7 1-4 8' [] 8 11 12-14 
#选择你想要的镜像,我的只是写法可以参考我的!
Now you can enter your own CPAN URLs by hand. A local CPAN mirror can be
listed using a 'file:' URL like 'file:///path/to/cpan/'

Enter another URL or ENTER to quit: [] 
#问你有没有其他镜像,没有选择NO
New urllist
 http://mirrors.163.com/cpan/
 http://mirrors.sohu.com/CPAN/
 http://mirrors.ustc.edu.cn/CPAN/
 http://mirrors.xmu.edu.cn/CPAN/
 http://mirrors.zju.edu.cn/CPAN/

Autoconfiguration complete.
#接下来会自动进行初始化不需要你人工参与!
#安装完成之后出现这个:
Would you like me to append that to /root/.bashrc now? [yes] yes#选择yes即可,它会吧内容移动到/root目录中!

CPAN命令说明:

查看cpan初始化信息:
o conf
重新初始化cpan:
o conf init
用CPAN来查询CPAN内的Perl模块:
d /BIOPERL/
cpan安装模块:
install ##::###
注:如果已经安装最新版本则提示:###::### is up to date.

获取更多信息可以在cpan中使用help查询!

使用CPAN安装MogileFS:

[root@localhost ~]# yum install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes -y 
#首先解决依赖关系!
cpan[1]> install App::cpanminus MogileFS::Server MogileFS::Utils IO::AIO IO::WrapTie Danga::Socket 
#直接安装即可,等一会会自定安装完毕!直接exit退出即可!
#注意的是:以上两个步骤在track或者storage中都需要安装

安装完毕MogileFS之后就要配置数据库了,不过如何安装数据库?这个你看看我前面的文件就行,如果省事可以直接yum install -y mysql-server|mariadb-server

配置数据库:

MariaDB [(none)]> CREATE DATABASE cookies; 
#创建数据库
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL ON cookies.* TO 'cookies'@'128.168.1.%' IDENTIFIED BY '***********'; #给予授权
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES; 
#刷新
Query OK, 0 rows affected (0.00 sec)

配置MogileFS的tracker节点,进行数据库设定:

[root@localhost ~]# mogdbsetup -h #查看帮助
 #--dbhost 数据库地址
 #--dbport 数据库端口
 #--dbname 数据库名称
 #--dbuser 授权给tracker的数据库用户
 #--dbpass 授权给tracker的数据库用户密码
 #--yes 后面的内容回答yes
[root@localhost ~]# mogdbsetup --dbhost=128.168.1.203 --dbport=3306 --dbname=cookies --dbuser=cookies --dbpass=****** --yes
#配置完成后回数据库看看,在库中有没有表?

配置tracker节点的配置文件:

[root@localhost ~]# mkdir /etc/mogilefs #由于编译安装配置文件神马的都得自己创建!
[root@localhost mogilefs]# vi /etc/mogilefs/mogilefsd.conf
# Enable daemon mode to work in background and use syslog 
#是否已独立守护进行运行,否则会占用一个shell来运行
daemonize = 1
# Where to store the pid of the daemon (must be the same in the init script) pid文件存放路径
pidfile = /var/run/mogilefsd/mogilefsd.pid
# Database connection information 数据库格式、类型、数据库名、数据库地址
db_dsn = DBI:mysql:cookies:host=128.168.1.203
db_user = cookies #数据库用户
db_pass = ****** #数据库用户的密码
# IP:PORT to listen on for mogilefs client requests mogilefs监听地址
listen = 0.0.0.0:7001
# Optional, if you don't define the port above.mogilefs监听端口
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
# Number of fsck workers to start by default.
# (these can cause a lot of load when fsck'ing)
#fsck_jobs = 1
# Minimum amount of space to reserve in megabytes
# default: 100
# Consider setting this to be larger than the largest file you
# would normally be uploading.
#min_free_space = 200
# Number of seconds to wait for a storage node to respond.
# default: 2
# Keep this low, so busy storage nodes are quickly ignored.
#node_timeout = 2
# Number of seconds to wait to connect to a storage node.
# default: 2
# Keep this low so overloaded nodes get skipped.
#conn_timeout = 2
# Allow replication to use the secondary node get port,
# if you have apache or similar configured for GET's
#repl_use_get_port = 1
#配置文件我写的很详细了,大家只要粘贴下来即可!

tracker节点启动|停止服务:

重点内容,由于没有相关启动服务脚本!cntos6有的,不过在centos7上不能使用会报错!所以我自己写了一个能够使用的脚本,虽然很难看,但是管用!
不过在下载脚本之前我们得做以下配置:

[root@localhost mogilefs]# useradd -r mogilefs #添加用户
[root@localhost mogilefs]# mkdir /var/run/mogilefsd #创建PID文件目录
[root@localhost mogilefs]# chown -R mogilefs:mogilefs /var/run/mogilefsd #修改文件属主属组!

脚本下载:点我!关于脚本说明:点我

配置storage节点:

[root@localhost ~]# mkdir /var/mogilefs/dev1 -pv 
#首先创建文件给storage节点放置数据用,如果配置多个storage节点设备名称(dev)不能重名
mkdir: created directory ‘/var/mogilefs’
mkdir: created directory ‘/var/mogilefs/dev1’
[root@localhost ~]# chown -R mogilefs.mogilefs /var/mogilefs 
#修改文件属组属主,不过下面提示没有用户我们就添加一个用户!
chown: invalid user: ‘mogilefs.mogilefs’
[root@localhost ~]# useradd -r mogilefs #添加用户
[root@localhost ~]# chown -R mogilefs.mogilefs /var/mogilefs
[root@localhost ~]# mkdir /etc/mogilefs #创建配置文件
[root@localhost ~]# cd /etc/mogilefs
[root@localhost mogilefs]# vi mogstored.conf #配置配置文件
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /var/mogilefs
#这样就算配置完毕了,大家只需要知道docroot是写明放置数据目录的即可!

启动storage节点:

这个启动咱们照样写了一个脚本,大家只需下载然后使用即可!脚本虽然非常简陋但是能够解决问题。嘿嘿!
脚本下载:点我!关于脚本说明:点我

启动完毕之后(是两个storage启动)我们再次将眼光回到tracker上面!

回到tracker节点添加存储节点:

[root@localhost ~]# mogadm --trackers=128.168.1.200:7001 host add 128.168.1.201 --ip=128.168.1.201 --status=alive 
#其中需要指明tracker的地址和端口,然后host add 需要添加storage的主机名,也可以是IP!
[root@localhost ~]# mogadm --trackers=128.168.1.200:7001 host add 128.168.1.202 --ip=128.168.1.202 --status=alive
[root@localhost ~]# mogadm host list #查看当前存储结点
128.168.1.201 [1]: alive
 IP: 128.168.1.201:7500

128.168.1.202 [2]: alive
 IP: 128.168.1.202:7500

#添加好所有的storage节点就算结束!

让storage节点提供块设备给tracker节点:

[root@localhost ~]# mogadm --trackers=128.168.1.200:7001 device add 128.168.1.201 1 #在主机名之后的1代表刚刚在storage节点上创建的dev1这个文件夹
[root@localhost ~]# mogadm --trackers=128.168.1.200:7001 device add 128.168.1.202 2 #记住设备文件不能相同!
[root@localhost ~]# mogadm device list #查看块设备列表使用情况
128.168.1.201 [1]: alive
 used(G) free(G) total(G) weight(%)
 dev1: alive 0.118 2.540 2.658 100

128.168.1.202 [2]: alive
 used(G) free(G) total(G) weight(%)
 dev2: alive 0.118 2.540 2.658 100
#到此块设备添加完毕!

在tracker节点上创建一个域domain:

[root@localhost ~]# mogadm --trackers=128.168.1.200:7001 domain add hobbit #添加一个叫做hobbit的域!
[root@localhost ~]# mogadm domain list #查看域
 domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
 hobbit default 2 MultipleHosts() NONE
#好了添加域就算结束,如果有多个域可以继续添加。

在tracker节点的域中添加一个class:

[root@localhost ~]# mogadm --trackers=128.168.1.200:7001 class add hobbit baggies #在hobbit域中添加一个叫做baggies的class。
[root@localhost ~]# mogadm class list #查看class
 domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
 hobbit baggies 2 MultipleHosts() NONE
 hobbit default 2 MultipleHosts() NONE
#好了class已经配置结束!

上传文件并且测试:

[root@localhost ~]# mogupload --trackers=128.168.1.200:7001 --domain=hobbit --key='/like.jpg' --file='./like.jpg' #我找了一张图片上传了上去!其中key表示存储在domain中的文件标记,而file表示上传的文件名称!
[root@localhost ~]# mogfileinfo --trackers=128.168.1.200:7001 --domain=hobbit --key='/like.jpg'
- file: /like.jpg
 class: default
 devcount: 1
 domain: hobbit
 fid: 4
 key: /like.jpg
 length: 235886
 - http://128.168.1.201:7500/dev1/0/000/000/0000000004.fid
#上面的命令是按照key的唯一值查看文件的详细情况,其中http开头的是查看图片的路径,我使用网页进行打开!

打开后出现图片:

Mogilefs02

好了至此mogilefs就算配置结束了,但是好像这样存储图片不太好,因为调用图片太麻烦。在下篇文章有写道使用nginx做代理来调用图片!

Comments

  • 骑驴玩漂移 on

    小海螺加油!

    reply

    • 曲奇 on

      谢谢!嘿嘿

      reply

Leave a Reply

Your email address will not be published. Name and email are required