随着互联网的不断发展,人类社会的数据量迅速激增,这些数据大部分都是图片、音视频这类大文件。而存放这些数据的存储可以说是很多系统中最核心、最重要、最关键的组成部分,没有之一。像loT物联网、AI人工智能,Edge边缘计算,也无不都是以分布式存储技术为基石。无疑,谁更好地掌握了分布式存储技术,谁就更容易在新一轮技术浪潮中获得主动。
如今,各大厂对分布式存储的求贤若渴。但是面试难度也比较大。原因就是分布式存储技术概念繁多,知识庞杂,此外,还涉及到很多理论知识和概念,比如数据结构(哈希、数)等,这些内容往往都是偏计算机科学基础范畴的一些知识,学起来不容易理解和记忆。并且会感觉到理论和实践之间出现巨大的鸿沟。接下来的篇章中,我们将通过大厂项目实践遇到的一些问题,讲这些问题的解决办法,同时再这当中贯穿一些知识和原理。通过这样的方式带大家体系化地理解分布式存储的这些概念。
如果处理的数据有 20T,而你手上的机器只有 500G 的硬盘,怎么办?
一种办法是纵向扩展,换一块128T 硬盘增加单机的硬件能力;另一种是水平/横向扩展,增加计算机数量。前者很容易遇到性能到瓶颈,分布式系统则可以根据某一指标进行“线性扩展”。所以按照这个思路,分布式系统的出现其实就是为了解决单机的性能瓶颈成为拖累的问题。单机系统的磁盘 IO、网络带宽资源毕竟有限,从而它所能支持的并发量就是有限的,比如单机应用只能支持100并发。如果像京东,淘宝这样的大型电商,在双十一时候一秒的订单量就是几十W,那么单机就完全满足不了。单机系统还有其他问题-不可靠啊,因为只有一台机器,坏了就不能用了啊。所以单机模式的核心问题是性能受限,存在单点失效问题。
用生活中一个例子就很好的解释这个问题:养儿防老问题。一对夫妇只有一个儿子,这个儿子就像一个单机系统,这对夫妇中的一个人病了要去医院,那么儿子可以搞定,如果两个老人同时都病了要去不同的医院,那么这个儿子就忙不过来了。如果这个儿子出差了,那么对夫妇就没人照顾了。这就是单机系统不能解决并发以及故障问题。
磁盘存储系统经历了半个多世纪的发展,存储系统随着磁盘以及 CPU等介质的发展在不断的演进。早期的数据存储一般以磁盘阵列等设备为外设,围绕服务器通过直连的方式进行存储。近年来,随着网络技术的发展,服务器的数据读取范围也得到了很大拓展,逐渐实现了现在的网络存储。相较于传统存储来说,网络存储的优势更加突出,其不但安装便捷、成本低廉,并且还能够大规模的拓展存储设备,从而有效满足了海量数据存储对存储空间的需求。不过网络存储对网络资源的消耗极大,这是一项难题,为此,后来又逐渐出现了SAN存储架构。
目前传统存储系统主要的3种架构,包括DAS、NAS和SAN。
随着互联网海量数据的爆发式增长,传统的传统的集中式存储(如NAS或SAN)在容量和性能上都无法较好地满足存储需求。
分布式存储基于标准硬件和分布式架构,实现千节点/EB级扩展,可同时对块、对象、文件等多种类型存储统一管理。无论是存储非结构化数据的分布式文件系统,存储结构化数据的分布式数据库,还是半结构化数据的分布式KV,在系统的设计上主要需要满足以下需求:基本读写功能、性能、可扩展性、可靠性、可用性。
分布式存储系统要解决的关键技术问题包括诸如可扩展性、数据冗余、数据一致性、全局命名空间缓存等。
从架构上来讲,大体上可以将分布式存储分为C/S(Client Server)架构和P2P(Peer-to-Peer)架构两种。当然,也有一些分布式存储中会同时存在这两种架构混合的方式。
分布式存储系统面临的另外一个共同问题,就是如何组织和管理结点,以及如何建立数据与结点之间的映射关系。结点的动态增加或者离开,在分布式系统中基本上可以算是一种常态。
下面来讲讲什么是性能、资源、可用性和可扩展性。
性能
主要用于衡量处理各种任务的能力。常见的性能指标主要包括吞吐量(Throughput)、响应时间(Responce Time)和完成时间(Turnaround Time)。
响应时间
系统响应一个请求需要花费的时间。响应时间直接影响到用户体验。对于延时敏感的业务来说非常重要。
完成时间
系统真正完成一个请求或处理需要花费的时间。任务分布式模式出现的其中目的就是缩短任务的完成时间。特别是对海量数据进行计算,用户完成时间的感受非常明显。
资源占用
指的是一个系统提供正常能力需要占用的硬件资源。比如CPU、内存、硬盘等。系统在满额负载时的资源占用一般叫做满负载,体现了这个系统全力运行时占用情况。
可用性
通常指的是系统在各种异常可以正确提供服务的能力。它是一个非常重要的指标,衡量了系统的鲁棒性,体现了系统的容错能力。系统的可用性可以用系统停服务时间与总的时间之比来衡量或者用某功能的失败次数与总的请求次数之比来衡量。
可靠性
可靠性和可用性非常相似,用来表示一个系统完全不出故障的概率。更多用在硬件方面,而可用性则大多数指在允许部分组件失效的情况下,一个系统对外提供服务的概率。
可扩展性
分布式系统通过扩展集群机器规模提高系统性能(吞吐量、响应时间、完成时间等)
一个分布式存储系统往往会根据具体业务的不同,在特性设计上有不同的取舍,比如,是否需要缓存模块、是否支持通用的文件系统接口等。
云存储是由第三方运营商提供的在线存储系统,比如面向个人用户的在线网盘和面向企业的文件、块或对象存储系统等。云存储的运营商负责数据中心的部署、运营和维护等工作,将数据存储包装成为服务的形式提供给客户。云存储作为云计算的延伸和重要组件之一,提供了“按需分配、按量计费”的数据存储服务。因此,云存储的用户不需要搭建自己的数据中心和基础架构,也不需要关心底层存储系统的管理和维护等工作,并可以根据其业务需求动态地扩大或减小其对存储容量的需求。
云存储通过运营商来集中、统一地部署和管理存储系统,降低了数据存储的成本,从而也降低了大数据行业的准入门槛,为中小型企业进军大数据行业提供了可能性。比如,著名的在线文件存储服务提供商Dropbox,就是基于AWS(AmazonWeb Services)提供的在线存储系统S3创立起来的。在云存储兴起之前,创办类似于Dropbox这样的初创公司几乎不太可能。
云存储背后使用的存储系统其实多采用分布式架构,而云存储因其更多新的应用场景,在设计上也遇到了新的问题和需求。比如,云存储在管理系统和访问接口上大都需要解决如何支持多租户的访问方式,而多租户环境下就无可避免地要解决诸如安全、性能隔离等一系列问题。另外,云存储和云计算一样,都需要解决的一个共同难题就是关于信任(Trust)的问题——如何从技术上保证企业的业务数据放在第三方存储服务提供平台上的隐私和安全,的确是一个必须解决的技术挑战。
将存储作为服务的形式提供给用户,云存储在访问接口上一般都会秉承简洁易用的特性。比如,亚马逊的S3存储通过标准的HTTP协议、简单的REST接口进行存取数据,用户分别通过Get、Put、Delete等HTTP方法进行数据块的获取、存放和删除等操作。出于操作简便方面的考虑,亚马逊S3服务并不提供修改或者重命名等操作;同时,亚马逊S3服务也并不提供复杂的数据目录结构而仅仅提供非常简单的层级关系;用户可以创建一个自己的数据桶(bucket),而所有的数据则直接存储在这个bucket中。另外,云存储还要解决用户分享的问题。亚马逊S3存储中的数据直接通过唯一的URL进行访问和标识,因此,只要其他用户经过授权便可以通过数据的URL进行访问。
存储虚拟化是云存储的一个重要技术基础,是通过抽象和封装底层存储系统的物理特性,将多个互相隔离的存储系统统一化为一个抽象的资源池的技术。通过存储虚拟化技术,云存储可以实现很多新的特性。比如,用户数据在逻辑上的隔离、存储空间的精简配置等。
存储网络化的发展,同样伴随着网络智能化的发展,其结果就是存储系统能处理更多的事情,而不像以前仅仅是存放数据的物理实体。存储系统智能化具体体现在:
存储系统分担了原来应用系统承担的部分功能。比如与某公司数据库合作,可由该公司提供一些信息,由存储设备帮助它做校验,使数据正确地存放到磁盘里,避免错误的出现,充分利用磁盘阵列冗余的计算资源;"随着磁盘阵列智能化的提高,以前很多服务器上的功能也将部分转移到存储网络和存储设备上,而服务器只集中于应用系统,数据安全、备份等大部分工作都可以放在磁盘阵列和与服务器连接的存储网络上。比如,对不同格式文件的交互访问中,原来都需要服务器文件系统进行特殊处理后转化为双方均可识别的类型才能访问,而现在某些存储系统已经可以在存储微码级对不同文件类型进行转化,使得对不同文件的访问对用户透明。需要指出的是,存储智能化的趋势中,大家似乎更倾向于把这部分智能化功能的实现放在存储网络上,而不是放在存储设备体中。
在传统存储系统中,除了厂商为工程师提供存储系统安装、配置和维护等必要的简单管理系统之外,并没有太多存储的专门管理系统。随着存储系统规模和功能的拓展以及复杂度的提高,存储管理已经逐步发展成为一个相对独立的存储子系统。在传统存储系统中,各大存储厂商分别为各自存储系统设计的存储管理企业标准大多互不兼容,在一定程度上严重阻碍了存储系统管理的进一步规范化。
对一辆跑车来说,最重要的部件就是它的发动机。那么对于分布式存储来说,最重要的组件就是存储引擎。存储引擎决定了数据在内存和磁盘上如何存储的,如何在方便地读取出来。所以说它就像台发动机一样决定存储系统的性能和可以干什么,不可以干什么等问题。
如果按照应用场景来分类的话,当前主流的分布式存储引擎有:
分布式键值系统用于存储关系简单的半结构化数据,它只提供基于主键的CRUD(Create/Read/Update/delete)功能。即主键创建、读取、更新或者删除一条键值记录。比如你可以本篇博客作为一个整体存储到系统里面。存储的时候根据单一key 去做hash映射,然后再对数据做增删改查等操作。key值的生成是要够随机(这样才能保证数据在分布式的节点上是够均匀分别的,不产生热点)。但分布式KV存储引擎有个缺点,没法对数据做检索。因为Key值是随机生成的,就不具备内容检索的的条件。常用的方式是在其之上再加一个索引层。用于对数据的分析检索。代表性的系统有Dynamo(早期是给S3对象存储服务用的),以及淘宝的Tair系统,以及华为的早期的UDS系统。kv存储的数据分布关键技术是一致性哈希表(Distributed Hash Table,简称DHT),算是比较成熟常用的技术,后续将会展开讲解。它用到的地方很多,比如对象存储,块存储服务都是可以基于KV存储引擎的。典型的使用场景如备份文件场景,每个部门作为一个桶(Bucket),每天的日期作为文件名,去依次备份到远端通过s3对象存储协议去存储。
在Unix的世界里面,所有设备和大部分进程间通信在文件系统层级都以文件或伪文件的形式查看和管理。「一切皆文件」的 UNIX 基础愿景和设计原则。所以,文件系统的应用就比较广泛了。随着技术的不断发展,操作系统读写数据的方式不仅仅限于本地IO,也同时支持通过TCP/IP远距离获取的方式。相当于新增一种可以远距离传输的I/O技术,使得分散的存储设备和用户操作系统可以通过网络方式接入联合在一起,形成更大容量,更易于拓展伸缩的存储系统。即分布式文件系统。分布式文件系统架构主要考虑的有读写性能,数据容灾备份,避免单点故障,以及数据备份,数据容错恢复等。常见的分布式文件系统有,GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS等。各自适用于不同的领域。它们都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。除此以外,分布式文件系统还有些企业级特性,比如QUOTA、TIER等特性做企业增强。分布式文件系统应用场景很多,比如银行,证券,以及科研机构内部LAN网络内,通过传统的网络文件系统协议(NFS/CIFS)访问分布式文件系统,如下图。
表格听名字就知道是为分析数据而生的。分布式表格系统用于存储关系比较复杂的半结构化数据。支持按某些维度去扫描分析。分布式表格系统用于存储关系较为复杂的半结构化数据,与分布式键值系统相比。分布式表格系统以表格为单位组织数据,同普通数据库一样通过主键去标识一行以及范围查找功能。
分布式表格系统依赖于底层的分布式文件系统提供可靠和高效的数据存储,是分布式文件系统的主要使用者。典型应用的比如google的三架马车之一的Bigtable 。它是分布式表格系统的鼻祖,具有很好的伸缩性,可以扩展到用来管理PB级数据和上千台服务器。用于解决 Google 内部不同产品在对数据存储的容量和响应时延需求的差异化,力求在确保能够容纳大量数据的同时减少数据的查询耗时。
Bigtable使用了很多类似数据库的实现策略,但是它不支持完整的关系数据模型,与之相反,Bigtable采取的是相对宽泛、稀疏而简单的数据模型,客户可以动态控制数据的分布和格式。Bigtable中数据没有严格的Schema,客户可以自己定义Schema。Bigtable 把数据存储在若干个 Table 中,其数据特征是一个稀疏的、分布式的、持久化存储的多维度排序Map由key和value组成。打破了传统的RDS数据库的固定数据结构,支持动态扩展。
下一篇,会对另一大巨头Amazon的海量键值存储系统Dynamo的原理以及某厂如何对其进行二次开发进行讲解。请大家持续关注系列文章。