《分布式存储系统的一些理解和实践》.docVIP

  • 1
  • 0
  • 约1.22万字
  • 约 14页
  • 2020-01-25 发布于天津
  • 举报

《分布式存储系统的一些理解和实践》.doc

分布式存储系统的一些理解和实践 张建伟 分布式存储系统介绍 简介 互联网数据规模越来越大,并发请求越来越高,传统的关系数据库,在很多使用场景下并不能很好的满足需求。分布式存储系统应运而生。它有良好的扩展性,弱化关系数据模型,甚至弱化一致性要求,以得到高并发和高性能。按功能分类,主要有以下几种: 分布式文件系统 hdfs ceph glusterfs tfs 分布式对象存储 s3(dynamo) ceph bcs(mola) 分布式表格存储 hbase cassandra oceanbase 块存储 ceph ebs(amazon) 分布式存储系统,包括分布式系统和单机存储两部分;不同的系统,虽在功能支持、实现机制、实现语言等方面是有差异的,但其设计时,关注的关键问题是基本相同的。单机存储的主流实现方式,有hash引擎、B+树引擎和LSM树(Log Structured Merge Tree)三种,不展开介绍。本文第二章节,主要结合hbase、cassandra和ceph,讲下分布式系统设计部分,需要关注的关键问题。 适用场景 各分布式存储系统功能定位不尽相同,但其适用和不适用的场景,在一定程度上是相同的,如下。 适用 大数据量(大于100T,乃至几十PB) key/value或者半结构化数据 高吞吐 高性能 高扩展 不适用 Sql查询 复杂查询,如联表查询 复杂事务 分布式存储系统设计要点 数据分布 分布式存储,可以由成千甚至上万台机器组成,以实现海量数据存储和高并发。那它最先要解决的就是数据分布问题,即哪些数据存储在哪些机器(节点)上。常用的有hash类算法和用meta表映射两种方式。一般完全分布式的设计(无master节点),会用hash类算法;而集中式的设计(有master节点)用meta表映射的方式。两者各有优缺点,后面讲到具体问题时再做比较。 一致性hash 将存储节点和操作的key(key唯一标识存储的object,有时也叫object name)都hash到0~2的32次方区间。映射到如下环中的某个位置。沿操作key的位置顺时针找到的第一个节点即为此key的primary存储节点。如下图所示: 图1 一致性hash Cassandra借鉴了dynamo的实现,用了一致性hash的方式。节点的hash值(也叫token),可以手动分配或者自动生成。Key的hash值即md5(key)。每个表可以在建表时指定副本数,当副本数为3时,找primary存储节点后,顺时针方向的下2个存储节点即为replica存储节点。 Hash类算法,优点是无需master节点,一个缺点是,不支持key的顺序扫描。 Crush算法 也是一种类hash算法,随着ceph诞生,也是ceph的一大亮点。Crush算法比较复杂,这里简化介绍下。 Ceph的每个Object最终都会映射到一组OSD中,由这组OSD保存这个Object,映射流程如下: Object → PG → OSD set OSD先理解为机器节点吧 PG即Placement Groups,可以理解为存储在同一组OSD上的object的集合 Object先映射到PG(Placement Group),再由PG映射到OSD set。每个表空间有固定数量的pg,在建表时指定。每个Object通过计算hash值并对pg数量取模得到它所对应的PG。PG再映射到一组OSD(OSD的个数由表的副本数决定,也是建表时指定),第一个OSD是Primary,剩下的都是Replicas。 PG → 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个副本分布在机架3的服器上,第3个副本分布在机架4的服务器上。具体实现不再展开。 图2 ceph crush算法 伪代码如下所示: locator = object_name obj_hash = hash(locator) pg = obj_hash % num_pg osds_for_pg = crush(pg) # returns a list of osds primary = osds_for_pg[0] replicas = osds_for_pg[1:]

文档评论(0)

1亿VIP精品文档

相关文档