基本介绍
概念
- GlusterFS 文件系统标准的posix接口支持,可以做分布式NAS,也有人HPC,甚至支持KVM的虚机卷;做分布式NAS最多,其他方面用的不多,很多互联网视频公司用GlusterFS来做片库;
- ceph,支持块ceph RBD,对象ceph RGW,文件cephfs;ceph RBD和ceph RGW比较成熟,在openstack社区比较火,做虚机块存储用的很多,cephfs的前期bug比较多,社区目前也在解决这些问题;
- Lustre,比较老牌的分布式文件系统,部署在多个san阵列上,不支持副本,支持分布式锁,主要做HPC高性能计算;
- HDFS只支持追加写,设计中没有考虑修改写、截断写、稀疏写等复杂的posix语义,目的并不是通用的文件系统,一般作为hadoop ecosystem的存储引擎;
- moosefs 比较接近GoogleFS的c++实现,通过fuse支持标准的posix,算是通用的文件系统,可惜社区不是太活跃;
- IBM的GPFS也是一个很老牌的分布式文件系统,非常强大,有两个分支,一个是通用文件系统,一个是兼容hadoop mapreduce,可惜没有开源,国内也没人买的起;
- Facebook Haystack是一个专有的图片存储系统的原型,适合小文件和worm场景(write once read many),本身并没有开源,GitHub上已经有一个比较成熟的实现Terry-Mao/bfs(不是百度的BFS)
选型:
每个流行的云存储系统都有自己的侧重点,可选的架构很多,关键是要针对特定的应用场景,可以从以下几个方面考虑选型:系统规模大小、业务类型与压力、实时 / 非实时、大文件 / 中等文件 / 小文件、连续读写 / 随机读写、吞吐率 / 低延迟、强一致性 / 弱一致性、性能 & 可靠性、扩展性 & 单节点问题、是否要求目录结构、可配置 & 快速部署、大数据离线/在线分析、电子商务、社交网络、网络硬盘、邮件服务、图片服务、语音视频服务、虚拟机调度与镜像存储、开放云存储平台……
中心化架构与对称架构并不是完全对立的,两者都可能存储大文件和小文件,区别只是相对而言的。在大数据存储、分析领域,中心化架构较多,HDFS仍然被广泛使用或模仿。而在互联网应用中(电子商务、社交网络、APP),以中小文件的存储为主,对称架构较多,Dynamo和BigTable的设计理念被广泛地参考。
大多数系统都抛弃了目录结构。因为目录树的开销非常大,去掉之后,集群的性能和扩展性被极大地提高。
云存储系统的架构大同小异,成功的关键在于细节:操作系统级优化、文件系统级优化、优秀的代码实现、稳定性……
关注个性化:
策略、代码和性能的优化。
数据分布方案 & 副本分布方案,文件去重。
模块化 & 插件化,可热拔插 & 动态替换。
抽象的存储引擎层,灵活地切换持久化存储或缓存。
融合SSD与机械硬盘,权衡性能与成本。
底层文件系统的选择与优化。
文件分块/聚合,增量同步,标准化接口(RESTfull、POSIX)。
系统部署与扩展的便捷性,自动化程度。
分布式环境下特别需要关注一致性问题,权衡性能与一致性等级。并发操作、各种版本冲突、机器故障、机器恢复、数据迁移与用户访问并存……集群状态不断变化,如何确保一致性约束。
一般而言:
离线型数据分析系统
- 数据总量大,单个文件大,更注重系统吞吐率,而非低延迟。
- 为适应流行的MapReduce模型,需要文件分块,并配合上层逻辑,采用大块顺序读写的方式提升性能。
线上服务系统
- 根据服务类型而采用差异化的存储方式。
- 针对语音视频等大文件,可能会采用与离线系统相同的方式,文件分块顺序读写,从而达到更高的传输速度。由于文件数量相对较少,有可能完全实现传统文件系统的目录结构与权限等功能。
- 电子商务、社交网络等应用场景,多为小文件(小图片与小视频、记录与评价信息等),文件数量庞大,增长快速,用户基数大,实时性要求高,读写随机性强,对性能与扩展性的要求很高。
HDFS
FastDFS
对比
FastDFS与Hadoop的区别:
hadoop的文件系统HDFS主要解决并行计算中分布式存储数据的问题。其单个数据文件通常很大,采用分块(切分)存储的方式;适用于大数据的处理,随机读写相对复杂。
FastDFS主要用于大中网站,为文件上传和下载提供在线服务。所以在负载均衡、动态扩容等方面都支持得比较好,FastDFS不会对文件进行分快(切分)存储。FastDFS适合存储小文件,随机读写比较简便。
FastDFS | HDFS | |
---|---|---|
开发语言 | C | JAVA |
系统概述 | 两个角色跟踪器(tracker)和存储节点(storage),tracker负责调度,storage负责存储文件以及相关属性 | HDFS也是按照Master和Slave的结构,分NameNode、SecondaryNameNode、DataNode几个角色 |
文件同步 | 没有使用数据库,文件同步直接点对点,不经过tracker中转 | hdfs使用分块的方式进行存储,存储一份文件同时会存储三个副本在不同节点和不同机架上 |
通信协议 | Socket通信协议,使用内置的web服务器支持http,或者使用第三方web服务,整合nginx或Apache web server | 支持socket协议及RPC通信协议,有相应的http服务接口 |
安装环境 | 依赖gcc编译环境,FastDFS5.04版本以后将不依赖libevent库,libfastcommon是FastDFS官方提供的,必须安装 | 依赖JDK环境 |
特性 | 支持合并存储及将小的文件存储到大的文件当中;支持同一个文件只存储一份 | 保存多个副本,且提供容错机制,副本丢失或宕机自动恢复,默认存3份;可以运行在廉价的机器上;适合大数据的处理;默认将文件按键值对分割存储 |
单机版安装 | centos6.4,fastDFS5.05 ,libfastcommon1.07 | centos6.4,hadoop2.5.2,jdk8 |
安装部署方式
FastDFS-Java客户端
dependency并没有放置在 maven 仓库;其他仓库不知道有没有,所以需要自己本地打包安装。找到源码地址即可。
原创版:
https://github.com/happyfish100/fastdfs-client-java
改进版:
https://github.com/tobato/FastDFS_Client/
改进的特性,参考其 github 地址的 wiki:
安装步骤:
git clone git@github.com:happyfish100/fastdfs-client-java.git
mvn install
mvn install:install-file -DgroupId=fastdfs_client -DartifactId=fastdfs_client -Dversion=1.27 -Dpackaging=jar -Dfile=fastdfs-client-java-1.27-SNAPSHOT.jar
使用:
新建配置文件:
fdfs_client.conf
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 80
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 192.168.17.112:22122
#tracker_server = 192.168.0.119:22122
https://blog.csdn.net/wzl19870309/article/details/74049204
https://github.com/happ
yfish100/fastdfs-client-java
https://github.com/tobato/FastDFS_Client/
git clone git@github.com:happyfish100/fastdfs-client-java.git
mvn install
mvn install:install-file -DgroupId=fastdfs_client -DartifactId=fastdfs_client -Dversion=1.27 -Dpackaging=jar -Dfile=fastdfs-client-java-1.27-SNAPSHOT.jar