今天我们来认识一个新的存储系统——MogileFS(分布式文件存储系统)。
(一)MogileFS是什么
MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片,以大众点评为例,用户全部图片均有mogileFS存储,数据量已经达到500TB级别以上。
(二)MogileFS有什么特性
1、支持多节点冗余
2、可实现自动的文件复制
3、使用名称空间(命名空间),每个文件通过key来确定
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、Database(MySQL):用来存放 MogileFS 的元数据 (命名空间, 和文件在哪里),是Trackers 来操作和管理它,可以用mogdbsetup程序来初始化数据库,因为数据库保存了MogileFS的所有元数据,建议做成HA架构;
3、Storage Nodes:这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增加这些机器,实际文件存放的地方。
(四)MogileFS的工作机制
每次文件的上传和读取,都经过前端TrackerServer服务器,trackerServer服务器受到client端的请求,查询数据库,返回 一个上传或者是读取的可用的后端StorageServer的地址,然后由client端直接操作后端StorageServer服务器。upload操 作返回就是成功或者失败的结果,read操作就是返回对应的查询数据。
(五) 具体的安装和实现
通常情况下有两种安装方式:yum安装和源码安装,这里我们就以yum安装为例。
1、首先要安装下列相关包。
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO -y
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y
本地安装的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 #客户端
ogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #Storage存储节点
MogileFS-Utils-2.19-1.el6.noarch.rpm #主要是MogileFS的一些管理工具,例如 mogadm等。
2、 在tracker上进行以下配置:
1.安装完mogilefs相关包后,安装mariadb数据库,然后对用户进行授权:
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'mogile' @'172.17.%.%' IDENTIFIED BY 'mogile' WITH GRANT OPTION;
2.设定数据库(MogileFS 中文件管理,我们可以简单的使用 mog 开头的系列 Linux 命令, 来进行管理, 当然也可以用 Client 的 API 来管理. 新的 MogileFS 的工具, 拆分成多个了. 下面这些命令, 都需要在 /etc/mogilefs/mogilefs.conf 中指定 trackers , 不然就需要在下面的命令都加上 –trackers 来指定.)
mogdbsetup --help
mogdbsetup --dbhost=127.0.0.1 --dbpass=mogile 用户名默认为:mogile
3.修该tracker的主配置文件
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = mogile
db_pass = mogile
listen = 172.17.253.210:7001
4.用自带脚本启动该服务,可以看到7001端口已经打开
/etc/init.d/mogilefsd start
5.登录MySQL,查看mogilefs库是否生成
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mogilefs |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> use mogilefs;
Database changed
MariaDB [mogilefs]> show tables;
+----------------------+
| Tables_in_mogilefs |
+----------------------+
| checksum |
| class |
| device |
| domain |
| file |
| file_on |
| file_on_corrupt |
| file_to_delete |
| file_to_delete2 |
| file_to_delete_later |
| file_to_queue |
| file_to_replicate |
| fsck_log |
| host |
| server_settings |
| tempfile |
| unreachable_fids |
+----------------------+
17 rows in set (0.00 sec)
3、配置storage文件
1.修改storage配置文件(由于两个storage节点配置一样,这里就以storage1节点为例。storage1:172.17.254.222,storage2:172.17.254.224)
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogstorage
2.MogileFS 中的存储设备管理
建一个目录并修改目录权限 ( 并且需要 mount 一个硬盘给这个目录 ) 给这个"设备" 使用, 我们这的例子是使用 dev1在主机中建一个目录,建目录使用 dev + ID 这种格式,记的所有系统中 ID 不能重复.也必 须和配置文件中的路径一样. 如下: mkdir -p /data/mogstorage/dev1 一定要注意, 给相对应用的块设备 mount 到这个点, 软链也行. 不然写文件都会写到系统硬上, 其它的硬盘都是空的
mkdir -p /data/mogstorage/dev1
chown mogilefs.mogilefs /data/mogstorage/ -R
3.启动服务,可以看到7500端口已打开
/etc/init.d/mogstored start
4、在tracker节点上进行mogilefs存储主机的管理:
1.现在加入“存储节点”到 trackers 中.告诉注册自己到 trackers.相当于为每个主机 加入 MogileFS 的存储系统
mogadm host add node1 --ip=172.17.254.222 --port=7500 --status=alive #添加主机,将主机信息注册到数据库中
mogadm host list #检查这个主机是否加入到 MogileFS 的系统中
[root@localhost mysql]#mogadm host list
node1 [1]: alive
IP: 172.17.254.222:7500
node2 [2]: alive
IP: 172.17.254.224:7500
mogadm host modify node1 --ip=123.xxx.xxx.70 --status=alive #可以修改主机IP
2.给"设备"加入”存储的节点“当中,相当于为每个设备加入 MogileFS 的存储系统
mogadm device add node1 1
mogadm device add node2 2
mogadm device list
[root@localhost mysql]#mogadm device list
node1 [1]: alive
used(G) free(G) total(G) weight(%)
dev1: alive 3.780 46.195 49.976 100
node2 [2]: alive
used(G) free(G) total(G) weight(%)
dev2: alive 3.410 46.565 49.976 100
标记失效的设备,当硬盘坏了,设备有问题时,这时会自动在一个域内复制到最小设置的保存份数. 恢复上面一样再一次 add 设备就好了 mogadm device mark node_name ID dead
3.当上面的准备好了,MogileFS 是运行中时,接下来我们要建一个我们自己的'名字空间'和加入文 件到存储当中. 我们使用 mogadm 的工具来能创建一个"域"和"类".也可以使用这个来增加文件到"类"中.
建"域"
mogadm domain add imgs
检查"域",显示存在的域
mogadm domain list
在"域"中建"类",并加入最小保存份数
mogadm class add imgs class1 --mindevcount=3
[root@localhost mysql]#mogadm domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
imgs class1 3 MultipleHosts() NONE
imgs default 2 MultipleHosts() NONE
4.上传文件进行测试
mogupload --domain=imgs --key=test1 --file=test1.png
mogupload --domain=imgs --key=test2 --file=test2.jpg
[root@localhost mysql]#mogfileinfo --domain=imgs --key=test1#查询文件
- file: test1
class: default
devcount: 2
domain: imgs
fid: 11
key: test1
length: 72825
- http://172.17.254.224:7500/dev2/0/000/000/0000000011.fid
- http://172.17.254.222:7500/dev1/0/000/000/0000000011.fid
[root@localhost mysql]#mogfileinfo --domain=imgs --key=test2
- file: test2
class: default
devcount: 2
domain: imgs
fid: 10
key: test2
length: 87170
- http://172.17.254.222:7500/dev1/0/000/000/0000000010.fid
- http://172.17.254.224:7500/dev2/0/000/000/0000000010.fid
在两个存储节点可以看到文件已经都存在了:
这里有一个bug,如果不解决这个bug会导致这两个存储节点的数据不同步,来看一下bug存在的情况下:
这个0的目录下只在storage1节点存在,而另一边没有,然而这个问题就是由于我们安装的这个Sys-Syscall的版本存在的问题,由于我们目前的版本是0.25的版本,所以这里我们就需要降级,降到0.23的版本,这里我们就需要去Sys-Syscal官网下载0.23的版本,然后编译安装。之后就看到了两边文件同步的状况。
tar xf Sys-Syscall-0.23.tar.gz
cd Sys-Syscall-0.23/
perl Makefile.PL
make
mkae install