分布式存储分类

通用分布式存储:mogilefs, fastdfs, ...(无文件系统接口, 通过API访问)

专用分布式存储:即分布式文件系统, moosefs, ...(有文件系统接口)

GFS: Google FileSystem,分布式系统的开山鼻祖, 由于Google内部需要遂开发, 后来发布论文公布其技术细节, 但是没有开源,擅长处理单个大文件。

HDFS: Hadoop Distribution FileSystem,GFS的山寨版,擅长处理单个大文件。GFS和HDFS都将元数据存储于内存中, 定期存储在持久存储中,只适合存储百万、千万级别的大文件。

TFS: TaoBao FileSystem,基于HDFS开发 适用于存储海量小文件。

GlusterFS: 去中心化设计, 没有元数据节点。

Ceph: Linux内核级实现的文件系统, 已经收录Linux内核,是一个Linux PB级别的分布式文件系统。

MogileFS: 适用于存储海量小文件, 使用perl语言编写, 国内有人使用C语言重写并开源为FastDFS。

MFS:MooseFS,通用简便,适用于研发能力较弱的公司。

FastDFS是基于互联网应用的开源分布式文件系统,主要解决了大容量的小文件存储和高并发访问的问题,具有轻量级、支持高并发访问、高可扩展性等优点。

FastDFS的架构

FastDFS has two roles: tracker and storage.
The tracker takes charge of scheduling and load balancing for file access.
The storage store files and it's function is file management including: file storing, file syncing, providing file access interface. It also manage the meta data which are attributes representing as key value pair of the file. For example: width=1024, the key is "width" and the value is "1024".

Client通过TrackerServer得到StorageServer的信息,然后直接与StorageServer通信访问文件,避免了TrackerServer成为瓶颈。

TrackerServer类似于GFS中的Master或TFS中的NameServer,但与他们很不同的一点是,TrackerServer的主要作用是负载均衡和调度,而不负责文件索引和映射。TrackerServer在内存中记录分组和StorageServer的状态等信息,不记录文件索引信息,其占用的内存量也很少。TrackerServer可以只有一个,也可以有多个组成TrackerCluster,这样的好处是可以提高对用户的响应能力和增加容灾性,此时各TrackerServer相互对等,冗余备份,由应用端来轮流选择进行访问。

StorageServer完成文件管理的所有功能:存储、同步和提供存取接口,文件和metadata都存储在其上。StorageServer类似于GFS中的ChunkServer或TFS中的DataServer,通常一个StorageServer即一台机器,StorageServer可以动态新增和删除。StorageServer和TrackerServer之间的连接由StorageServer主动发起,StorageServer为每个TrackerServer启动一个线程进行连接和通讯。

FastDFS的存储部分即StorageCluster,分为多个组,每个组中包括多个StorageServer。同一组内的StorageServer之间是对等的,存储的内容相同,起冗余容错的作用。文件上传、下载、删除等操作可在组内任意一台StorageServer上进行。一个组的存储容量取决于该组内最小的StorageServer的容量,因此组内各StorageServer的软硬件配置最好是一致的。采用这种分组的存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到哪个组。当某个组的访问压力较大时,可以在该组内增加StorageServer来扩充服务能力(纵向扩容)。当系统总容量不足时,可以增加组来扩充存储容量(横向扩容)。

不同组的存储服务器之间不会相互通信,同组内的存储服务器之间会相互连接进行文件同步。当文件更新操作发生时,源服务器向目标服务器发起同步,对所有备份文件进行更新。当有新存储服务器加入本组时,由已有的一台存储服务器将其上的所有文件同步给该新增服务器。具体的同步实现在存储服务器中由专门线程根据binlog进行, binlog记录了文件上传、删除等更新操作。
相对于MogileFS,FastDFS具有如下特点和优势:
a)FastDFS完善程度较高,不需要二次开发即可直接使用;
b)和MogileFS相比,FastDFS裁减了跟踪用的数据库,只有两个角色:tracker和storage。FastDFS的架构既简化了系统,同时也消除了性能瓶颈;
c)在系统中增加任何角色的服务器都很容易:增加tracker服务器时,只需要修改storage和client的配置文件(增加一行tracker配置);增加storage服务器时,通常不需要修改任何配置文件,系统会自动将该组中已有文件复制到该服务器; FastDFS比MogileFS更高效。表现在如下几个方面:
a)FastDFS和MogileFS相比,没有文件索引数据库,FastDFS整体性能更高;
b)从采用的开发语言上看,FastDFS比MogileFS更底层、更高效。FastDFS用C语言编写,代码量不到6万行,没有依赖其他开源软件或程序包,安装和部署特别简洁;而MogileFS用perl编写;
c)FastDFS直接使用socket通信方式,相对于MogileFS的HTTP方式,效率更高。并且FastDFS使用sendfile传输文件,采用了内存零拷贝,系统开销更小,文件传输效率更高。
d) FastDFS有着详细的设计和使用文档,而MogileFS的文档相对比较缺乏。
e) FastDFS的日志记录非常详细,系统运行时发生的任何错误信息都会记录到日志文件中,当出现问题时方便管理员定位错误所在。
f) FastDFS还对文件附加属性(即meta data,如文件大小、图片宽度、高度等)进行存取,应用不需要使用数据库来存储这些信息。
g) FastDFS从V1.14开始支持相同文件内容只保存一份,这样可以节省存储空间,提高文件访问性能。
h) FastDFS从V1.18开始支持下载文件时,允许指定文件偏移量和大小(字节数)。

安装FastDFS

1、这里准备三个节点做演示,系统版本为CentOS7.3

192.168.135.170		tracker
192.168.135.171 storage1
192.168.135.169 storage2

2、制作rpm包安装

# git clone https://github.com/happyfish100/libfastcommon.git
# cd libfastcommon/
# less libfastcommon.spec
# mv libfastcommon libfastcommon-1.0.36 # git clone https://github.com/happyfish100/fastdfs.git
# cd fastdfs/
# less fastdfs.spec
# mv fastdfs fastdfs-5.0.10
# tar cvzf fastdfs-5.0.10.tar.gz fastdfs-5.0.10/* # mkdir -pv rpmbuild/{SOURCES,SPECS}
# cp libfastcommon-1.0.36.tar.gz rpmbuild/SOURCES/
# cp libfastcommon-1.0.36/libfastcommon.spec rpmbuild/SPECS/
# rpmbuild -ba rpmbuild/SPECS/libfastcommon.spec
Wrote: /root/rpmbuild/SRPMS/libfastcommon-1.0.36-1.el7.centos.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/libfastcommon-1.0.36-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/libfastcommon-devel-1.0.36-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/libfastcommon-debuginfo-1.0.36-1.el7.centos.x86_64.rpm
# cd rpmbuild/RPMS/x86_64
# yum install -y libfastcommon-1.0.36-1.el7.centos.x86_64.rpm libfastcommon-devel-1.0.36-1.el7.centos.x86_64.rpm # cp fastdfs-5.0.10.tar.gz rpmbuild/SOURCES/
# cp fastdfs-5.0.10/fastdfs.spec rpmbuild/SPECS/
# rpmbuild -ba rpmbuild/SPECS/fastdfs.spec
Wrote: /root/rpmbuild/SRPMS/fastdfs-5.0.10-1.el7.centos.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/fastdfs-5.0.10-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/fastdfs-server-5.0.10-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/fastdfs-tool-5.0.10-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/libfdfsclient-5.0.10-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/libfdfsclient-devel-5.0.10-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/fastdfs-debuginfo-5.0.10-1.el7.centos.x86_64.rpm
# cd rpmbuild/RPMS/x86_64/
# yum install -y fastdfs-5.0.10-1.el7.centos.x86_64.rpm fastdfs-server-5.0.10-1.el7.centos.x86_64.rpm fastdfs-tool-5.0.10-1.el7.centos.x86_64.rpm libfdfsclient-5.0.10-1.el7.centos.x86_64.rpm libfdfsclient-devel-5.0.10-1.el7.centos.x86_64.rpm

3、在tracker节点上,修改tracker的配置文件,并启动服务。

# cd /etc/fdfs/
# cp tracker.conf.sample tracker.conf
# vim tracker.conf
base_path=/var/lib/fastdfs/tracker # mkdir -pv mkdir -pv /var/lib/fastdfs/tracker
# /etc/init.d/fdfs_trackerd start
# netstat -tnlp

4、分别在storage节点上安装rpm包

# scp -r fastdfs-rpms/ 192.168.135.171:/root
# scp -r fastdfs-rpms/ 192.168.135.169:/root
## cd fastdfs-rpms/
# yum install -y *.rpm

5、修改storage的配置文件,并启动服务。

# cd /etc/fdfs/
# cp storage.conf.sample storage.conf
# vim storage.conf
base_path=/var/lib/fastdfs/storage
store_path0=/var/lib/fastdfs/storage/0
tracker_server=192.168.135.170:22122 # scp /etc/fdfs/storage.conf 192.168.135.169:/etc/fdfs/storage.conf
# mkdir -pv /var/lib/fastdfs/storage/0
# /etc/init.d/fdfs_storaged start
# netstat -tnlp

6、在storage节点使用客户端命令fdfs_monitor查看集群状态

# fdfs_monitor /etc/fdfs/storage.conf

7、在tracker节点使用客户端命令fdfs_monitor查看集群状态

# cd /etc/fdfs/
# cp client.conf.sample client.conf
# vim client.conf
base_path=/var/lib/fastdfs/client
tracker_server=192.168.135.170:22122
# mkdir -pv /var/lib/fastdfs/client
# fdfs_monitor /etc/fdfs/client.conf

8、上传一个文件

# fdfs_upload_file -h
# fdfs_upload_file /etc/fdfs/storage.conf /etc/fstab
group1/M00/00/00/wKiHqVjh-7iAZhRiAAACHTZKe1Q2885529

9、查看文件信息

# fdfs_file_info -h
# fdfs_file_info /etc/fdfs/storage.conf group1/M00/00/00/wKiHqVjh-7iAZhRiAAACHTZKe1Q2885529
source storage id: 0
source ip address: 192.168.135.169
file create timestamp: 2017-04-03 03:37:28
file size: 541
file crc32: 910850900 (0x364A7B54)

10、下载一个文件

# fdfs_download_file -h
Usage: fdfs_download_file <config_file> <file_id> [local_filename]
# cd /tmp/
# fdfs_download_file /etc/fdfs/storage.conf group1/M00/00/00/wKiHqVjh-7iAZhRiAAACHTZKe1Q2885529 fstab

FastDFS分布式存储的更多相关文章

  1. FastDFS分布式存储实战

    <FastDFS分布式存储实战> 技术选型 FastDFS相关组件及原理 FastDFS介绍 FastDFS架构 FastDFS工作流程 上传 同步机制 下载 文件合并原理 实验环境说明 ...

  2. Linux下FastDFS分布式存储-总结及部署记录

    一.分布式文件系统介绍分布式文件系统:Distributed file system, DFS,又叫做网络文件系统:Network File System.一种允许文件通过网络在多台主机上分享的文件系 ...

  3. Linux - 搭建FastDFS分布式文件系统

    1. FastDFS简介 说明:FastDFS简介部分的理论知识全部来自于博主bojiangzhou的 <用FastDFS一步步搭建文件管理系统>,在此感谢博主的无私分享.当然最最要感谢的 ...

  4. 分布式文件存储:FastDFS简单使用与原理分析

    引言 FastDFS 属于分布式存储范畴,分布式文件系统 FastDFS 非常适合中小型项目,在我接手维护公司图片服务的时候开始接触到它,本篇文章目的是总结一下 FastDFS 的知识点. 用了 2 ...

  5. Linux运维企业架构实战系列

    Linux运维企业架构项目实战系列 项目实战1-LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2-LVS.nginx实现负载均衡系列 2.1 项目实战2.1-实现基于LVS负载均衡集 ...

  6. Linux运维企业架构项目实战系列

    Linux运维企业架构项目实战系列 项目实战1—LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2—LVS.nginx实现负载均衡系列2.1 项目实战2.1—实现基于LVS负载均衡集群 ...

  7. 使用Python3.7+Tornado5.1配合七牛云存储api来异步切分上传文件

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_123 之前写了几篇关于FastDfs分布式存储的文章:python3.7.3操作FastDfs来进行文件操作,其实市面上关于云存储 ...

  8. 项目实战9—企业级分布式存储应用与实战MogileFS、FastDFS

    企业级分布式存储应用与实战-mogilefs 环境:公司已经有了大量沉淀用户,为了让这些沉淀用户长期使用公司平台,公司决定增加用户粘性,逐步发展基于社交属性的多样化业务模式,决定开展用户讨论区.卖家秀 ...

  9. 企业级分布式存储应用与实战FastDFS实现

    FASTDFS是什么 FastDFS是由国人余庆所开发,其项目地址:https://github.com/happyfish100 FastDFS是一个轻量级的开源分布式文件系统,主要解决了大容量的文 ...

随机推荐

  1. MySQL基础(一)

    首先需要安装MySOL,这里我是在windows环境下安装的,具体教程可以参考https://www.cnblogs.com/xsmile/p/7753984.html,不过要注意安装过程可能会不太顺 ...

  2. Rabbitmq安装及启动 MAC系统

    1.安装 brew install rabbitmq 2.启动及关闭RabbitMQ服务 前台启动 sudo ./rabbitmq-server    或 sudo su/usr/local/Cell ...

  3. JAVA开发环境的熟悉

    北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1352 姓名:马悦 学号:20135235 成绩: 指导教师:娄嘉鹏 实验日期:2015.4.13 实验密级: 预习程度 ...

  4. 软工1816 · Beta冲刺(2/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 完成考试 确定历史记录页面与排行榜页面的前端页面风格 接下来的计划 & ...

  5. 第一个spring冲刺总结

    讨论成员:罗凯旋.罗林杰.吴伟锋.黎文衷 第一阶段总体是做到了运算的功能,只是一些基本的功能实现,包括APP进入动画,以及界面的基本效果设计,还有核心算法已经实现(可以计算括号 乘除法等等)“: 燃尽 ...

  6. C#简单窗体应用程序(一)

    使用C#创建控制台应用程序的基本步骤: (1)创建项目: (2)用户界面设计: (3)属性设置: (4)编写程序代码: (5)保存.调试.运行: 例题:创建一个Windows窗体应用程序,在窗体中添加 ...

  7. Unity3D游戏开发——访问集中式共享模块的设计模式

    什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.设计模式是开发人员在开发过程中面临的一般问题的解决方案,这些解决方案是众多开发人 ...

  8. 解决tomcat登录需要给角色授权

    1:编辑/usr/local/tomcat/conf/tomcat-users.xml文件,在没有注释的内容中添加: <role rolename="manager-gui" ...

  9. git add -A 和 git add . 的区别

    git add -A和 git add .   git add -u在功能上看似很相近,但还是存在一点差别 git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文 ...

  10. ubuntu 中安装memcache,并给出一个简单的实例·

    Memcache分为两部分,Memcache服务端和客户端.Memcache服务端是作为服务来运行的,所有数据缓存的建立,存储,删除实际上都是在这里完成的.客户端,在这里我们指的是PHP的可以调用的扩 ...