首页天道酬勤开源分布式存储系统,分布式存储ipfs

开源分布式存储系统,分布式存储ipfs

张世龙 05-12 14:33 118次浏览

分布式存储已经研究了很多年,但直到近年来,随着谷歌、亚马逊、阿里等互联网企业云计算和大数据APP应用的兴起,它已被大规模应用于工程实践。 谷歌的分布式文件系统GFS、分布式表系统google Bigtable、亚马逊的对象存储AWS、蚂蚁的TFS等都是很有代表性的,同时ceph、swift、Lustre、glusterfs等优秀的对象

分布式存储系统分布式存储根据存储接口的不同分为三类:文件存储、块存储和对象存储。

文件存储通常支持POSIX接口,如glusterfs,但GFS和HDFS是非POSIX接口。 可以像ext4等常规文件系统一样进行访问,但与常规文件系统相比,访问并行化的能力和冗馀性更高。 的主要分布式文件存储系统包括TFS、cephfs、glusterfs和HDFS。 主要存储非结构化数据,如普通文件、图像、音视频等。 可以通过NFS和CIFS等协议访问,共享方便。 NAS是文件存储类型。

名为块存储的接口通常作为qemu驱动程序或Kernel Module存在,主要通过qemu或iscsi协议访问。 的主要块存储系统包括ceph块存储、sheepdog等。 主要用于存储结构化数据,如数据库数据。 不方便共享数据。 DAS和SAN都是块存储类型。

目标存储对象存储系统整合了NAS和SAN的优势,并提供了SAN高速直接访问和NAS数据共享等优势。 经常将对象作为基本存储单元,向外部提供rest风格的数据读写接口,以网络服务的形式提供数据访问。 的主要对象存储系统包括AWS、swift和ceph对象存储。 主要用于存储非结构化数据。

Glusterfs Glusterfs是一个开源分布式文件系统,具有数Pb的存储容量和强大的向外扩展功能,支持数千个客户端。 通过Infiniband RDMA或Tcp/Ip将许多便宜的x86主机通过网络互连到一个并行网络文件系统。 具有可扩展性、高性能、高可用性等特点。

如图所示,GlusterFS采用了可堆栈的用户空间设计。

glusterfs堆栈结构glusterfs是基于用户的文件系统,基于fuse提供的接口实现,主要有gluster、glusterd、glusterfs和glusterfsd四个模块

gluster:CLI命令执行工具,主要功能是分析命令行参数,然后将命令发送到glusterd模块进行执行。 glusterd:是一个管理模块,用于处理gluster发送的命令,包括群集管理、存储池管理、积木管理、负载平衡和快照管理。 群集信息、存储池信息、快照信息等作为配置文件存储在服务器上,当客户端装载存储器时,glusterd会将存储池配置文件发送给客户端。 glusterfsd—在服务端模块中,存储池中的每个brick都将启动glusterfsd过程。 此模块主要处理客户端的读/写请求,从关联brick所在的磁盘读/写数据,然后将数据返回给客户端。 glusterfs装载用于装载群集中某台服务器的存储池并将其作为目录呈现给用户的客户端模块。 当用户从此目录读取数据或从中写入数据时,客户机将根据从glusterd模块获取的存储池配置文件信息,使用DHT算法计算文件所在的服务器的brick位置,然后使用Infiniband RDMA 的存储池副本、条带、散列和EC等逻辑都由客户端处理。 在使用glusterfs提供的存储服务之前,必须首先装载存储池并将数据写入装载点。 它通过fuse内核模块传递到客户端,客户端检查存储池类型,计算数据所在的服务器,然后通过套接字或rdma与服务器通信。 如图2所示,如下所示。

glusterfs模块关系图glusterfs作为开源分布式文件系统,在开源社区的活跃程度较高,目前已被红帽收购,国内外也有很多用户进行研究和应用,相关技术文件丰富。 并不完美。 为了支持线性扩展和高性能,我们在较小的文件性能和元数据性能方面做出了让步,但它可以处理某些场景,如大数据APP应用程序和视频存储。

接下来,从优点和缺点两个方面介绍glusterfs。

优点

没有元数据节点的性能瓶颈采用非中心对称的体系结构,没有专用的元数据服务,也没有元数据服务瓶颈。 元数据存在于文件的属性和扩展属性中。 如果需要访问某个文件,则客户机使用DHT算法根据文件的路径和文件名计算文件的位置,然后客户机从该brick获取数据,从而省去与元数据服务器通信的过程。

良好的可扩展性使用灵活的散列算法代替传统的元数据节点服务,可以获得接近线性的高可扩展性。

高可用性采用副本、EC等冗馀设计,保证冗馀范围内的节点脱机时仍可从其他服务节点获取数据,保证高可用性。 在弱一致性设计中,当文件写入副本时,客户端计算文件所在的brick,然后通过网络将数据传递给所在的brick。 如果其中一个恢复正常,则数据将被视为已成功写入,无需等待其他brick返回。 这样可以防止一个brick在某个节点的网络异常或磁盘损坏时因未成功写入而等待写入。

服务器端随着存储池的启动

开启一个glustershd进程,这个进程会定期检查副本和EC卷中各个brick之间数据的一致性,并恢复。

存储池类型丰富包括粗粒度、条带、副本、条带副本和EC,可以根据用户的需求,满足不同程度的冗余。粗粒度卷不带任何冗余,文件不进行切片,是完整的存放在某个brick上。

条带卷不带任何冗余,文件会切片存储(默认大小为128kB)在不同的brick上。这些切片可以并发读写(并发粒度是条带块),可以明显提高读写性能。该模式一般只适合用于处理超大型文件和多节点性能要求高的情况。

副本卷冗余度高,副本数量可以灵活配置,可以保证数据的安全性。

条带副本卷是条带卷和副本卷的结合。

EC卷使用EC校验算法,提供了低于副本卷的冗余度,冗余度小于100%,满足比较低的数据安全性,例如可以使2+1(冗余度为50%)、5+3(冗余度为60%)等。这个可以满足安全性要求不高的数据。

高性能采用弱一致性的设计,向副本中写数据时,只要有一个brick成功返回,就认为写入成功,不必等待其它brick返回,这样的方式比强一致性要快。

还提供了I/O并发、write-behind、read-ahead、io-cache、条带等提高读写性能的技术。并且这些都还可以根据实际需求进行开启/关闭,i/o并发数量,cache大小都可以调整。

缺点

扩容、缩容时影响的服务器较多Glusterfs对逻辑卷中的存储单元brick划分hash分布空间(会以brick所在磁盘大小作为权重,空间总范围为0至232-1),一个brick占一份空间,当访问某文件时,使用Davies-Meyer算法根据文件名计算出hash值,比较hash值落在哪个范围内,即可确定文件所在的brick,这样定位文件会很快。但是在向逻辑卷中添加或移除brick时,hash分布空间会重新计算,每个brick的hash范围都会变化,文件定位就会失败,因此需要遍历文件,把文件移动到正确的hash分布范围对应的brick上,移动的文件可能会很多,加重系统负载,影响到正常的文件访问操作。

遍历目录下文件耗时Glusterfs没有元数据节点,而是根据hash算法来确定文件的分布,目录利用扩展属性记录子卷的中brick的hash分布范围,每个brick的范围均不重叠。遍历目录时,需要readdir子卷中每个brick中的目录,获取每个文件的属性和扩展属性,然后进行聚合,相对于有专门元数据节点的分布式存储,遍历效率会差很多,当目录下有大量文件时,遍历会非常缓慢。

删除目录也会遇到同样的问题。

目前提供的解决方法是合理组织目录结构,目录层级不要太深,目录下文件数量不要太多,增大glusterfs目录缓存。另外,还可以设计把元数据和数据分离,把元数据放到内存数据库中(如redis、memcache),并在ssd上持久保存。

小文件性能较差Glusterfs主要是为大文件设计,如io-cache、read-ahead、write-behind和条带等都是为优化大文件访问,对小文件的优化很少。

Glusterfs采用无元数据节点的设计,文件的元数据和数据一起保存在文件中,访问元数据和数据的速率相同,访问元数据的时间与访问数据的时间比例会较大,而有元数据中心的分布式存储系统,对元数据服务器可以采用更快速的ssd盘,可以采用更大的元数据缓存等优化措施来减小访问元数据时间与访问数据时间的比值,来提高小文件性能。

Glusterfs在客户端采用了元数据缓存md-cache来提高小文件性能,但是md-cache大小有限,但在海量小文件场景下,缓存命中率会严重下降,优化效果会减小,这就需要增大元数据缓存。

针对小文件性能差的问题,也可以参考TFS的做法, TFS会将大量的小文件合并成一个大文件,这个大文件称为Block,每个Block拥有在集群内唯一的编号(Block Id),Block Id在NameServer创建Block时分配,NameServer维护block与DataServer(存储Block的实际数据)的关系。

dellemc待遇怎么样,vega 解析