分布式存储系统的一些理解和实践_第1页
分布式存储系统的一些理解和实践_第2页
分布式存储系统的一些理解和实践_第3页
分布式存储系统的一些理解和实践_第4页
分布式存储系统的一些理解和实践_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、分布式存储系统的一些理解和实践张建伟一、 分布式存储系统介绍1. 简介互联网数据规模越来越大, 并发请求越来越高, 传统的关系数据库, 在很多使用场景下并不 能很好的满足需求。 分布式存储系统应运而生。它有良好的扩展性,弱化关系数据模型,甚 至弱化一致性要求,以得到高并发和高性能。按功能分类,主要有以下几种:分布式文件系统hdfs ceph glusterfs tfs分布式对象存储s3(dynamo) ceph bcs(mola)分布式表格存储hbase cassandra oceanbase块存储ceph ebs(amazon) 分布式存储系统,包括分布式系统和单机存储两部分;不同的系统,虽

2、在功能支持、实现机 制、实现语言等方面是有差异的,但其设计时,关注的关键问题是基本相同的。单机存储的主流实现方式,有 hash引擎、B+树引擎和LSM树(Log Structured Merge Tree)三种,不 展开介绍。本文第二章节,主要结合 hbase 、 cassandra 和 ceph ,讲下分布式系统设计部 分,需要关注的关键问题。2. 适用场景 各分布式存储系统功能定位不尽相同,但其适用和不适用的场景,在一定程度上是相同的, 如下。1) 适用大数据量(大于 100T ,乃至几十 PB)key/value 或者半结构化数据高吞吐高性能高扩展2) 不适用Sql 查询复杂查询,如联表

3、查询复杂事务分布式存储系统设计要点1.数据分布分布式存储,可以由成千甚至上万台机器组成,以实现海量数据存储和高并发。那它最先要解决的就是数据分布问题,即哪些数据存储在哪些机器(节点)上。常用的有hash类算法和用meta表映射两种方式。一般完全分布式的设计 (无master节点),会用hash类算法; 而集中式的设计(有 master节点)用meta表映射的方式。两者各有优缺点,后面讲到具 体问题时再做比较。1) 一致性 hash将存储节点和操作的key ( key唯一标识存储的 object,有时也叫object name )都hash到02的32次方区间。映射到如下环中的某个位置。沿操作

4、key的位置顺时针找到的第一个 节点即为此key的primary存储节点。如下图所示:图1 一致性hashCassandra 借鉴了 dynamo的实现,用了一致性 hash的方式。节点的hash值(也叫token ), 可以手动分配或者自动生成。Key的hash值即md5(key)。每个表可以在建表时指定副本数,当副本数为 3时,找primary存储节点后,顺时针方向的下2个存储节点即为replica存储节点。Hash类算法,优点是无需master节点,一个缺点是,不支持key的顺序扫描。2) Crush 算法也是一种类hash算法,随着ceph诞生,也是ceph的一大亮点。Crush算法比

5、较复杂,这 里简化介绍下。Ceph的每个Object最终都会映射到一组 OSD中,由这组 OSD保存这个 Object,映射流 程如下:Object t PG t OSD set* OSD先理解为机器节点吧* PG即Placement Groups ,可以理解为存储在同一组OSD上的object的集合Object先映射到PG(Placement Group),再由PG映射到OSD set。每个表空间有固定数 量的pg ,在建表时指定。每个 Object通过计算hash值并对pg数量取模得到它所对应的PG。PG再映射到一组 OSD (OSD的个数由表的副本数决定,也是建表时指定),第一个 OSD

6、 是 Primary,剩下的都是 Replicas。PG t OSD set的映射由几个因素决定:CRUSH hash算法:一种伪随机算法。OSD MAP :包含当前所有 OSD的状态、OSD的机器机架信息等。« CRUSH Rules :数据映射的策略。这些策略可以灵活的设置object存放的区域。比如可以指定table1中所有objects放置在机架1上,所有objects的第1个副本放 置在机架1上的服务器A上,第2个副本分布在机架1上的服务器B上。table2 中所有的object分布在机架2、3、4上,所有Object的第1个副本分布在机架 2 的服务器上,第2个副本分布在

7、机架 3的服器上,第3个副本分布在机架 4的服务 器上。具体实现不再展开。FileObjectsPGs(inOjOno)oid hash(oid) & mask*pgidOSDs (grouped by failure domain)CRUSH(pgid) (osd1, osd2)图 2 ceph crush 算法伪代码如下所示: locator = object_ nameobj_hash = hash(locator)pg = obj_hash % nu m_pgosds_for_pg = crush(pg) # retur ns a list of osdsprimary = o

8、sds_for_pg0replicas = osds_for_pg1:Crush相比一致性hash更加灵活。3) 按range查表由master节点记录和管理每个表range的粒度,以及每个range的数据存储在哪些节点上。range是根据key的字节序确定。Client在执行key存取操作是,先到master,根据其所在range,查询其存储在哪些节点;再直接跟存储节点交互,实现存取。Hbase是用这种方式实现,支持 key的顺序扫描。女口下图所示, region 即一段 range 的数据(存储在 mater server 上),region sever 即实际 存储节点。RegionRe

9、gion图 3 hbase region 映射2.数据可靠性数据可靠性,即数据不丢失,是存储系统的第一职责。图4数据中心分布式一般采用普通服务器,要假设服务器和硬盘都是不可靠的。如何保证在有硬件损坏时数据不丢失,是任何分布式存储系统都必须考虑的。已有做法有以下几种。1) 多副本即数据保存N+1份(一般是3份),每一份都存储在不同的节点上。在数据损坏N份时,仍能修复数据。缺点是,需N倍的冗余存储空间。hbase、cassandra、ceph 者E很好的支持。2)纠删码即将一条数据切分成 n等份,通过对这n份数据编码,得到m份相等大小的校验数据块儿。 这n+m份数据,各自存储在不同的节点上,拿到n

10、+m中的任意n份数据,均可计算得到原始的数据。一般n取10,m取3。优点是,只需m/n倍的冗余空间,缺点是读写效率较低, 且耗费cpu。图5纠删码Hbase : hdfs层为hbase提供支持。Cassandra :社区版本不支持,社区还无添加此功能的路线图,之前社区有讨论过此功 能,后来不了了之。 应该是主要考虑到纠删码方式对现有系统的存储结构、 一致性语义 都有较大影响,且性能较低。Ceph :支持。但在功能上有些缺失, 比如不支持 partial read ,适合读远多于写的场景, 应用较少。3) 跨级群自动备份一般为了更高的可靠性,数据会通过准实时备份机制,备份到另外一个 IDC 的存

11、储集群。Hbase :社区版本已经支持。cassandra 和 ceph :都不支持,短期没有路线图,长远来讲,是需要添加的。4) 接入修复客户端写数据到存储集群,一般先按一定规则找到一个接入节点,再由次接入节点做 proxy 将数据写到实际存储的节点。假设需要写入 3 副本,如果接入节点发现,有的副本对应的 存储节点此时不可用, 或者写超时, 那么会将写失败的节点及未写成功的数据存储下来。 之 后,定时或者收到通知不可用节点变为可用时,尝试写入之前未写成功的数据。Hbase : hdfs 层会保证写入足够的副本,因为 hdfs 的 namenode 记录了每个 block 的 meta 数据

12、( block 存储在哪些 datanode ),一个 datanode 写失败,换一个写,直至写 成功。可以看到,记录 meta 这种方式很灵活Cassandra :有 hinthandoff 机制,原理如上Ceph :有 pglog 机制,原理如上5) 全局扫描修复用以修复磁盘损坏、误删文件等原因引起的数据丢失。由 master 节点发起全局数据,或者 primary 节点发起自己负责的 range 的数据,的多个副本间的数据扫描。如果发现某个副本 缺失,则进行修复。 Hbase 、cassandra 、 ceph 都有类似机制,原理类似,机制不同,这里 不一一展开讲了。Hbase :hd

13、fs 层的 data node 在发现盘损坏后,会收集剩下的所有 block 信息,并通知 name node 对比修复Cassandra :基于 Merkle tree 的 anti-entropy 机制Ceph : scrub 和 deep-scrub 机制3. 可用性分布式存储系统,相比传统关系数据库, 有更好的可用性。在个别机器硬件或软件故障,甚 至整个机房断电断网等极端情况下,仍不影响在线读写。对于个别机器硬件或者软件故障, 一般数据保存多份副本或者纠删码方式就能解决。 对于整 个机房断电,只能是多副本的跨 idc 存储,一般分布式存储系统都支持这种方式,只是目前 实际应用的很少。保

14、证可用性, 另外一个影响因素是, 整个系统是否有单点故障。 完全分布式的设计是没有单 点的。集中式的设计,有 meta 信息,需要 meta server 的角色,一般也会将 meta server做成集群式,以避免单点问题。下面结合例子讲下。1) 分布式or集中式Hbase : meta server是集群方式,通过 zk的选举算法选出一个主节点来提供服务,主节点挂掉后,会重新选一个。 所以hbase的meta server也不算是单点的。 但其regionserver 是单点的,即一个 region server 挂掉,在 master 没有为其负责的 region 进行重分配前,这个re

15、gion所负责的range,是无法提供在线读写的。之所以存在此单点问题,猜测因为 hbase设计之初,是为网页库这类离线存储设计的,而非在线服务。另外,region server的这种设计能较方便是实现强一致性和简单事务,后面会提到。现在貌似已有 region server的stand by机制,即一台region server挂掉,另一台准备就绪的能马上接替并提供服务。Hbase架构如下:)7l,-口乱口口亍0匚匚gw*RLiqgfb3寸口 HE兀口*Ja-jxgj口口nrnpanETD5匚口精品资料图6 hbase架构cassandra 和 ceph :是完全分布式的( ceph 虽有 m

16、onitor server ,但仍可理解为完全 分布式的,这里不展开了) ,无单点问题。4. 可扩展性存储系统的可扩展性, 即扩容的难易程度。 可扩展性是分布式系统相比传统关系数据库, 最由于实现方式的不同, 扩容的难易完全分布式的系统会更加麻烦些。 下大的优势。 各分布式存储系统都能很好的支持横向扩展。程度还是有差异的。 一般集中式的系统扩容更加容易, 面结合例子讲下。1) 扩容Hbase :比较容易,扩容的大致过程为:增加一些region server ,由 master server 做一下 balance ,即重新确定 region server 与 region 的对应关系(每个 r

17、egion 负责一定 范围的 key ,对应于 hdfs 上的一组文件) ,完全不需要拖数据。而 hdfs 本身扩容也较 容易,因为有 name node 存在(相当于 master server ,对写入 hdfs 的每个块儿都记 录其存储节点) ,可以将新写入的文件写入到新扩容的 server ,这样不需要拖数据;如 果要考虑写压力均衡(即不把写压力集中在新加入的机器上,仍然写所有机器) ,仍需 要做数据迁移。Cassandra 和 ceph :因为 key 定位是通过 hash 类算法,所以拖数据不可避免。拖的 数据量即新加的 node 所负责的数据量。一致性 hash 和 crush

18、算法不同,导致拖数据 的源节点不一样,但总的来说大同小异。5. 数据一致性一致性分强一致性和最终一致性,解释如下:强一致性:写完一条数据 key1 ,马上读 key1 ,能读到最新数据。最终一致性:写完一条数据 key1 ,马上读 key1 ,可能读到老数据,但一段时间后,能够读 到新数据。最终一致性相比强一致性,有更高的性能。一致性跟 primary 和 replica 在读写时的地位相 关,不同系统在实现上会有不同的取舍,下面具体说明。1) 单主、多主、主从Hbase : region server 是单点,可以理解问题单主方式,天然的强一致性。Cassandra :最终一致性, 通过客户

19、端一致性级别的设置也可实现强一致性。 Cassandra 多个副本节点的地位相同, 可以理解为多主方式, 并列提供读写, 这种方式读写性能很 高,除了牺牲了强一致性,还有造成写冲突问题, cassandra 通过 column 级别的时间 戳解决此问题,但不彻底,时间戳相同时就没有办法了。Ceph :的多个副本间有主从关系, 一主多从, 客户端写主节点, 主节点负责写从节点。 客户端只能读主节点。以此实现强一致性。 Ceph 也支持配置为本地化(就近,不一定 是主节点)读方式,这种方式也牺牲了强一致性。 Ceph 的块儿存储和分布式文件系统 功能,要求它必须支持强一致性。6. 性能前面已经提到

20、,不同的一致性会对性能有影响。另外,还有两点对对性能影响较大:1) 完全分布式 or 集中式集中式架构需要有 meta server 。读操作先查 meta server ,再向 data node 查询真正的 数据;写操作除更新 data node 也可能要更新 meta server 。完全分布式读写则少了与 meta server 交互的过程。所以延时更低。且集中式,在数据量巨大或者压力很大时, meta server 有可能成为性能瓶颈,目前有 meta server 分层、静态子树等解决方案。Hbase :是集中式的,但客户端维护 meta server 的缓存,一般读写时无需网络查

21、询 meta server ,所以从 hbase 这层看,集中式并不影响其性能。但 hdfs 层读写必须要 name node 参与,所以性能低些。 Hbase+hdfs 这种分层架构,有很多好处,但显然性 能会逊一筹。Cassandra :是完全分布式的,客户端可以连接任一台 node 读写,这台接入 node 通 过一致性 hash 定位真正负责此次读写的 node ,再进行读写。效率要比 hbase 高些。Ceph :是完全分布式的,客户端通过 monitor server 得到节点信息,缓存在本地,再 通过 crush 算法, 直接定位到主节点实现读写。 这个角度看, ceph 的效果

22、比 cassandra 更高些。2) 单机存储引擎分布式存储一般采用 LSMT引擎,将随机写转化为顺序写log和memtable (内存)方式,能极大提高写性能。读操作,还是通过索引来提高性能。分布式存储的数据模型一 般是schema-less的,即不需要预先定义每行包括哪些列以及每个列的类型,多行之间允许包括不同的列;一般只有主key索引;不需考虑数据完整性约束 (比如外键约束)、 列类型约束、NOT NULL约束等;所以较适合用LSMT引擎实现,关系数据库则不太适合。Schema-less是分布式存储一般性能较高的原因之一。memtable ”Memory1.GFStablet log|r

23、、0pz.SSTubk Filo图 7 LSMTHbase、cassandra、ceph都是wal的方式。顺序写完 journal log后,写实际数据。写 数据时,hbase和cassandra是写memtable (源自bigtable吧),更多的减少随机写 硬盘。Ceph不是memtable的方式,直接写文件系统,并定时 sync。 Memtable的方 式对小value更加友好,但需要引入的compaction ,compaction 带来了更多的运维工作。Ceph由于其块儿存储功能,经常会修改一个对象的某一小段,如果用memtable的方式,即使修改一小段,也要重写整个对象,效率比较

24、低。7. 易运维性主要是扩容、 顶替(一台机器损坏, 用另外一台机器代替之, 可能涉及到迁移数据) 、升级、 盘故障(数据修复)等操作的快速性和简单性。存储机器一般是 12*2T 盘,现在极端一些有 24*4T 盘。单机存储数据量是很大的。扩容或 者顶替一台机器,一般也要几个小时甚至 1 天的时间。在这段时间内存储系统是处于副本 缺失状态的,万一这段时间好的副本又出问题,后果可能很严重; 所以,要尽量避免数据迁 移或者缩短迁移时间。1) 扩容、顶替、升级Hbase :不考虑 hdfs 的话,其扩容、顶替更容易,因为不涉及迁移数据。 Hbase 因单 点问题, 升级必然影响在线服务, 这一点是一直在努力优化的, 例如之前提到的 region server standby 机制, hdfs 的 name node 的热备机制。Cassandra :由于其 gossi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论