一、常见的分布式存储系统
目前我们使用的分布式存储方面的应用均是有google的几篇论文演化出来的,下面就是这几篇论文所出现的架构:
Google File System(大规模分散文件系统) :用于分布式存储
MapReduce (大规模分散FrameWork) :用于分布式计算
BigTable(大规模分散数据库) :用于列式数据库
Chubby(分散锁服务)
1、GFS(Google File System)
Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统。。尽管Google公布了该系统的一些技术细节,但Google并没有将该系统的软件部分作为开源软件发布。 下面分布式文件系统都是类 GFS的产品。
2、HDFS
Hadoop 实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。 Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。它起源于Apache Nutch,后者是一个开源的网络搜索引擎,本身也是Luene项目的一部分。Aapche Hadoop架构是MapReduce算法的一种开源应用,是Google开创其帝国的重要基石。
3、Ceph
是加州大学圣克鲁兹分校的Sage weil攻读博士时开发的分布式文件系统。并使用Ceph完成了他的论文。 说 ceph 性能最高,C++编写的代码,支持Fuse,并且没有单点故障依赖, 于是下载安装, 由于 ceph 使用 btrfs 文件系统, 而btrfs 文件系统需要 Linux 2.6.34 以上的内核才支持。 可是ceph太不成熟了,它基于的btrfs本身就不成熟,它的官方网站上也明确指出不要把ceph用在生产环境中。
4、Lustre
Lustre是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由甲骨文公司开发和维护的。 该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数据量存储系统。 目前Lustre已经运用在一些领域,例如HP SFS产品等。
5、MogileFS
由memcahed的开发公司danga一款perl开发的产品,目前国内使用mogielFS的有图片托管网站yupoo等。 MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上。
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,用这个模块可以编写客户端程序,实现文件的备份管理功能。
6、mooseFS
支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多。
MooseFS与MogileFS的性能测试对比
7、FastDFS
是一款类似Google FS的开源分布式文件系统,是纯C语言开发的。 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
8、TFS
TFS(Taobao !FileSystem)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器 集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化 了文件的访问流程,一定程度上为TFS提供了良好的读写性能。
9、GridFS文件系统
MongoDB是一种知名的NoSql数据库,GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容,文件内容按一定大小分成若干块,每一块存在一个Document中,这种方法不仅提供了文件存储,还提供了对文件相关的一些附加属性(比如MD5值,文件名等等)的存储。文件在GridFS中会按4MB为单位进行分块存储。
二、MogileFS
1、MogileFS的特性
应用层提供服务,不需要使用核心组件
无单点(tracker(跟踪点)mogstore(存储节点)database(MySQL))
自动文件复制:复制的最小单位不是文件,而是class
传输中立:无特殊协议,可以通过NFS或HTTP实现通信
简单的命名空间:没有目录,直接存在存储空间上,通过域来实现
不共享任何数据:
2、Mogilefs基本原理
MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发,Danga团队开发了包括 Memcached、MogileFS、Perlbal等不错的开源项目:(注:Perlbal是一个强大的Perl写的反向代理服务器)。MogileFS是一个开源的分布式文件系统。主要特性包括:应用层的组件、无单点故障、自动文件复制、具有比RAID更好的可靠性、无需RAID支持等……核心角色如下:
tracker节点:借助数据库保存各节点文件的元数据信息保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本,进程名为mogilefsd(7001)。
database节点:为tracker节点提供数据存取服务。
storage节点:将指定域中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值,storage节点自动维护键值的对应关系,storage节点由于使用http进行数据传输,因此依赖于perlbal,storage节点前端可以使用nginx进行反向代理,但需要安装nginx-mogilefs-module-master模块进行名称转换,进程名mogstored(7501),perbal(7500)。
Domain:一个域中的键值是惟一的,一个MogileFS可以有多个域,域可以用来存储不同应用类型的数据的容器。
Host:每一个存储节点称为一个主机,一个主机上可以有多个存储设备(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件。
Class:复制最小单位,文件属性管理,定义文件存储在不同设备上份数。
3、mogilefs简单部署
注意mysql的安装这里就不介绍了,以下为tracker节点的操作。
数据库授权:
MariaDB [(none)]> grant all on *.* to 'root'@'192.168.%.%' identified by 'redhat'; Query OK, 0 rows affected (0.22 sec) MariaDB [mogilefs]> grant all on mogilefs.* to 'moguser'@'192.168.%.%' identified by 'mogpass'; Query OK, 0 rows affected (0.00 sec)
安装mogilefs:
[[email protected] ~]# ls 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 MogileFS-Utils-2.19-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm [[email protected] ~]# yum install -y *.rpm perl-IO-AIO
初始化数据库:
[[email protected] ~]# mogdbsetup --dbhost=192.168.1.8 --dbport=3306 --dbname=mogilefs --dbrootuser=root --dbrootpass=redhat --dbuser=moguser --dbpass=mogpass 验证是否初始化成功: 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)
mogilefs服务配置,修改mogilefs.conf文件:
[[email protected] ~]# vim /etc/mogilefs/mogilefsd.conf # Enable daemon mode to work in background and use syslog daemonize = 1 # Where to store the pid of the daemon (must be the same in the init script) pidfile = /var/run/mogilefsd/mogilefsd.pid # Database connection information db_dsn = DBI:mysql:mogilefs:host=192.168.1.8 db_user = moguser db_pass = mogpass # IP:PORT to listen on for mogilefs client requests listen = 192.168.1.8: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
更改目录权限:
[[email protected] ~]# chown -R mogilefs.mogilefs /var/run/mogilefsd
启动服务:
[[email protected] ~]# service mogilefsd start [[email protected] ~]# ss -tnlp |grep mogilefs LISTEN 0 128 192.168.1.8:7001 *:* users:(("mogilefsd",9145,6))
以下为各storage节点的操作。
安装mogilefs:
[root@node2 ~]# ls 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 MogileFS-Utils-2.19-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm [root@node1 ~]# yum install -y *.rpm perl-IO-AIO [root@node2 ~]# yum install -y *.rpm perl-IO-AIO
node1节点配置:
[root@node1 ~]# cat /etc/mogilefs/mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /data/mogdata [root@node1 ~]# mkdir -p /data/mogdata/dev1 [root@node1 ~]# chown -R mogilefs.mogilefs /data/mogdata/dev1
启动服务并查看是否正常启动:
[root@node1 ~]# service mogstored start
[root@node1 ~]# ss -tnlp |grep mog LISTEN 0 128 *:7500 *:* users:(("mogstored",2012,4)) LISTEN 0 128 *:7501 *:* users:(("mogstored",2012,9))
node2节点配置:
[root@node2 ~]# cat /etc/mogilefs/mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /data/mogdata [root@node2 ~]# mkdir -p /data/mogdata/dev2 [root@node2 ~]# chown -R mogilefs.mogilefs /data/mogdata/dev2 [root@node2 ~]# ss -tnlp |grep mog LISTEN 0 128 *:7500 *:* users:(("mogstored",4199,4)) LISTEN 0 128 *:7501 *:* users:(("mogstored",4199,9))
以下为tracker节点的操作。
添加node1节点:
[[email protected] ~]# mogadm --tracker=192.168.1.8:7001 host add node1 --ip=192.168.1.9 --status=alive [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 host list node1 [1]: alive IP: 192.168.1.9:7500 [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 device add node1 1 [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 device list node1 [1]: alive used(G) free(G) total(G) weight(%) dev1: alive 3.319 8.670 11.989 100
添加node2节点:
[[email protected] ~]# mogadm --tracker=192.168.1.8:7001 host add node2 --ip=192.168.1.10 --status=alive [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 device add node2 002 [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 host list node1 [1]: alive IP: 192.168.1.9:7500 node2 [2]: alive IP: 192.168.1.10:7500 [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 device list node1 [1]: alive used(G) free(G) total(G) weight(%) dev1: alive 3.319 8.670 11.989 100 node2 [2]: alive used(G) free(G) total(G) weight(%) dev2: alive 2.860 9.129 11.989 100
添加domain:
[[email protected] ~]# mogadm --tracker=192.168.1.8:7001 domain add files [[email protected] ~]# mogadm --tracker=192.168.1.8:7001 domain list domain class mindevcount replpolicy hashtype -------------------- -------------------- ------------- ------------ ------- files default 2 MultipleHosts() NONE
上传文件:
[[email protected] ~]# mogupload --trackers=192.168.1.8:7001 --domain=files --key='/issue.html' --file='/etc/issue' [[email protected] ~]# moglistkeys --trackers=192.168.1.8:7001 --domain=files /issue.html [[email protected] ~]# mogfileinfo --trackers=192.168.1.8:7001 --domain=files --key='/issue.html' - file: /issue.html class: default devcount: 2 domain: files fid: 3 key: /issue.html length: 47 - http://192.168.1.10:7500/dev2/0/000/000/0000000003.fid - http://192.168.1.9:7500/dev1/0/000/000/0000000003.fid
测试:
[[email protected] ~]# curl CentOS release 6.6 (Final) Kernel \r on an \m [[email protected] ~]# curl http://192.168.1.10:7500/dev2/0/000/000/0000000003.fid CentOS release 6.6 (Final) Kernel \r on an \m
添加domain并上传文件:
[[email protected] ~]# mogadm --trackers=192.168.1.8:7001 domain add images [[email protected] ~]# mogupload --trackers=192.168.1.8:7001 --domain=images --key='/logo.png' --file='/usr/share/backgrounds/default_1920x1200.png' [[email protected] ~]# mogfileinfo --trackers=192.168.1.8:7001 --domain=images --key='/logo.png' - file: /logo.png class: default devcount: 2 domain: images fid: 4 key: /logo.png length: 1470177 - http://192.168.1.10:7500/dev2/0/000/000/0000000004.fid - http://192.168.1.9:7500/dev1/0/000/000/0000000004.fid
测试:
下载文件:
[[email protected] ~]# mogfetch --trackers=192.168.1.8:7001 --domain=images --key='/logo.png' --file='./log.png' [[email protected] ~]# ls -l log.png -rw-r--r-- 1 root root 1470177 9月 17 21:22 log.png
删除文件:
[[email protected] ~]# mogdelete --trackers=192.168.1.8:7001 --domain=images --key='/logo.png'