分布式存储综述与方案选型

news2025/1/17 3:14:43

文章目录

    • 引言
    • 基本诉求
    • 存储选型考虑的要素
    • 分布式存储的野蛮生长史
    • 主要开源选型
      • GFS(Google File System)
      • HDFS (Hadoop Distributed File System)
      • minio
      • ceph
      • TFS
      • Swift
      • fastDFS
      • GridFS
      • MooseFS
      • GlusterFS
      • MogileFS
    • 一些国产的xFS
      • 阿里
      • 腾讯
      • 百度
      • 京东
      • 网易
      • 字节跳动
      • 美团
      • 滴滴
    • 结论
      • 数据库选型
      • 分布式存储选型参考
    • 参考链接

引言

当我想自己搭建一个图片服务器时,举手投足,放眼望去,只见技术多如牛毛,不禁拔剑四顾心茫然。如果用阿里云的oss或者七牛,自然不在话下。但如果我不想掏钱呢,用哪些开源组件比较好?于是,不得不坐下来,回顾起一段分布式存储波澜壮阔的发展历程。

主流的开源方案: Ceph,minio, GlusterFS, Sheepdog,Lustre, Swift,Cinder, TFS, HDFS,MooseFS, FastDFS, MogileFS

基本诉求

我个人的需求:

  • 性能比直接读取文件系统要快
  • 支持分布式
  • 支持小而大量的图片存储,也希望支持10M~100M之间的电子文档如PDF的存储,不知道二者是否有冲突
  • 有简洁的控制台,易于监控
  • 方便备份,导入导出

其它高级需求:

  • 高性能:主要考虑500M以内的小文件,特别是10M以内的文件; 如果是存储海量数据呢?
  • 安全性和可靠性/容错性高、数据万无一失:要考虑各种极端情况,包括网络异常,服务器断电,磁盘损坏
  • 资源占用较小、运行稳定
  • 高可用、支持集群、支持多活
  • 支持平滑的扩容
  • 较高的并发

美好的图景:
在这里插入图片描述

存储选型考虑的要素

  • 用户量:用户量预估多少?几百几万还是几亿?
  • 数据量:数据量预估多少?日均增量能有多少?
  • 读写偏好:数据是读多一些还是写多一些?
  • 数据场景:强事务型还是分析型需求?
  • 运行性能要求:并发量是多少?高峰、平均、低谷分别预估是多少?

分布式存储的野蛮生长史

分布式存储的发展历程
几个主要阶段:

  • 1980s的网络文件系统
  • 1990s的共享SAN文件系统
  • 2000s的面向对象并行文件系统
  • 2010s的云文件系统

自2003年Google发布分布式文件系统GFS论文以来,陆续出现许多面向不同场景的分布式文件存储(包括对象存储,块存储),大部分仍然是沿袭GFS的架构,在此基础上完善增强,也有少部分系统是另辟蹊径,走了别的道路,这两条路径上都有比较成功的产品。

主要开源选型

先上对比:
在这里插入图片描述

GFS(Google File System)

Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统。尽管Google公布了该系统的一些技术细节,但Google并没有将该系统的软件部分作为开源软件发布。
在这里插入图片描述

HDFS (Hadoop Distributed File System)

Aapche Hadoop架构是MapReduce算法的一种开源应用。Hadoop 实现了一个分布式文件系统,简称HDFS。 Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。它起源于Apache Nutch。

HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。
Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。

集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。

Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

Secondary NameNode的功能主要是辅助NameNode,分担其工作量;在紧急情况下可以辅助恢复NameNode,但是它不能替换NameNode并提供服务。

HDFS上的一个典型文件大小一般都在G字节至T字节。因此,HDFS可以支持大文件存储。它应该能提供整体上高的数据传输带宽,能在一个集群里扩展到数百个节点。一个单一的HDFS实例应该能支撑数以千万计的文件。
在这里插入图片描述

在这里插入图片描述
再贴一张图片加深理解:
在这里插入图片描述
HDFS的优势在于:
1.容错性:数据自动保存多个副本。通过增加副本的形式,提高容错性。其中一个副本丢失以后,可以自动恢复。
2.可以处理大数据:能够处理数据规模达到GB、TB甚至PB级别的数据;能够处理百万规模以上的文件数量。
3.可以构建在廉价的机器上,通过多副本机制,提高可靠性。
缺点:
1.不适合低延时数据访问:比如毫秒级的存储数据,是做不到的。
2.无法高效对大量小文件进行存储:存储大量小文件的话,它会占用 NameNode 大量的内存来存储文件目录和块信息。这样是不可取的,因为 NameNode的内存总是有限的。同时,小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。
3.不支持并发写入、文件随机修改:一个文件只能有一个写,不允许多个线程同时写。仅支持数据 append(追加),不支持文件的随机修改。

minio

Minio是一个用Golang开发的基于Apache License v2.0开源协议的对象存储服务。MinIO 是世界上最快的对象存储服务器,在标准硬件上,读写速度分贝为 183GB/s 和 171GB/s,对象存储可以作为主要存储层,用于 Spark,Presto,TensorFlow,H20.ai 以及替代产品等各种工作负载用于 Hadoop HDFS。

Minio是一个开源的分布式文件存储系统,它基于 Golang 编写,虽然轻量,却拥有着不错的高性能,可以将图片、视频、音乐、pdf这些文件存储到多个主机,可以存储到多个Linux,或者多个Windows,或者多个Mac,Minio中存储最大文件可以达到5TB。

MinIO 是一种高性能的分布式对象存储系统,它是软件定义的,可在行业标准硬件上运行,并且在 Apache 2.0 许可下,百分百开放源代码。
MinIO是兼容Amazon S3的,换句话说,MinIO可以伪装成Amazon S3,你可以用Amazon S3的SDK操作MinIO。
在这里插入图片描述
多副本,优点是写入效率高,无需多余的计算,直接存多份即可,数据恢复快,从副本复制就好了。缺点就是存储效率低、占用空间以前需要的磁盘容量直接%20X2%20或者%20X3%20倍了。

ceph

Ceph是去中心化的分布式解决方案,一个可以按对象/块/文件方式存储的开源分布式文件系统。其设计之初,就将单点故障作为首先要解决的问题,因此该系统具备高可用性、高性能及可 扩展等特点。该文件系统支持目前还处于试验阶段的高性能文件系统BTRFS(B-Tree文件系统),同时支持按OSD方式存储,因此其性能是很卓越的, 因为该系统处于试商用阶段,需谨慎引入到生产环境。
优点:

1)支持对象存储(OSD)集群,通过CRUSH算法,完成文件动态定位, 处理效率更高

2)支持通过FUSE方式挂载,降低客户端的开发成本,通用性高

3)支持分布式的MDS/MON,无单点故障

4)强大的容错处理和自愈能力5)支持在线扩容和冗余备份,增强系统的可靠性
在这里插入图片描述
Ceph支持对象存储、块存储和文件存储服务,故称为统一存储。
Ceph的缺点
1.去中心化的分布式解决方案,需要提前做好规划设计,对技术团队的要求能力比较高。
2.Ceph扩容时,由于其数据分布均衡的特性,会导致整个存储系统性能的下降。

TFS

TFS(Taobao File System)是由淘宝开发的一个分布式文件系统,其内部经过特殊的优化处理,适用于海量的小文件存储,目前已经对外开源;
在这里插入图片描述

Swift

swift于2008年起步,最初是由Rackspace公司开发的分布式对象存储服务, 2010 年贡献给 OpenStack 开源社区。现如今已部署到大规模公有云的生产环境中使用。
优点在于:极高的数据持久性和完全对称的系统架构、无限的可扩展性。缺点在于原生的对象存储,不支持实时的文件读写、编辑功能。

fastDFS

FastDFS是国人开发的一款分布式文件系统,目前社区比较活跃。如上图所示系统中存在三种节点:Client、Tracker、Storage,在底层存储上通过逻辑的分组概念,使得通过在同组内配置多个Storage,从而实现软RAID10,提升并发IO的性能、简单负载均衡及数据的冗余备份;同时通过线性的添加新的逻辑存储组,从容实现存储容量的线性扩容。

文件下载上,除了支持通过API方式,目前还提供了apache和nginx的插件支持,同时也可以不使用对应的插件,直接以Web静态资源方式对外提供下载。

目前FastDFS(V4.x)代码量大概6w多行,内部的网络模型使用比较成熟的libevent三方库,具备高并发的处理能力。
FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。在UC基于FastDFS开发向用户提供了:网盘,社区,广告和应用下载等业务的存储服务。

FastDFS是一款开源的轻量级分布式文件系统纯C实现,支持Linux、FreeBSD等UNIX系统类google FS,不是通用的文件系统,只能通过专有API访问,目前提供了C、Java和PHP API为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性FastDFS可以看做是基于文件的key value pair存储系统,称作分布式文件存储服务更为合适。
在这里插入图片描述

GridFS

GridFS是基于mongodb存储引擎是实现的“分布式文件系统”,底层基于mongodb存储机制,和其他本地文件系统相比,它具备大数据存储的多个优点。GridFS适合存储超过16MB的大型文件。
GridFS并不是将单个文件直接存储为一个document,而是将文件分成多个parts或者说chunks,然后将每个chunk作为作为一个单独的document存储,然后将chunks有序保存。默认情况下,GridFS的chunk大小位255k。GridFS使用2个collections来存储这些文件,一个collection存储文件的chunks(实际文件数据),另一个则存储文件的metadata(用户自定义的属性,filename,content-type等)。

当用户查询GridFS中的文件时,客户端或者driver将会重新按序组装这些chunks。用户可以range查询文件,也可以获取文件的任意部分的信息,比如:跳过(skip)视频或者音频(任何文件)的中间部,实现“range access of single file”。

对于mongodb而言,每个document最大尺寸为16M,如果想存储一条数据(比如一个文件)超过16M,那么只能使用GridFS支持;GridFS可以支持单个文件尺寸达到数G,读取文件时可以分段读取。此外,GridFS可以从Mongodb的高性能、高可用特性中获益,比如我们可以在“replica set”或者“sharding”架构模式下使用GridFS。

优点:

  • 能够简化技术栈,如果已经使用了MongoDB,那么使用GridFS,就不需要其它独立的存储工具了。
  • GridFS会自动平衡已有的复制,或者为MongoDB设置的自动分片,所以对文件存储做故障转移或者是横向扩展会更容易 。
  • GridFS的功能不错,能自动解决一些其他文件系统遇到的问题,如在同一个目录下存储大量的文件。

缺点:

  • 性能较低,不如直接访问文件系统快。

MooseFS

MooseFS是一个高可用的故障容错分布式文件系统,它支持通过FUSE方式将文件挂载操作,同时其提供的web管理界面非常方便查看当前的文件存储状态。
MooseFS文件系统由四部分组成:Managing Server 、Data Server 、Metadata Backup Server 及Client。

GlusterFS

GlusterFS是Red Hat旗下的一款开源分布式文件系统,它具备高扩展、高可用及高性能等特性,由于其无元数据服务器的设计,使其真正实现了线性的扩展能力,使存储总容量可 轻松达到PB级别,支持数千客户端并发访问;对跨集群,其强大的Geo-Replication可以实现集群间数据镜像,而且是支持链式复制,这非常适用 于垮集群的应用场景。
特性

1)目前GlusterFS支持FUSE方式挂载,可以通过标准的NFS/SMB/CIFS协议像访问本体文件一样访问文件系统,同时其也支持HTTP/FTP/GlusterFS访问,同时最新版本支持接入Amazon的AWS系统

2)GlusterFS系统通过基于SSH的命令行管理界面,可以远程添加、删除存储节点,也可以监控当前存储节点的使用状态

3)GlusterFS支持集群节点中存储虚拟卷的扩容动态扩容;同时在分布式冗余模式下,具备自愈管理功能,在Geo冗余模式下,文件支持断点续传、异步传输及增量传送等特点

MogileFS

Perl语言开发的,依赖数据库,Trackers(控制中心):负责读写数据库,作为代理复制storage间同步的数据。
Database:存储源数据(默认mysql)
Storage:文件存储。
除了API,可以通过与nginx集成,对外提供下载服务

一些国产的xFS

阿里

阿里云自研盘古存储平台,包括分布式文件系统(DFS),块存储(ECS云盘),对象存储 (OSS)。另外PolarDB依赖的高性能分布式文件系统PolarFS。

腾讯

自研Ozone是Apache Hadoop社区推出的新一代分布式存储系统,能满足大量小文件的存储问题, 解决Hadoop分布式文件系统在可扩展性上的缺陷,并支持百亿甚至千亿级文件规模的存储。

百度

早期百度分布式文件系统使用MooseFS,在此基础上研发了CCDB-NFS,解决MFS的问题,而后自研分布式文件系统BFS。

京东

京东自研分布式文件存储chubaoFS,整体性能优于Ceph,内部基于RDMA,SPDK等技术进行性能优 化(这部分没有开源),整体性能接近PolarFS,目前已经服务ES和MySQL数据库。

网易

自研分布式块存储Curve,整体性能优于Ceph。

字节跳动

字节之前使用Ceph,后来(2018年以后)自研分布式文件存储(刚刚起步)。

美团

美团云自研分布式对象存储MetaDenvB。 美团云自研分布式块存储Ursa。

滴滴

滴滴使用开源存储Ceph,并在此基础上深度优化。

结论

数据库选型

数据类型常见数据库
关系型MySQL、Oracle、DB2、PostgreSQL
非关系型Hbase、Redis、MongodDB
行式存储MySQL、Oracle、DB2、SQLServer
列式存储Hbase、ClickHouse
分布式存储Cassandra、Hbase、MongodDB
键值存储Memcached、Redis、MemcacheDB
图形存储Neo4J、TigerGraph
文档存储MongoDB、CouchDB

分布式存储选型参考

  • 适合做通用文件系统的有:Ceph,Lustre,MooseFS,GlusterFS;
  • 适合做小文件存储的文件系统有:Ceph,MooseFS,MogileFS,FastDFS,TFS;
  • 适合做大文件存储的文件系统有:HDFS,Ceph,Lustre,GlusterFS,GridFS;
  • 轻量级文件系统有:MooseFS,FastDFS;
  • 简单易用,用户数量活跃的文件系统有:MooseFS,MogileFS,FastDFS,GlusterFS;
  • 支持FUSE挂载的文件系统有:HDFS,Ceph,Lustre,MooseFS,GlusterFS。

参考链接

  • GridFS,MongoDB的一部分
  • FastDFS
  • TFS
  • SeaweedFS(https://github.com/chrislusf/seaweedfs)
  • HBASE(HDFS)
  • Ceph
  • MooseFS(https://moosefs.com/)
  • GlusterFS(http://www.gluster.org/)
  • MinIO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础之《netty(21)—WebSocket长连接开发》

一、实例要求 1、http协议是无状态的&#xff0c;浏览器和服务器间的请求响应一次&#xff0c;下一次会重新创建连接 2、要求&#xff1a;实现基于webSocket的长连接的全双工的交互 3、改变http协议多次请求的约束&#xff0c;实现长连接了&#xff0c;服务器可以发送消息给浏…

Go第 10 章 :面向对象编程(上)

Go第 10 章 &#xff1a;面向对象编程(上) 10.1 结构体 10.1.1 看一个问题 10.1.2 使用现有技术解决 单独的定义变量解决 代码演示&#xff1a; 使用数组解决 代码演示&#xff1a; 10.1.3 现有技术解决的缺点分析 使用变量或者数组来解决养猫的问题&#xff0c;不利于数…

AI与艺术——图像生成网络经典算法

生成模型是一种训练模型进行无监督学习的模型&#xff0c;即&#xff0c;给模型一组数据&#xff0c;希望从数据中学习到信息后的模型能够生成一组和训练集尽可能相近的数据。图像生成&#xff08;Image generation&#xff0c;IG&#xff09;则是指从现有数据集生成新的图像的…

代码块和执行顺序

1、什么是代码块 使用{}定义的一段代码我们称之为代码块 一般分为&#xff1a; 1. 普通代码块 2. 实例代码块 3. 静态代码块 2、普通代码块 定义在方法中的代码块&#xff0c;可以用于限定局部变量的生命周期。 public class Main{public static void main(String[] args) {{…

【分享】百度更喜欢自媒体站,9种方法让你轻松玩转微博营销

微博营销是指通过微博平台为商家、个人等创造价值而执行的一种营销方式。 以下九种方式&#xff0c;你一定要学习一下&#xff0c;视频最后&#xff0c;有干货。 1、注重价值的传递 企业博客经营者首先要改变观念——企业微博的“索取”与“给予”之分&#xff0c;企业微博是…

2023你冲不冲,冲冲冲冲~~

前言&#xff1a;\textcolor{Green}{前言&#xff1a;}前言&#xff1a; &#x1f49e;2022已经成为历史&#xff0c;趁着还没有遗忘来看看我这一年发生了什么事。 在这一年中有很多的收获也有一些遗憾&#xff0c;但是这不会让我停下来&#xff0c;未来的2023又会发生什么&…

ArcGIS 中的 7 种主要地理处理工具

地理处理工具可以提高人们的工作效率&#xff0c;并且这些工具可以批量应用于编辑&#xff0c;例如应用于所有功能或所有选定功能。本文将和大家一起探讨 7 个 ArcGIS 中的地理处理工具。 地理处理的用途 模型中的地理处理工具可解决许多空间完整性的问题&#xff0c;应用地理…

分布式缓存系统 Ignite、Hazelcast、Ehcache

一、Apache IgniteApache Ignite是一个以内存为中心的分布式数据库、缓存和处理平台&#xff0c;支持事务、分析以及流式负载&#xff0c;可以在PB级数据上享有内存级的性能。如果禁用原生持久化&#xff0c;Ignite就是一个分布式缓存&#xff0c;它实现了JCache规范&#xff0…

深入解析Linux虚拟化KVM-Qemu分析之中断虚拟化

说明&#xff1a; KVM版本&#xff1a;5.9.1QEMU版本&#xff1a;5.0.0工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 本文会将ARM GICv2中断虚拟化的总体框架和流程讲清楚&#xff0c;这个曾经困扰我好几天的问题在被捋清的那一刻&#xff0c;让我有点每有…

JsonUtility读写json简单应用

使用Unity提供的JsonUtility 简单封装了一个将数据以json格式存储到本地,方便数据读写的案例;一共三个脚本:MyJsonRW : 提供SaveJsonData和LoadWithJson,实现数据与json的转换和读写;TestData : 测试数据类,列举了部分常用的简单数据类型(不过有坑,后面会说);MyJsonExample : 例…

新诤信张强—兔年展望|2023-2025:看风的必不撒种、望云的必不收割

新诤信知识产权服务股份有限公司 首席技术官 张强 “看风的必不撒种、望云的必不收割”出自古老的犹太智慧书《传道书》&#xff0c;意思是&#xff0c;如果要等刮风才撒种&#xff0c;快要下雨才收割&#xff0c;一切就都来不及了。元宇宙的发展布局&#xff0c;也是这个道理…

基础算法[四]之图的那些事儿

文章目录前言图的表示邻接矩阵邻接表结构存储遍历路径搜索多源最短路问题问题描述Floyd实现模板单源最短路径问题Dijkstra算法朴素版本堆优化邻接表python实现Bellman-Ford 算法实现SPFA 算法实现python 版本判断负环小结最小生成树Prim算法Kruskra算法实现python版本二分图二分…

网络资源归档标准WARC介绍

WARC---Web ARChive 01 ● WARC格式概述 ● WARC&#xff08;Web ARChive&#xff09;格式是网络资源存档中使用的常见文件格式&#xff0c;全称为Web Archive File Format&#xff0c;由互联网保存联盟&#xff08;International Internet Preservation Consortium&#xff0…

2023年1月6日星期五-PPP/BPP相关学习

独立均匀分布matlab的rand指令可以帮助我们生成[0,1]的均匀分布的数据,这样,如果我们想要[a,b]的分布数据,只需要a+(b-a)*rand就可以了。 [a,b] 均值,标准差 均值

Git 常用基本命令

文章目录基本命令仓库相关命令提交相关命令分支相关命令tag 相关命令撤销相关命令IDEA Git 相关操作仓库相关操作提交相关操作提交代码步骤分支相关操作tag 相关操作撤销相关操作参考资料本文主要介绍 Git 常用的基本命令。基本命令 仓库相关命令 创建新仓库 git init克隆项…

C#,图像二值化(15)——全局阈值的一维最大熵(1D maxent)算法及源程序

1、最大熵&#xff08;maxent&#xff09; 最大熵&#xff08;maxent&#xff09;方法植根于信息理论&#xff0c;并已成功应用于许多领域&#xff0c;包括物理学和自然语言处理。它创建了一个模型&#xff0c;该模型最好地解释了可用数据&#xff0c;但有一个约束&#xff0c…

甘特图中的依赖关系是什么?

依赖关系是甘特图应用中常见的概念。甘特图依赖关系也称为任务依赖关系&#xff0c;它是指项目任务之间的关系&#xff0c;需要按特定顺序执行一个或多个任务才能完成某项任务&#xff0c;依赖于完成前一任务的任务是后继任务&#xff0c;而其依赖的任务是前导任务。依赖关系一…

字典特征提取、文本特征提取、jieba分词处理、tf-idf文本特征提取概念及代码实现

一、特征提取 特征提取&#xff1a;将任意数据&#xff08;如文本或图像&#xff09;转换为可用于机器学习的数字特征&#xff0c;特征值化是为了计算机更好的去理解数据 特征提取api&#xff1a;sklearn.feature_extraction 特征提取分类 字典特征提取(特征离散化)文本特征…

小蓝本 第一本《因式分解技巧》 第九章 待定系数法 笔记 (第九天)

小蓝本 第一本《因式分解技巧》 第九章 待定系数法 笔记 &#xff08;第九天&#xff09;前言待定系数法二次因式一次因式分解缺陷二次因式分解方法注意既约的情况拓展习题9题目题解前言 已经进行了9天&#xff0c;第八章有一点烧脑&#xff0c;但感觉还是很不错的&#xff0c…

Python类继承:深入了解

引言 前段时间刚好学习了&#xff0c;C中类方面的内容&#xff0c;发现和Python中有许多不同之处&#xff0c;尤其是在类的继承这一块&#xff0c;今天有空&#xff0c;正好写篇文章&#xff0c;记录一下有兴趣的东西&#xff0c;也算是对Python的一个复习。 1 C中的构造析构函…