1.1 分布式与文件系统

互联网的发展日新月异,每天产生的各种数据爆炸式增长,下面是来自一些重要领域的统计数据。

• 到2025年,全球数据领域将有175ZB的数据(来自Seagate UK)。

• Google、Facebook、Microsoft和Amazon至少存储了1200PB的信息(来自Science Focus)。

• 截至2020年7月,全球互联网用户超过48亿(来自Internet World Stats)。

• 截至2020年3月,字节跳动拥有近10亿固定用户(来自维基百科)。

• Google每年处理1.2万亿次搜索(来自Internet Live Stats)。

• 全世界每分钟在Internet上的购物花费近100万美元(来自Visual Capitalist)。

• 2020年,全球每天发送和接收的电子邮件大约为3064亿封(来自Statista)。

• Youtube每天有近50亿个视频被观看(来自Fortune Lords)。

• 2019年,全球网民每分钟观看近695000小时的Netflix的内容(来自Visual Capitalist)。

• 每24小时,Twitter上就会发布5亿条推文(来自Internet Live Stats)。

• 到2025年,将有750亿台物联网设备(来自Finances OnLine)。

不仅数据量庞大,而且数据的形式多种多样,有音视频、图片、文字,甚至还有最基础的二进制内容,因此如何安全、高效地存储及访问这些数据显得尤为重要。同时还应该考虑存储的兼容性及前瞻性,因为数据还在持续增长。

当前存储数据的介质产品非常丰富。例如,单台机器就能轻松存储数十TB数据,不过使用单机存储数据存在以下不足。

• 容量大小受限,存在存储上限。

• 访问受限,通常只能允许数十个用户同时访问。

• 故障保障低,一旦机器出现问题,有可能造成所有用户都不能正常访问。

针对以上不足,很多企业通常会选择分布式存储系统来存储量级较大的数据。什么是分布式存储?通俗地讲,分布式存储是指采用便捷的分布式网络,将数据分散地存储在多台独立的机器设备上,同时利用多台存储服务器分担存储负荷,利用数据管理服务器定位存储信息,从而提高系统的可靠性、可用性和存取效率,易于拓展。

由于数据类型的多样性,当前行业内已有多种分布式存储系统来满足不同场景的需求。例如,大型的线上购物平台每天需要保留用户的浏览记录,Facebook每天需要处理用户上传的大量图片等。本质上这些都是属于文件信息。

1.1.1 分布式文件系统部署架构

若想实现一个分布式文件系统,系统的部署架构是一个必不可少且必须要提前考虑的事情。就部署架构来说,基于中心化的系统具有良好的稳定性,且实施复杂度低。这种分布式系统集群存在部分管理节点(Master)和数据节点(Slave),基本架构如图1-1所示。

• 图1-1 有中心节点基本架构

基本架构分为3部分,各部分主要作用如下。

• Master。负责文件定位、维护文件元(meta)信息、集群故障检测、管理数据迁移、分发数据备份、提供有关数据的操作命令或对外调用接口。

• Slave。负责提供数据的存储介质,定期和Master交互汇报自身的数据信息,或执行Master分发的命令,同时也会对外提供一些可访问的接口方式。

• Client。通常是一组需要计算的任务,或者仅执行数据的获取任务。在有中心节点的架构下,通常会先和Master交互,然后根据位置信息再和Slave通信。

在有中心节点的部署方案里,一般中心节点并不参与真正的数据读写,而是将文件meta信息保存并管理起来,Client从Master获取meta信息之后即可与Slave通信。Master节点在这种方案下既容易控制又功能强大,而且降低了Master节点的负载,防止其成为瓶颈[通常还有HA(High Availability)保障,即图1-1中的namespace]。当前有中心节点的方案在各种存储类系统中得到了广泛应用,典型的产品如Hadoop HDFS。

1.1.2 系统性能的影响因素

一款好的分布式文件系统除了架构外,通常还具备一些基本的特点。

• 高可用性。能够在集群系统存在部分故障(如访问链路故障、节点故障或节点存储驱动故障等)的情况下继续运行。

• 性能。性能通常指客户从发起需求访问到处理完成所需要的时间,这个时间不宜过长。处理过程包括各个节点的CPU处理、网络处理、存储处理等。

• 易于使用。分布式文件系统和用户交互不应过于复杂。

为满足以上特点,通常在分布式文件系统的设计和实现过程中,还需要考虑其他的影响系统性能的因素。

• 并发。分布式通常是为满足在多用户使用的场景下,同一时间有多个客户端同时访问集群内的共享资源,对相同的资源发送请求的需求。每个资源在并发环境下应该是安全的。

• 拓展性。当用户和资源数量明显增加时,系统能动态拓展以保证系统运行的高效性。

• 开放性。分布式系统在对外提供服务或是内部运转过程中,通常都是基于统一的通信机制和公开的共享资源访问接口。

• 安全性。系统能够提供对共享资源的加密保护,在传输敏感信息时加密,在访问上如有必要也应该保持安全。

• 故障处理。当硬件或软件程序出现某些故障时,可能会产生异常结果。这些故障应该在预期计算完成之前自动停止。同时这些故障应该被控制在一定范围内,避免对系统扩大影响。

• 透明性。用户和应用程序在访问分布式系统时,应该将其视为单个实体,而不是协作式的自治系统的集合。用户无须知道服务所在的具体位置,并且从本地访问远程时的传输应该也是透明的。

• 异构性。异构通常依赖于不同开发者的网络、硬件、操作系统等基础设施。也就是说即使软硬件环境不同,也能正常和分布式系统交互。

分布式文件系统的设计和实现内容复杂,这里只做基本介绍。