初识分布式存储

Posted 沐码人1号

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识分布式存储相关的知识,希望对你有一定的参考价值。

这是2016年自己整理各种资料之后汇总的一篇关于分布式存储的文章,原文链接:http://www.a-programmer.top/2016/12/27/初识分布式存储/

分布式领域的知识理论非常庞大,涉及的知识面也非常广博,比如涉及到计算、存储、网络,甚至数据库理论、大数据处理等知识理论。由于笔者的浅陋,以目前水平确实无法做到面面俱到,所以本文选取了笔者相对熟悉的存储领域进行简要介绍。主要内容有:

1.分布式存储产生的背景2.分布式存储概念3.分布式存储面临的问题或挑战4.常见概念理论介绍5.个人参与项目的感受


背景

当今社会是信息时代,互联网时代,同时也是信息数据大爆炸的时代,每天都会产生大量的数据,真的可谓是海量数据。那么这么多数据如何存储呢,很显然,原来的单机存储肯定已经无法存储需求了。举个栗子,比如我们上学那会,相信很多人都有过下载高清电影的经历吧,有的一部高清电影可能就上百G,当时我们大部分的电脑硬盘一般可能就500G,根本存不了几部高清电影。还有就是传统的网络存储采用集中的存储服务器来存放所有的数据,存储服务器本身很容易成为整个系统性能的瓶颈,也是可靠性和安全性的焦点,所以也越来越不能满足当今的大型应用的数据存储需求了。正因如此,分布式存储可谓应运而生。

分布式存储概念

分布式存储系统,是将数据分散存储到多台独立的设备上,将大量的这些设备通过网络互联,对外作为一个整体提供存储服务,更多的时候,我们可以把分布式存储看作一种服务,一种面向各种不同数据存储需求的服务。分布式存储面临的数据需求多种多样,大致可以分为三类:

非结构化数据:包括所有形式的办公文档、文本、图片、图像、音频和视频信息等结构化数据:一般存储在关系数据库中半结构化数据:介于非结构化数据与结构化数据之间,如html文档就属于半结构化的数据

分布式存储面临的问题或挑战

关于存储系统,我们一般关注如下几个方面:

数据分布或负载均衡数据存储的可靠性与一致性数据访问的性能系统容错能力系统扩展性能

分布式存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,这样不但提高了系统的可靠性可用性,还易于扩展。当然,随之带来了一些问题涉及数据分布、数据复制、一致性、容错等。分布式存储中面临的第一个问题就是数据分布,即将数据均匀地分布到多个存储节点。另外,为了保证可靠性和可用性,通常需要将数据复制多个副本,这就带来了多个副本之间的数据一致性问题。此外,分布式存储系统中的服务器故障率很高,要求系统能够在软件层面实现自动容错。比如当存储节点出现故障时,系统能够自动检测出来,并将原有的数据和服务迁移到集群中其他正常工作的节点。

常见概念理论介绍

可靠性

这一点应该很好理解,这里不深入讨论Amazon AWS、微软Azure、阿里云、华为存储等宣称的可靠性达到几个9是如何计算出来的(比如,宣称可靠性达到99.999%)。想必大家都写过毕业论文,假如你只在自己的笔记本电脑里面存一份这个论文,要是你运气不好,笔记本被偷了或者硬盘坏了,那么你的毕业论文也就丢了。所以我们通常都知道重要的东西只存一份是不安全的,不可靠的。当年笔者都是电脑里面存一份,U盘存一份,XX云上再存一份,这样是不是安全可靠多了 ^_^

副本

副本(replica/copy)是指分布式系统中为数据或服务提供冗余的服务。如果把我上面的论文分三份存三个地方看作一个整体的服务的话,那么我们可以简单的把这种形式看作是三副本。这样好处是,比如U盘丢了,其他两个地方还有论文,其实对整个服务而言,影响不大。在分布式存储系统也是如此,通常比较常见的是三副本,当三份数据中丢了一份,如果需要读数据还可以从其他两份那读。如果是作为服务的节点,三个节点,一个节点坏了,还有两个节点可以继续提供服务。

一致性

三副本确实让数据更安全可靠,不过与此同时会带来一致性问题。比如三份论文内容均有不一致的地方需要如何处理。分布式系统为了提高可靠性,经常会采用多副本机制,从而引发副本一致性问题。根据具体的业务需求,分布式系统总是会提供某一种一致性模型,并基于此模型提供具体服务。(本文只对一致性概念做介绍,不深入讨论。)比如,我们要解决上面“三份论文一致性”的好办法是,当我们改了一处的论文,必须保证更新其他两处的论文,也就是在修改完一个地方的论文的时候,都要保证其他两处的论文得到同样的更新,保证三份论文一样。

CAP理论

2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。

简单阐述CAP理论,就是一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。

Consistency 一致性

一致性指“all nodes see the same data at the same time”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。

Availability 可用性

可用性指“Reads and writes always succeed”,即服务一直可用,而且是正常响应时间。

对于一个可用性的分布式系统,每一个非故障的节点必须对每一个请求作出响应。也就是,该系统使用的任何算法必须最终终止。当同时要求分区容忍性时,这是一个很强的定义:即使是严重的网络错误,每个请求必须终止。

好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。可用性通常情况下可用性和分布式数据冗余,负载均衡等有着很大的关联。

Partition Tolerance分区容错性

分区容错性指“the system continues to operate despite arbitrary message loss or failure of part of the system”,即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。

分区容错性和扩展性紧密相关。在分布式应用中,可能因为一些分布式的原因导致系统无法正常运转。好的分区容错性要求能够使应用虽然是一个分布式系统,而看上去却好像是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,或者是机器之间有网络异常,将分布式系统分隔为独立的几个部分,各个部分还能维持分布式系统的运作,这样就具有好的分区容错性。

Quorum机制

从小学的抽屉原理说起,为什么从抽屉原理说起?一来大家对这个比较熟悉,二来它与Quorum机制有异曲同工的地方。回顾抽屉原理,2个抽屉每个抽屉最多容纳2个苹果,现在有3个苹果无论怎么放,其中的一个抽屉里面会有2个苹果。那么我们把抽屉原理变变型,2个抽屉一个放了2个红苹果,另一个放了2个青苹果,我们取出3个苹果,无论怎么取至少有1个是红苹果,这个理解起来也很简单。我们把红苹果看成更新了的有效数据,青苹果看成未更新的无效数据。便可以看出来,不需要更新全部数据(并非全部是红苹果)我们就可以得到有效数据,当然我们需要读取多个副本完成(取出多个苹果)。这其实就是Quorum机制的一种特殊情况,其实质是将Write All 的负载均衡到 Read Only 上。上面的解决“三份论文一致性”的方法,其实就是Read Only Write All,就是更新的时候全部更新,读的时候就只用读一份数据了。由于本文属于简介性质,所以关于QUORUM机制本文也不做过多介绍,有兴趣的可以去查相关资料。

EC模式

三副本确实很不错,能解决很多问题,但是大家有没有发现这样有个什么问题?那就是什么东西都要存三份,这存储效率不高呀,空间利用率不高,这对于使用存储设备的厂商来说存储的成本会变得很高,简单的说,1T的数据,你需要3个1T的移动硬盘来存储。那有没有什么好的其他方案呢?答案是有的,很多存储厂商,为了提高自身产品的竞争力,除了提供三副本的方式外,还提供了EC的方式。EC,全称Erasure Code. 为了阐述简单,本文只举4+2这种模式的EC算法进行示意说明,并不阐述具体的算法或其变种算法。感兴趣的可以看下这篇文章的介绍 分布式系统下的纠删码技术[1]

EC 4+ 2

简单来说,4+2这种模式的EC算法就是原始数据切分成4块,图中D1、D2、D3、D4,然后利用EC算法,计算出2块校验数据P1、P2,总共6块数据。至于怎么算出来的咱不管,就当做解方程组。通过这种方法能够保证你在丢失至多2块(6块数据丢2块)数据的情况下,都是能够恢复出来的(可以看作能够通过解方程的形式解出来^_^)。当然要是丢了2块以上的数据就没办法恢复了。比如D3和D4丢了,可以通过剩下的4块数据将D3和D4算出来。


可以看到4+2的模式,比三副本的模式的存储效率提高了,能够降低存储成本,同时也能保证一定的可靠性和容错性。当然,也可以把EC算法看成是以CPU计算来换取存储效率的提高,因为采用EC模式,在丢了原始数据的情况下是需要CPU进行计算来恢复出原始数据的。

个人参与项目的感受

团队沟通协作

一个项目往往都是团队协作共同努力完成的,所以沟通能力很重要,需要不断加强。

代码编写感受

产品正常逻辑的代码可能只占项目代码的1/3,大部分代码都是异常处理。只考虑正常情况情况的话,代码写起来是简单,然而写出来的代码很可能不可用,而且分布式系统中本来就会遇到千奇百怪的异常情况。所以写代码一定要注意考虑清楚异常情况。


最后以一个段子结束本文^_^



可供参考阅读的资料

分布式系统阅读清单[2]

References

[1] 分布式系统下的纠删码技术: http://blog.csdn.net/u011026968/article/details/52295666
[2] 分布式系统阅读清单: http://blog.jobbole.com/84575/


以上是关于初识分布式存储的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

(转) 分布式文件存储FastDFS初识FastDFS

云原生分布式键值存储服务-etcd初识

初识Hadoop

Java初识方法