初识分布式存储
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]。
简单来说,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注入(代码片段