分布式存储系统的一些理解和实践
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.数据可靠性
数据可靠性,即数据不丢失,是存储系统的第一职责。