全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 python论坛
1499 7
2021-03-23
理清这些关键技术,最好的方式是理解这些关键技术因何而生的,是为了解决什么问题。换句话说,如果要你自己手动实现一个分布式存储系统会如何设计。这里我们暂且不关心是什么块存储、对象存储还是文件存储。我们从设计一个分布式存储系统开始,逐步介绍涉及的关键技术。
首先想一个问题,为什么需要分布式存储,其中最主要的原因之一就是解决数据在单机硬盘存不下的问题。如果不用分布式存储你会怎么办?使用工具把文件分割成一个个小文件,存到其他机器即可,并做好记录,下次读的时候再查看记录按顺序或者指定读取第几个小文件把内容合并,这其实就实现了手工式的分布式存储:)。另一个原因就是解决数据单机处理不了的问题,比如就统计下文件中单词出现次数,数据太大,内存有限,算不了,怎么办?把数据分成一个个小文件,拷到其他机器,每个机器只处理每一个小文件,最终合并结果即可,这其实就是手工式的mapreduce,同样需要分布式存储。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2021-3-23 08:14:11


从狭义上来说,云存储是指通过虚拟化、分布式技术、集群应用、网格技术、负载均衡等技术,将网络中大量的存储设备通过软件集合起来高效协同工作,共同对外提供低成本、高扩展性的数据存储服务。
从广义上来讲,云存储可以理解为按需提供的虚拟存储资源,如同云计算的Paas、Iaas服务一样,可称为数据存储即服务(Data Storage As a Service,DaaS),即基于指定的服务水平请求,通过网络提供适当的虚拟存储和相关数据服务。

云存储不是指某一个具体的设备,而是指一个由许许多多个存储设备和服务器所构成的集合体。使用者使用云存储,并不是使用某一个存储设备,而是使用整个云存储系统带来的一种数据访问服务。云存储的核心是应用软件与存储设备相结合,通过应用软件来实现存储设备向存储服务的转变。云存储就是将储存资源放到网络上供人存取的一种新兴方案。使用者可以在任何时间、任何地方,透过任何可连网的装置方便地存取数据。

综合定义,来看看云存储有哪些特点?
Ø 高可扩展性:云存储系统可支持海量数据处理,资源可以实现按需扩展;
Ø 低成本:云存储系统应具备高性价比的特点,低成本体现在两方面, 更低的建设成本和更低的运维成本;
Ø 无接入限制:相比传统存储,云存储强调对用户存储的灵活支持, 服务域内存储资源可以随处接入,随时访问;
Ø 易管理:少量管理员可以处理上千节点和PB级存储,更高效的支 撑大量上层应用对存储资源的快速部署需求。

了解了云存储的概念后,我们来看看云存储是什么架构?传统的存储架构就是如下图所示的,存储、网络和主机都在同一个数据中心,客户通过局域网可以直接访问背后的存储。




而云存储是指通过虚拟化、分布式技术、集群应用、网格技术、负载均衡等技术,将分散在不同地方的大量的存储设备通过软件集合起来,客户通过公用访问接口、接入网和客户端程序等获取存储资源,客户并不知道所访问的存储资源处在什么地方。

Ø 存储层:存储设备数量庞大且分布在不同地域,彼此通过广域网、互联网或光纤通道网络连接在一起。在存储设备之上是一个统一存储设备管理系统, 实现存储设备的逻辑虚拟化管理、多链路冗余管理,以及硬件设备的状态监控和故障维护。
Ø 基础管理层:通过集群、分布式文件系统和网格计算等技术,实现云存储设备之间的协同工作,使多个的存储设备可以对外提供同一种服务, 并提供更大更强更好的数据访问性能。数据加密技术保证云存储中的数据不会被未授权的用户访问, 数据备份和容灾技术可以保证云存储中的数据不会丢失, 保证云存储自身的安全和稳定。
Ø 应用接口层:不同的云存储运营商根据业务类型,开发不同的服务接口,提供不同的服务。例如视频监控、视频点播应用平台、网络硬盘,远程数据备份应用等。
Ø 访问层: 授权用户可以通过标准的公用应用接口来登录云存储系统,享受云存储服务。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-3-23 08:15:19
了解了基础架构之后,我们最后来看看云存储的关键技术有哪些?
1.云存储中的存储虚拟化通过存储虚拟化方法,把不同厂商、不同型号、不同通信技术、不同类型的存储设备互联起来,将系统中各种异构的存储设备映射为一个统一的存储资源池。存储虚拟化技术能够对存储资源进行统一分配管理,又可以屏蔽存储实体间的物理位置以及异构特性,实现了资源对用户的透明性,降低了构建、管理和维护资源的成本,从而提升云存储系统的资源利用率。
存储虚拟化技术虽然不同设备与厂商之间略有区别,但从总体来说,可概括为基于主机虚拟化、基于存储设备虚拟化和基于存储网络虚拟化三种技术。
2. 云存储中的分布式存储技术分布式存储是通过网络使用服务商提供的各个存储设备上的存储空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在各个存储设备上。目前比较流行的分布式存储技术为:分布式块存储、分布式文件系统存储、分布式对象存储和分布式表存储。
3. 云存储中的数据缩减技术为应对数据存储的急剧膨胀,企业需要不断购置大量的存储设备来满足不断增长的存储需求。权威机构研究发现,企业购买了大量的存储设备,但是利用率往往不足50%,存储投资回报率水平较低。通过云存储技术不仅解决了存储中的高安全性、可靠性、可扩展、易管理等存储的基本要求,同时也利用云存储中的数据缩减技术,满足海量信息爆炸式增长趋势,一定程度上节约企业存储成本,提高效率。比较流行的数据缩减技术包括:自动精简配置、自动存储分层、重复数据删除、数据压缩。
4. 数据备份技术在以数据为中心的时代,数据的重要性无可置否,如何保护数据是一个永恒的话题,即便是现在的云存储发展时代,数据备份技术也非常重要。数据备份技术是将数据本身或者其中的部分在某一时间的状态以特定的格式保存下来,以备原数据出现错误、被误删除、恶意加密等各种原因不可用时,可快速准确的将数据进行恢复的技术。数据备份是容灾的基础,是为防止突发事故而采取的一种数据保护措施,根本目的是数据资源重新利用和保护,核心的工作是数据恢复。
5.内容分发网络技术内容分发网络是一种新型网络构建模式,主要是针对现有的Internet进行改造。基本思想是尽量避开互联网上由于网络带宽小、网点分布不均、用户访问量大等影响数据传输速度和稳定性的弊端,使数据传输的更快、更稳定。通过在网络各处放置节点服务器,在现有互联网的基础之上构成一层智能虚拟网络,实时地根据网络流量、各节点的连接和负载情况、响应时间、到用户的距离等信息将用户的请求重新导向离用户最近的服务节点上。
6.存储加密技术存储加密是指当数据从前端服务器输出,或在写进存储设备之前通过系统为数据加密,以保证存放在存储设备上的数据只有授权用户才能读取。
目前云存储中常用的存储加密技术有以下几种:全盘加密,全部存储数据都是以密文形式书写的;虚拟磁盘加密,存放数据之前建立加密的磁盘空间,并通过加密磁盘空间对数据进行加密;卷加密,所有用户和系统文件都被加密;文件/目录加密,对单个的文件或者目录进行加密。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-3-23 08:17:14
分布式存储系统,通俗地讲就是要把文件存储到多个机器中。那么需要解决的第一个问题便是这些文件如何知道该保存到哪台服务器中。这里有两个思路,其中一个是设计一个控制服务器,由这个控制服务器负责统一调度,客户端请求存储一个文件时,首先与控制服务器交互,控制服务器返回需要保存到服务器的地址,读取文件时也需要与控制服务器交互,获取存储位置信息,其中HDFS、GFS等分布式存储使用此种技术,namenode就类似于控制服务器角色。另外一个思路是,不需要控制服务器,客户端自己计算需要存储到哪里,最简单的方式是直接取hash,比如有8台存储服务器,只需要把文件内容或者文件名取hash模8即可计算出应该存储到哪台存储服务器。但有个问题是,当服务器数量增减时,hash就失效了,几乎需要重排迁移所有数据,根本没有办法实现水平扩展,这在分布式系统中是无法忍受的。
为了避免出现这种情况,引入了一致性hash算法,又称为环哈希,关于该算法可参考深入云存储系统Swift核心组件:Ring实现原理剖析,其中OpenStack Swift、华为FusionStorage就是使用的该方法。除了环hash,当然还有其他的类hash算法,比如CRUSH算法,关于CRUSH算法介绍可参考大话Ceph--CRUSH那点事儿,其中开源分布式存储系统Ceph就是使用的该方法。需要注意的是虽然基于hash的文件分布映射方法不需要控制节点计算需要存储的位置,但仍然需要控制服务器保存一些集群元数据,比如集群的成员信息、映射规则、监控等等,如Ceph的mon服务。如果只有一个控制服务,则存在单点故障,挂掉了就会导致服务不可用。
为了避免单点故障,具备高可用特点,必然需要同时启动多个控制服务,有多个控制服务就必须区分谁是leader,谁是slave,因此需要分布式一致性来协调选主,可以基于现有的分布式协调系统实现,如Zookeeper、Etcd服务等,也可以直接基于Paxos、Raft算法实现,Paxos相对复杂,Google的分布式锁服务Chubby就是基于Paxos实现的,Raft相对比较简单容易理解,可参看Raft-Understandable Distributed Consensus动态展示了该算法的执行流程,更多关于Raft的信息可参看官方文档主页Raft Consensus Algorithm。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-3-23 08:18:56
文件直接映射到物理主机或者物理硬盘,粒度太粗略,容易导致数据分布不均匀。如果踢掉一台服务器或者一块硬盘,需要把这台服务器的数据迁移到重映射的另一台主机,迁移数据的IO都集中在这两台主机之间,其它主机帮不上忙。于是引入了虚拟主机概念,OpenStack Swift中叫做partition以及Ceph中PG等都是类似的概念。原理就是在物理主机上面加一层逻辑主机,比如有8台物理主机,可以创建128个虚拟主机,然后把这8台物理主机映射到这128台逻辑主机上,这样相当于每一台主机都虚拟成16台虚拟主机,当然实际上不一定是按照平均分,可以根据磁盘容量映射,磁盘空间大可以映射较多的虚拟主机。当然虚拟主机数量通常都会设置成2的幂,这样很多计算都可以使用位运算进行优化,比如取模运算等。这样文件块会先根据虚拟主机计算存储位置,然后再从表中查找虚拟主机映射的物理主机,文件块分布更均匀,当踢掉一台主机时会重映射到多台主机中,数据迁移效率提升。

解决了文件如何分布的问题,自然会遇到的问题是如果文件很大怎么办,可能在一台服务器根本存不下,即使存下了,也会导致各个服务器的磁盘利用率不均衡,甚至可能出现大量存储碎片。于是我们自然想到的是把文件分块,然后基于块存储,比如按照64MB大小分块,如果存储一个2GB的文件,则需要把文件分割成32个块,然后逐块存储,存储位置仍然使用前面提到的hash算法。分块是存储密度更大、更紧凑,几乎所有的分布式存储系统都会使用分块技术。
接下来,将考虑存储系统的数据可靠性(数据不丢)以及可用性(数据可访问)问题,如果其中一个服务器坏了怎么办?显然可能出现一个文件的某些块不能访问了,文件读取失败。为了解决这个问题,最容易想到的方法是使用冗余技术,即每一个块,我都存储多份,并分布到不同的服务器中,这样即使其中一个服务器宕机了,也能从其他服务器中读取块,这个和RAID 1技术原理是一样的。存储多少份呢,这个需要权衡成本以及数据可靠性要求,通常来说存储三份就够了。有人会说,存储三份,相当于使用了三倍的存储空间,这样存储资源是不是有点太浪费了,而又不想牺牲数据可靠性。我们学习算法时经常使用时间换空间的思想,计算换存储,这个仍然可以从RAID实现中获取灵感,以RAID 5为例,通过奇偶校验恢复数据,存储利用率为(n-1)/n,相比RAID 1的1/2提高了存储利用率,并且具有RAID 1一样的可靠性,但需要耗费CPU计算奇偶位。奇偶校验只能缺一位,自然可以想到进一步泛化,于是引入纠删码技术,原理其实就是类似解线性方程,关于纠删码技术介绍可以参考Erasure Code - EC纠删码原理。几乎所有的分布式存储系统都使用了冗余副本技术,大多数都会支持纠删码,比如Ceph、Swift。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-3-23 08:20:33
无论使用纯副本技术还是结合纠删码,必然还是需要把一个块复制多份存储,写入多份,这里假设副本数为3份。这些副本如何写入呢?当拿到三个副本的位置后,客户端可以同时写入三个副本,这种方式称为直接复制(direct replication),这样的问题是客户端会同时占用3倍的业务网络带宽,吞吐量也只有1/3,glusterfs采用的是这种复制策略。另一种方式是客户端只选择其中一个主节点写入数据,当写完第一个节点的数据后,由第一个节点复制到第二个节点,再由第二个节点复制到第三个节点,以此类推直到写完所有的副本,这种方式称为链式复制(chain replication),Ceph、HDFS都是采用的该种策略,这样由于客户端其实只是写了一份数据,不占用额外的业务网络,而存储节点之间的复制可以是一个专门的存储网,不影响业务网络。关于chain replication可以参考论文Chain Replication for Supporting High Throughput and Availability。
写入多份数据,如何保证这些副本数据都是一样的,如何保证三个数据同步呢,万一哪台服务器挂了写不进去怎么办。于是引入了一致性策略。最简单的方法,就是等所有的副本都完成时才返回结果,这样保证写入的三个副本肯定没有问题,这就是强一致性,其中Ceph就是使用的强一致性模型,强一致性能够保证多副本完全一致,并且不会读取脏数据,但是性能不好,万一有一台服务器巨慢则会拖垮整个集群,典型的木桶效应,因此强一致性天生难以支持跨区域部署,因为跨区域的远端时延太长了,导致存储系统性能低。为了避免这种情况,我们可以适当放宽条件,即只要保证一半以上的服务器写入成功即返回,这样即使其中有少数服务器拖后腿也没有关系,不用等,让他自个慢慢同步,最终一致即可。这就是典型的最终一致性模型,OpenStack Swift即采用该种策略,这种模型能够提高读写性能,但可能读取脏数据,比如刚好读到还没有来得及同步的服务器的数据块。
事实上高性能和强一致性是两者不可兼得的,这就是著名的CAP理论,这里的C代表一致性,A代表可用性(在一定时间内,用户的请求都会得到正确的应答),P代表分区容错。正常情况下,存储系统的所有节点都是互通的,处在一个网络连通区域中,如果有些节点之间不连通了(节点挂了或者网络故障),这就相当于把一个网络连通区域割裂了几个区域,彼此不能通信了,因此叫做分区。分布式存储系统要系统出现分区时数据不丢(可靠性),数据可访问(可用性),避免脑裂,因此P是100%需要满足的,否则稍微一个网络抖动,数据就损坏了。剩下的就是C和P之间的权衡,这个就看你要设计成什么存储系统了,如果一致性不那么重要,比如对象存储,上传了一个新文件,即使马上读不到数据也无所谓,但是可能需要支持大规模的对象写入,因此更关注A,设计为AP存储系统。而对于一些实时性要求高的系统,必须保证写入后数据一定能够读到正确的数据(而不是脏数据),就必须牺牲吞吐量,因此设计为CP存储系统。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群