Mogilefs是什么

MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片,以大众点评为例,用户全部图片均有mogileFS存储,数据量已经达到500TB级别以上。

mogilefs的特性

1、支持多节点冗余

2、可实现自动的文件复制

3、使用名称空间(命名空间),每个文件通过key来确定

123.jpg /000/000/00/01/md5hash.fid

4、不需要RAID,应用层可以直接实现RAID,不共享任何东西,通过"集群"接口提供服务

5、工作于应用层,没有特殊的组件要求;

6、不共享任何数据,MogileFS不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘。


mogilefs的架构

mogileFS主要由三部分构成:tracker节点,database节点,storage节点

1、Tracker(MogileFSd 进程):这个是 MogileFS 的核心部分,他是一个调度器,MogileFSd 进程就是trackers进程程序,trackers 做了很多工作:Replication(复制),Deletion(删除),Query(查询),Reaper(回收),Monitor(监控) 等等,这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed),,包括将请求负载平衡到多个"query workers"中,然后让 MogileFSd 的子进程去处理;

2、MySQL:用来存放 MogileFS 的元数据 (命名空间, 和文件在哪里),是Trackers 来操作和管理它,可以用mogdbsetup程序来初始化数据库,因为数据库保存了MogileFS的所有元数据,建议做成HA架构;

3、Storage Nodes:这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增加这些机器,实际文件存放的地方。

分布式存储多副本网络架构 分布式存储实现_perl


分布式存储多副本网络架构 分布式存储实现_数据库_02

每次文件的上传和读取,都经过前端TrackerServer服务器,trackerServer服务器受到client端的请求,查询数据库,返回一个上传或者是读取的可用的后端StorageServer的地址,然后由client端直接操作后端StorageServer服务器。upload操作返回就是成功或者失败的结果,read操作就是返回对应的查询数据。


mogileFS的术语

MogileFS管理的几个概念:

1、Domain:一个MogileFS可以有多个Domain,用来存放不同文件(大小,类型),同一个Domain内key必须唯一,不同Domain内,key可以相同;

2、每一个存储节点称为一个主机host,一个主机上可以有多个存储设备dev(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件。

3、Class:文件属性管理,定位文件存储在不同设备上的份数(相同的文件只能上传的分数);


mogilefs安装方式

mogilefs安装常用两种方式,yum安装和perl程序安装

yum 安装:通常是在线安装,好处是安装方式简单,不易出错;常用的安装yum源为epel

yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO


本地安装的rpm包:

MogileFS-Server-2.46-2.el6.noarch.rpm #核心服务

perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #socket

MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm # tracker节点

perl-MogileFS-Client-1.14-1.el6.noarch.rpm #客户端

MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #Storage存储节点

MogileFS-Utils-2.19-1.el6.noarch.rpm #主要是MogileFS的一些管理工具,例如mogadm等。


perl程序源码包安装:通过perl的包管理命令cpanm进行安装

yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes


cpanm安装

wget http://xrl.us/cpanm -O /usr/bin/cpanm; sudo chmod +x

/usr/bin/cpanm

#cpanm DBD::mysql

#cpanm MogileFS::Server

#cpanm MogileFS::Utils

#cpanm MogileFS::Client

#cpanm IO::AIO


mogilefs程序路径

主程序:/usr/bin/mogilefsd

命令行管理工具程序:/usr/bin/mogadm

主配置文件(Tracker):/etc/mogilefs/mogilefsd.conf

主配置文件(Storage Nodes):/etc/mogilefs/mogstored.conf


mogilefs程序功能的配置文件介绍

tracker配置文件

daemonize = 1

设置为1表示启动为守护进程

db_dsn = DBI:mysql:mogilefs:host=127.0.0.1

db_user = username

db_pass = password

#配置数据库连接相关信息

listen = 127.0.0.1:7001

mogilefs监听地址,监听在127.0.0.1表示只允许从本机登录进行管理

query_jobs = 10

启动多少个查询工作线程

delete_jobs = 1

启动多少个删除工作线程

replicate_jobs = 5

启动多少个复制工作线程

reaper_jobs = 1

启动多少个用于回收资源的线程


storage配置文件

maxconns = 10000

存储系统的最大连接数.

httplisten = 0.0.0.0:7500

可通过http访问的服务端口

mgmtlisten = 0.0.0.0:7501

mogilefs的管理端口

docroot = /var/mogdata

该项决定了数据的在storage上存储的实际位置,建议使用的是一个单独挂载使用的磁盘


mogilefs服务初始化

1、数据库授权

GRANT ALL PRIVILEGES ON *.* TO 'mogile' @'127.0.0.1' IDENTIFIED BY 'mogile' WITH GRANT OPTION;

2、设定数据库:

mogdbsetup --help

mogdbsetup --dbhost=127.0.0.1 --dbpass=mogpass

用户名默认为:mogile

3、添加运行用户

useradd -r mogilefs

mkdir /var/run/mogilefsd/

chown -R mogilefs.mogilefs /var/run/mogilefsd #yum安装的话已经完成

4、修改主配置文件:

/etc/mogilefs/mogilefsd.conf

5、启动服务 (tracker 服务为 mogilefsd ) (storage服务为mogstored)


MogileFS 的管理

mogstored 程序的启动将使主机本身成为一个存储的节点,mogstored 的启动后,还需要使用 mogadm 来让当前的这个主机加入到 MogileFS 的系统中.这就是一个存储节点.注意存储节点中还需要添加设备,每个设备有一个 uniq 的 ID 号.同样也要使用 mogadm 来加入到 MogileFS 的系统中.


MogileFS 中的存储主机(节点)管理

现在加入"存储节点"到 trackers 中.告诉注册自己到 trackers.相当于为每个主机加入 MogileFS 的存储系统

mogadm host add <storage_node_name> --ip=127.0.0.1 --port=7500 --status=alive

添加主机,将主机信息注册到数据库中


mogadm host list相当于mogadm --tracker=192.168.10.190:7001 check

检查这个主机是否加入到 MogileFS 的系统中.


mogadm host modify node1 --ip=123.xxx.xxx.70 --status=alive

#如果你不小心写错了,可以修改主机IP,端口,alive或者down,只要指定好节点就行


MogileFS 中的存储设备管理

建一个目录 ( 并且需要 mount 一个硬盘给这个目录 ) 给这个"设备" 使用, 我们这的例子是使用dev1在主机中建一个目录,建目录使用 dev + ID 这种格式,记的所有系统中 ID 不能重复.也必须和配置文件中的路径一样.

如下:

mkdir -p /data/mogdata/dev1

一定要注意, 给相对应用的块设备 mount 到这个点, 软链也行. 不然写文件都会写到系统硬上,其它的硬盘都是空的

给"设备"加入"存储的节点"当中,相当于为每个设备加入 MogileFS 的存储系统

mogadm device add <storage_node_name> ID

检查我们加入的"设备"信息,这样就能见到上面这个设备了.还能显示加入的大小.

mogadm device list

标记失效的设备,当硬盘坏了,设备有问题时,这时会自动在一个域内复制到最小设置的保存份数.恢复上面一样在一次 add 设备就好了

mogadm device mark <storage_node_name> <storage_node_name> ID dead


MogileFS 中域,类的管理

当上面的准备好了,MogileFS 是运行中时,接下来我们要建一个我们自己的'名字空间'和加入文件到存储当中.

我们使用 mogadm 的工具来能创建一个"域"和"类".也可以使用这个来增加文件到"类"中.

建"域"

mogadm domain add <domain_name>

检查"域",显示存在的域

mogadm domain list

在"域"中建"类",并加入最小保存份数

mogadm class add <domain_name> <class_name> --mindevcount=3


MogileFS 中文件管理

我们可以简单的使用 mog 开头的系列 Linux 命令, 来进行管理, 当然也可以用 Client 的 API来管理. 新的 MogileFS 的工具, 拆分成多个了. 下面这些命令, 都需要在/etc/mogilefs/mogilefs.conf 中指定 trackers , 不然就需要在下面的命令都加上 –trackers来指定.

1. 上传文件

mogupload --domain=magedu --key=<key_name> --file=<file_path>

2. 查询文件

mogfileinfo --trackers=host --domain=<domain_name> --key=<key_name>

例如查询一个叫 crossdomain 的 key .在指定的 domain 中.

mogfileinfo --domain=magedu --key=magedu

4. 删除指定文件

mogdelete --domain=<domain_name> --key=<key_name>

5. 列出所有的文件 key

这个可以列出指定 domain 下面的所有的 key , 也可以指定的一个前缀, 来找特定前缀的所有文件的 key.

moglistkeys --domain=<domain_name> --key_prefix=<key_name>

6. 列出指定 fid 的文件

这个 fromfid 是指 mogileFS 内部的文件 id , 这个是自增的, 你可以指定一个开始的位置, 指定显示多少文件, 这个用于查询指定时间段内上传的文件时很有用. 比如我们在 8 点上传了一个文件, 是 100 的 id, 我们可以查询到从这个之后的所有的 id 的文件.

moglistfids --fromfid=<file_id> --count=<数量>


暂时停止服务器

如果你需要维护一个服务器,比如更新内存,升级操作系统之类的需要关机的操作,推荐你在操作之前先设置这些为 "down". MogileFS 对这种偶然的故障可以很弹性的处理.

mogadm host mark mystorage down

mogadm host mark mystorage alive


硬盘设备编号

添加新的硬盘设备需要给一个唯一的,增量的设备 ID(devid).


如果你用一个新的硬盘来更换坏掉的硬盘,总是需要给一个新的 devid.不能重用老的 devid. 之所以这样做的原因是可以让你从旧设备中给所有文件列表中的文件,重新复制到其它的Mogilefs 的硬盘中.不然容易引起文件不会复制到这个中和错误的更新,也不会重新复制的旧文件

添加设备

添加设备的命令如下:

mogadm device add mystorage 5 --status=alive

mogadm device add mystorage 5 --status=down


只读模式和耗尽(Drain) 模式

如果你想要冻结设备上所有的文件,你要使用只读模式就行了。这将停掉 MogileFS 存放新文件到这个设备上,但它也将阻止删除文件.代替的删除的操作是会给这些内容放到队列中等待为您标记为'alive'或'drain'。

mogadm device mark mystorage 5 readonly

mogadm device mark mystorage 5 drain

耗尽(Drain) 模式, 在 2.40 和更高以上,告诉 MogileFS 不会有新的文件应写入设备. 但是在耗尽(Drain) 模式,文件可能被删除.所以如果你不希望写文件到这个设备上,可以设置为drain 的模式

注:耗尽(Drain) 模式在 MogileFS 的早期版本,,将会从设备删除 FIDS.现在它已经被重新均衡的功能取代。


重新复制文件

如果有一个硬盘坏了,MogileFS 可以自动的让请求不在访问这个设备,但是不会自动的重新复制这个硬盘的文件,你必须通过 mogadm 来手工来标志成 'dead'. 只要你这样做, MogileFS 将开始删除设备上的文件,并试图在集群间重新复制它们到其它的设备上.


实验:企业级分布式存储应用与实战-mogilefs实现

(1)安装mogilefs

1.创建一个存放安装mogilefs所需的软件包的目录

cd /app/

mkdir mogilefs

cd mogilefs

2.用lftp下载安装mogilefs所需的软件包

lftp 172.17.0.1

lftp 172.17.0.1:/pub/Sources/7.x86_64/mogilefs> mget *

3.安装mogilefs

yum localinstall * -y

yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO -y


(2)初始化数据库,授权即可,其他默认

1.授权



2.初始化数据库,只需指定密码,其他默认

mogdbsetup --dbpass=mogile


(3)配置tracker

1.修改配置文件

vim /etc/mogilefs/mogilefsd.conf

配置客户端请求的地址和连接数据库所需的用户名和密码

分布式存储多副本网络架构 分布式存储实现_配置文件_03

2.启动tracker

/etc/init.d/mogilefsd start

ss -ntl 查看是否有7001端口

ps -ef |grep mogilefs 查看进程

分布式存储多副本网络架构 分布式存储实现_配置文件_04

3.查看配置的tracker

mogadm --tracker=ip:port check

mogadm --tracker=192.168.10.190:7001 check


(4)配置storage节点

1.修改配置文件

vim /etc/mogilefs/mogstored.conf

配置存放真实数据的路径

分布式存储多副本网络架构 分布式存储实现_数据库_05

2.创建配置的工作路径路径

mkdir /data/mogdata -p

修改工作路径的属主

chown mogilefs.mogilefs /data/mogdata -R

3.启动strage

/etc/init.d/mogstoraged start

ss -ntl 查看7500端口

分布式存储多副本网络架构 分布式存储实现_分布式存储多副本网络架构_06


(5)关联tracker调度器和storage节点服务器

在tracker上去配置(也可在storage节点上去配置,只不过要制定tracker是谁)

1.添加节点1

mogadm --tracker=192.168.10.190:7001 host --add node3 --ip=192.168.10.187 --port=7500 --status=alive

2.查看tracker

mogadm --tracker=192.168.10.190:7001 check

3.添加节点2

mogadm --tracker=192.168.10.190:7001 host --add node5 --ip=192.168.10.160 --port=7500 --status=alive

4.查看tracker

mogadm --tracker=192.168.10.190:7001 check


(6)添加设备

创建设备目录,目录名字是有要求dev+id

1.在storage节点上node1

cd /data/mogdata

mkdir dev1

修改属主

chown mogilefs.mogilefs dev1 -R

2.在storage节点上node2

cd /data/mogdata

mkdir dev2

修改属主

chown mogilefs.mogilefs dev2 -R


(7)将设备加载到mogilefs的集群中

mogadm --tracker=192.168.10.190:7001 device add node3 1

mogadm --tracker=192.168.10.190:7001 device add node5 2


(8)查看tracker

在客户端配置文件加一个tracker,指定tracker在哪

vim /etc/mogile/mogilefs.conf

trackers=192.168.10.190:7001

然后就可以直接去查看tracker

mogadm check (不用指定tracker)

分布式存储多副本网络架构 分布式存储实现_配置文件_07


(9)添加域和class

mogadm domain add img 添加一个img域,只存放图片

mogadm class add img m26 --mindevcount=3 在img域中添加一个m26class,数据保存3份

mogadm domain list 查看域

分布式存储多副本网络架构 分布式存储实现_分布式存储多副本网络架构_08


(10)测试

1.上传文件(在tracker上)


2.在storage节点查看上传文件

分布式存储多副本网络架构 分布式存储实现_perl_09

key是文件的映射,可以在数据库中查看

分布式存储多副本网络架构 分布式存储实现_配置文件_10


(11)查询上传文件

mogfileinfo --domain=img --key=test

分布式存储多副本网络架构 分布式存储实现_分布式存储多副本网络架构_11


(12)在浏览器上访问该文件

分布式存储多副本网络架构 分布式存储实现_perl_12


(13)修复bug,实现后端storage node 同步存储

分析:因为这个版本有bug,所以需降版本

1.下载包

wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz

也可以http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz 去网站直接下载

2.上传,解压缩

rz,tar xvf Sys-Syscall-0.23.tar.gz -C /tmp

3.编译安装

① 因为是perl 语言编写的,所以需要安装perl 编译安装的环境

yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes

② 编译安装

cd /tmp/Sys-Syscall-0.23/

perl Makefile.PL 准备环境

make & make install

 4.重启服务

① 在tracker 服务器是,有时候开启服务显示失败,其实已经成功

/etc/init.d/mogilefsd stop

/etc/init.d/mogilefsd start

② 在storage node 服务器上,有时候开启服务显示失败,其实已经成功

/etc/init.d/mogstored stop

/etc/init.d/mogstored star

5.测试

① 再上传一张图片

mogupload --domain=img --key=test1 --file=ming.jpg

② 在两个storage node 服务器上,存储已经实现同步