一、分布式文件系统

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连,也就是集群文件系统,可以支持大数量的节点以及PB级的数量存储。
相对地,在一个分享的磁盘文件系统中,所有节点对数据存储区块都有相同的访问权,在这样的系统中,访问权限就必须由客户端程序来控制。
分布式文件系统可能包含的功能有:透通的数据复制与容错。也就是说,即使系统中有一小部份的节点脱机,整体来说系统仍然可以持续运作而不会有数据损失

分布式文件系统类别

名称                                               

特性                                                                                                                                                         

MogileFS
适用于处理海量小文件

Ceph
是一个 Linux PB级别的分布式文件系统

MooseFS
通用简便,适用于研发能力不强的公司

Taobao Filesystem
适用于处理海量小文件

ClusterFS
适用于处理单个大文件

Google Filesystem
GFS+MapReduce擅长处理单个大文件

Hadoop Distributed Filesystem
GFS的山寨版+MapReduce,擅长处理单个大文件

MogileFS由3个部分组成
   第1个部分: 是server端,包括mogilefsd和mogstored两个程序。前者即是mogilefsd的tracker,它将一些全局信息保存在数据库 里,例如站点domain,class,host等。后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
   第2个部分:是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。
   第3个部分:是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能,提供MogileFS.pm

mogilefs分布式文件系统_第1张图片

CAP理论:一致性,可用性,分区容错性;指一个分布式系统不可以满足一致性,可用性和分区容错性这三个需求,最多只能同时满足其中的两个;
   C(Consistency):一致性,任何一个读操作总是能够读取之前完成的写操作;就是一个数据写入一立马被读到;
   A(Availability):可用性,每一次操作总是能够 在确定的时间返回;无论成功或失败都能收到一个返回值的;
   P(Tolerance of network Partition):分区容错性,在出现网络分区的情况下,仍然能够满足一致性和可用性;

 

环境:3台虚拟机:172.16.17.3调度器(tracker+MogileFS+mysql),172.16.17.11存储节点(mogstored),172.16.17.12存储节点(mogstored)。

172.16.17.3上安装mysql,mysql数据库可以安装在这3台主机里的任意一台。

[root@MinR mogilefs]# service mysqld start Starting 
mysqld:                                           [  OK  ]     启动mysql
[root@MinR mogilefs]# mysql Welcome to the MySQL monitor.  Commands end 
with ; or \g. Your MySQL connection id is 2 Server version: 5.1.71 
Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights 
reserved.
Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input 
statement.
mysql> GRANT ALL ON *.* TO 'root'@'172.16.%.%' IDENTIFIED BY 'mageedu'; 
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)    
给root用户授权
mysql> GRANT ALL ON *.* TO 'root'@'MinR' IDENTIFIED BY 'mageedu'; 
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)      
主机名授权, 防止反向解析出错
 
mysql> GRANT ALL ON mogdb.* TO 'moguser'@'172.16.%.%' IDENTIFIED BY 
'mogpass'; Query OK, 0 rows affected (0.01 sec)     给 moguser用户授权
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL ON mogdb.* TO 'moguser'@'MinR' IDENTIFIED BY 'mogpass'; 
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)

 

安装MogileFS

[root@MinR mogilefs]# yum install MogileFS-Server-2.46-2.el6.noarch.rpm  
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm   
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm   
perl-Perlbal-1.78-1.el6.noarch.rpm   
perl-Net-Netmask-1.9015-8.el6.noarch.rpm这个后面会用到不装会报错
注意这里的perl-Perlbal是所依赖的包必须安装。否则不成功
设定数据库,这里要用mogdbsetup命令,用mogdbsetup  --help查看下具体用法
 
[root@MinR mogilefs]# mogdbsetup --dbhost=172.16.17.3 --dbname=mogdb 
--dbuser=moguser --dbpass=mogpass --dbrootuser=root --dbrootpass=mageedu
This will attempt to setup or upgrade your MogileFS database. It won't 
destroy existing data. Run with --help for more information.  Run with --yes 
to shut up these prompts.
Continue? [N/y]: y
验证下
[root@MinR mogilefs]# mysql Welcome to the MySQL monitor.  Commands end 
with ; or \g. Your MySQL connection id is 41 Server version: 5.1.71 
Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights 
reserved.
Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input 
statement.
mysql> SHOW DATABASES; +--------------------+ | Database           
| +--------------------+ | information_schema | | mogdb              
| | mysql              | | test               | 
+--------------------+ 4 rows in set (0.00 sec)
mysql> use mogdb Reading table information for completion of table and 
column names You can turn off this feature to get a quicker startup with 
-A
Database changed mysql> SHOW TABLES; +----------------------+ 
| Tables_in_mogdb      | +----------------------+ | 
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)
mysql> \q Bye


编辑mogilefsd 的配置文件

[root@MinR mogilefs]# vim /etc/mogilefs/mogilefsd.conf
db_dsn = DBI:mysql:mogdb:host=172.16.17.3 db_user = moguser db_pass = 
mogpass # IP:PORT to listen on for mogilefs client requests     
listen = 172.16.17.3:7001                                
这几项是我们要改动的,其余默认不用改

 

启动mogilefs

[root@MinR mogilefs]# service mogilefsd start 
Starting 
mogilefsd                                         [  OK  ]

 

在另外2个节点上也安装mogilefs

yum install MogileFS-Server-* perl-Net-Netmask-1.9015-8.el6.noarch.rpm 
perl-Perlbal-1.78-1.el6.noarch.rpm
[root@MinR1 mogilefs]# yum install -y perl-IO-AIO
编辑配置文件
[root@MinR1 mogilefs]# cd /etc/mogilefs/
[root@MinR1 mogilefs]# cp mogstored.conf mogstored.conf.bak   备份
[root@MinR1 mogilefs]# vim mogstored.conf
     maxconns = 10000       最大并发连接数      httplisten = 
0.0.0.0:7500              mgmtlisten = 0.0.0.0:7501      docroot = 
/mogdata/data    此目录需要手动创建,并加权限
[root@MinR1 mogilefs]# chown -R mogilefs.mogilefs /mogdata /data

 

在tracker节点                     

[root@MinR mogilefs]# yum install MogileFS-Utils-2.19-1.el6.noarch.rpm 
perl-MogileFS-Client-1.14-1.el6.noarch.rpm     安装所需的包
当这2个包安装完成后,就可看到mog打头的命令工具多了很多
[root@MinR mogilefs]# mog mogadm        mogdbsetup    mogfetch      
mogfileinfo   moglistfids   mogrename     mogstored     mogupload 
mogautomount  mogdelete     mogfiledebug  mogilefsd     moglistkeys   
mogstats      mogtool 
[root@MinR mogilefs]# mogadm --trackers=172.16.17.3:7001 host add  
查看下其具体用法
Help for 'host-add' command:
  mogadm host add  [opts]                  Add a host to 
MogileFS.
                 Hostname of machine       
--altip=s            Alternate IP that is machine is reachable from       
--altmask=s          Netmask which, when matches client, uses alt IP       
--getport=i          Alternate HTTP port serving readonly traffic       
--ip=s               IP address of machine.       --port=i             HTTP 
port of mogstored       --status=s           One of {alive,down}.  Default 
'down'.
[root@MinR mogilefs]# mogadm --trackers=172.16.17.3:7001 host add 
node2 –ip=172.16.17.11 –status=alive  添加节点
[root@MinR mogilefs]# mogadm --trackers=172.16.17.3:7001 host add 
node2 –ip=172.16.17.12 –status=alive 
[root@MinR ~]# mogadm --trackers=172.16.17.3:7001 host listnode2 [1]: 
alive  IP:       172.16.17.11:7500
node3 [2]: alive  IP:       172.16.17.12:7500       查看
[root@MinR ~]# mogadm --trackers=172.16.17.3:7001 device add node2 1 
--status=alive
[root@MinR ~]# mogadm --trackers=172.16.17.3:7001 device add node3 2 
--status=alive
[root@MinR ~]# mogadm --trackers=172.16.17.3:7001 device add node3 3 
--status=alive 
       注意上面的设备Id(1,2,3)都要提前在所对应的 节点上的/mogdata/data/dev1或者dev2或者dev3….创建好
[root@MinR ~]# mogadm --trackers=172.16.17.3:7001 device list     
查看个节点的设备node2 [1]: alive                    used(G)    free(G)   
total(G)  weight(%)           dev1:   alive      0.926     17.760     
18.686        100          node2节点的设备已添加
node3 [2]: alive                    used(G)    free(G)   total(G)  
weight(%)             node3节点的设备未添加
 
添加好后
[root@MinR ~]# mogadm --trackers=172.16.17.3:7001 device listnode2 [1]: 
alive                    used(G)    free(G)   total(G)  weight(%)   
dev1:   alive      0.926     17.760     18.686        100
node3 [2]: alive                    used(G)    free(G)   total(G)  
weight(%)   dev2:   alive      0.419     18.267     18.686        100   
dev3:   alive      0.419     18.267     18.686        100
[root@MinR ~]# mogadm --trackers=172.16.17.3:7001 device 
summaryHostname        HostID  Status   used(G)  free(G) total(G)    
%Usednode2           [   1]:  alive     0.926   17.760   18.686     
4.95node3           [   2]:  alive     0.840   36.531   37.371     
2.25[root@MinR ~]# mogadm --trackers=172.16.17.3:7001 domain add files    
默认名称空间[root@MinR ~]# mogadm --trackers=172.16.17.3:7001 domain 
list domain               class                mindevcount   replpolicy   
hashtype-------------------- -------------------- ------------- ------------ 
------- files                default                   2        
MultipleHosts() NONE
[root@MinR ~]# mogupload --trackers=172.16.17.3:7001 --domain=files 
--key='/fstab.html' --file='/etc/fstab'   上传文件
上传成功后,就可一在另外的2个节点中的任意一个来查看上传的文件,注意这里的文件保存的目录格式和我们想的不太一样
[root@node3 data]# cat dev2/0/000/000/0000000003.fid
## /etc/fstab# Created by anaconda on Thu Aug 14 21:10:35 
2014## Accessible filesystems, by reference, are maintained under 
'/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for 
more info#/dev/mapper/vg0-root    /                       ext4    
defaults        1 1UUID=b7e0fe27-dea3-444c-9d20-4d7edb7e4570 
/boot                   ext4    defaults        1 2/dev/mapper/vg0-usr     
/usr                    ext4    defaults        1 2/dev/mapper/vg0-var     
/var                    ext4    defaults        1 2/dev/mapper/vg0-swap    
swap                    swap    defaults        0 0tmpfs                   
/dev/shm                tmpfs   defaults        0 0devpts                  
/dev/pts                devpts  gid=5,mode=620  0 0sysfs                   
/sys                    sysfs   defaults        0 0proc                    
/proc                   proc    defaults        0 0这的确是我们上传的结果。
在172.16.17.3上也可查看到文件的2个副本
[root@MinR ~]# mogfileinfo --trackers=172.16.17.3:7001 --domain=files 
--key='/fstab.html'- file: /fstab.html     class:              
default  devcount:                    2    domain:                
files       fid:                    3       key:          
/fstab.html    length:                  921 - http://172.16.17.11:7500/dev1/0/000/000/0000000003.fid          
用http协议也可访问。本来就是通过http协议共享的 - http://172.16.17.12:7500/dev2/0/000/000/0000000003.fid


 

再上传一个图片文件

[root@MinR ~]# mogupload --trackers=172.16.17.3:7001 --domain=files 
--key='/bg.png' 
--file='/usr/share/backgrounds/wallpaper-six-2048x1536.png'
[root@MinR ~]# 
mogfileinfo --trackers=172.16.17.3:7001 --domain=files --key='/bg.png'
- 
file: /bg.png
     class:              default
  
devcount:                    2
    domain:                files
       
fid:                    4
       key:              /bg.png
    
length:               608517
 - 
http://172.16.17.12:7500/dev2/0/000/000/0000000004.fid
 - 
http://172.16.17.11:7500/dev1/0/000/000/0000000004.fid


在浏览器访问

mogilefs分布式文件系统_第2张图片