分布式存储系统的一些理解和实践

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分布式存储系统的一些理解和实践

张建伟

一、分布式存储系统介绍

1.简介

互联网数据规模越来越大,并发请求越来越高,传统的关系数据库,在很多使用场景下并不能很好的满足需求。分布式存储系统应运而生。它有良好的扩展性,弱化关系数据模型,甚至弱化一致性要求,以得到高并发和高性能。按功能分类,主要有以下几种:

✧分布式文件系统

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,讲下分布式系统设计部分,需要关注的关键问题。

2.适用场景

各分布式存储系统功能定位不尽相同,但其适用和不适用的场景,在一定程度上是相同的,如下。

1)适用

大数据量(大于100T,乃至几十PB)

key/value或者半结构化数据

高吞吐

高性能

高扩展

2)不适用

Sql查询

复杂查询,如联表查询

复杂事务

二、分布式存储系统设计要点

1.数据分布

分布式存储,可以由成千甚至上万台机器组成,以实现海量数据存储和高并发。那它最先要解决的就是数据分布问题,即哪些数据存储在哪些机器(节点)上。常用的有hash类算法和用meta表映射两种方式。一般完全分布式的设计(无master节点),会用hash类算法;而集中式的设计(有master节点)用meta表映射的方式。两者各有优缺点,后面讲到具体问题时再做比较。

1)一致性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的顺序扫描。

2)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:]

Crush相比一致性hash更加灵活。

3)按range查表

由master节点记录和管理每个表range的粒度,以及每个range的数据存储在哪些节点上。range是根据key的字节序确定。Client在执行key存取操作是,先到master,根据其所在range,

查询其存储在哪些节点;再直接跟存储节点交互,实现存取。

Hbase是用这种方式实现,支持key的顺序扫描。

如下图所示,region即一段range的数据(存储在mater server上),region sever即实际存储节点。

图3 hbase region映射

2.数据可靠性

数据可靠性,即数据不丢失,是存储系统的第一职责。

相关文档
最新文档