一、分布式文件系统介绍
定义:分布式存储系统是大量普通PC服务器通过与Internet互联,对外作为一个整体提供存储服务。分布式文件系统,顾名思义,就是分布式+文件系统。它包含这两个方面的内涵,从文件系统的客户端使用的角度来看,它就是一个标准的文件系统,提过一系列的API,由此进行文件或者目录的创建、移动、删除,以及对文件的读写等操作。从内部实现来看,分布式系统则不再和普通文件系统一样负责管理本地磁盘,它的文件内容和目录结构都不是存储再本地磁盘上,而是通过网络传输到远端系统上。并且,同一个文件存储不只是在一台机器上,而是在一组机器上分布式存储,协同提供服务。
特性:
1、可扩展:分布式存储系统可以扩展到几百台至几千台的集群规模,且随着集群规模的增长,系统整体性能表现为线性增长;
2、低成本:分布式存储系统的自动容错、自动负载均衡机制使其可以构建再普通PC机之上;另外,线性扩展能力也使得增长、减少机器非常方便,可以实现自动运维;
3、高性能:无论针对整个集群还是单台服务器,都要求分布式系统具备高性能。
4、易用性:分布式存储系统需要能够提供易用的对外接口;另外,也要求具备完善的监控、运维工具,并能方便的与其他系统集成,如从hadoop云计算系统导入数据;
挑战:在于数据、状态信息的持久化,要求在自动迁移,自动容错、并发读写的过程中保证数据的一致性;
二、CAP理论
来自Berkerly的Eric Brewer教授提出了一个著名的CAP理论:一致性(Consistency),可用性(Availability)和分区容忍性(Tolerance of networkPartition)三者不能同时满足;
C:读操作总是能够读取到之前完成的写操作结果,满足这个条件的系统成为强一致系统,这里的“之前”一般对同一个客户端而言;
A:读写操作再单台机器发生故障的情况下依然能够正常执行,而不需要等待发生故障的机器重启或者其上的服务迁移到其他机器;
P:机器故障、网络故障、机房停电等异常情况下仍然能够满足一致性可可用性;
分布式存储系统要求能够自动容错,即分区可容忍性总是需要满足的,因此,一致性和写操作的可用性就不能同时满足了,需要再这两者间权衡,是选择不允许丢失数据,保持强一致,还是允许少量数据丢失以获得更好的可用性;
三、常见分布式文件系统
GFS(Google File System):Google公司为了满足自己公司需求而开发的基于Linux的专有分布式文件系统。由于其元数据时存储再内存中,所以在存储文件数量上注定不可能达到海量存储,主要是存储大文件使用。
HDFS(Hadoop Distributen File System):hadoop的重要组成之一,几乎完全山寨版的GFS。
TFS:淘宝自主研发,将元数据存储于关系型数据库或其它高性能存储中,从而能维护海量文件元数据;主要用于存储海量小文件,维护难度大
GlusterFS:去中心化的设计模式;擅长处理单个大文件;
Ceph:Linux内核级实现的文件系统,目前已经直接被收录进Linux内核;bug较多,稳定性不佳
MooseFs:持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国人用的较多;
MogileFS:元数据放在数据库中,擅长处理海量小文件,性能较好;
FastDFS:轻量级分布式系统,擅长处理海量小文件
四、MogileFS详细介绍
MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片。
1、MogileFS由3个部分组成:
(1)、server:主要包括mogilefsd和mogstored两个应用程序。mogilefsd实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、host等;
(2)、utils(工具集):主要是MogileFS的一些管理工具,例如modadm等。
(3)、客户端API:MogileFS的客户端API很多,例如Perl、php、Java、python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等。
2、MogileFS特性:
(1)、工作于应用层:http,nfs;
(2)、无单点:三大组件(tracker,mogstore,database)皆可以实现高可用;
(3)、自动完成文件复制:复制的最小单位不是文件,而是class;基于不同的class,文件可以被自动的复制到多个有足够存储空间的存储节点上;
(4)、传输无需特殊协议:可以通过NFS或HTTP协议进行通信;
(5)、名称空间:文件通过一个给定的key来确定,是一个全局的命名空间;没有目录,基于域实现文件隔离;
(6)、不共享任何数据:无需通过昂贵的SAN来共享磁盘,每个存储节点只需维护自己所属的存储设备(device)即可;
两个关键术语:
domain:name space,命名空间
一个MogileFS可以有多个Domain
用来存放不同文件(大小、类型)
同一个Domain内,key必须唯一
不同Domain内,key可以相同
class:最小复制单元
文件属性管理器
定义文件存储再不同设备上的份数
理想架构
实际架构
系统环境: Centos6.7
工作流程
1、客户端向服务器端发送请求
2、nginx通过调度将请求转达给其中一个mogilefs的tracker
3、tracker接收到请求向后端数据库获取存储位置并返回给nginx
4、nginx接到存储位置再到mogilefs的存储上获取实际存储数据并返回给客户端
五、MogileFS实现
1、node3上安装mysql并配置其root用户允许远程连接 # tar xf mysql-5.6.22-linux-glibc2.5-x86_64.tar.gz -C /usr/local # cd /usr/local # ln -sv mysql-5.6.22-linux-glibc2.5-x86_64/ mysql # groupadd -g 306 mysql # useradd -g 306 -u 306 -s /sbin/nologin -M -r mysql # mkdir /u01/mysql/{data,log} -pv # chown -R mysql.mysql /u01/mysql/ # cd /usr/local/mysql # chown root.mysql ./* # scripts/mysql_install_db --user=mysql --datadir=/u01/mysql/data # cp support-files/mysql.server /etc/rc.d/init.d/mysqld # chmod +x /etc/rc.d/init.d/mysqld # chkconfig --add mysqld # echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf # ldconfig # ldconfig -p | grep mysql # ln -sv /usr/local/mysql/include/ /usr/include/mysql # echo "export PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh # . /etc/profile.d/mysql.sh # vim /etc/my.cnf [mysqld] lower_case_table_names =1 #不区分大小写 datadir = /u01/mysql/data #数据目录 port = 3306 #端口 socket = /tmp/mysql.sock pid-file = /tmp/mysql.pid character_set_server = utf8 #server级别字符集 default_storage_engine = InnoDB #默认存储 log_error = /var/log/mysql/mysqld.log log-bin = /u01/mysql/log/mysql-bin #log-bin文件存放目录 log-bin-index = /u01/mysql/log/mysql-bin.index expire_logs_days = 30 skip-name-resolve # mkdir /var/log/mysql # service mysqld start # mysql > GRANT ALL ON *.* TO 'root'@'192.168.%.%' IDENTIFIED BY 'mogilefs'; #授权 Query OK, 0 rows affected (0.00 sec) > flush privileges; #重读授权 Query OK, 0 rows affected (0.01 sec) 2、安装如下软件包,虽然只是配置tracker,但还是安装了storage的包,是因为后面做高可用时用到 MogileFS-Server-2.46-2.el6.noarch.rpm #通行组件 MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm #traker MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #storage MogileFS-Utils-2.19-1.el6.noarch.rpm #工具包 Perlbal-1.78-1.el6.noarch.rpm Perlbal-doc-1.78-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm #客户端开发使用 perl-Net-Netmask-1.9015-8.el6.noarch.rpm #机架感知能力 perl-Perlbal-1.78-1.el6.noarch.rpm #依赖包 # yum -y localinstall *.rpm #安装所有包 由于node3是做tracker的,用到的主要程序包是MogileFS-Server-mogilefsd,其他和配置tracker没有太 大关系,MogileFS-Server-mogilefsd生成的主要文件 # rpm -ql MogileFS-Server-mogilefsd /etc/mogilefs/mogilefsd.conf #主配置文件 /etc/rc.d/init.d/mogilefsd #启动脚本 /usr/bin/mogdbsetup #数据库初始化工具 /usr/bin/mogilefsd #mogilefsd主进程 3、初始化MogileFS数据库:使用可以连接到mysql的用户和密码,创建一个MogileFS使用的数据库和数 据库的管理用户以及设置密码
六、MogileFS高可用
七、Nginx反向代理MogileFS