首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Ceph 分布式存储简介

本文是我入门研究 Ceph 时的一些理解,疏漏或错误之处还请多指教。

简书原文 https://www.jianshu.com/p/3100942d967c

PDF https://github.com/shenvx/mycloud/blob/master/mynotex/ceph-introduction.pdf

前言

Ceph 是一个可靠的、可扩展的高性能分布式存储系统。Ceph 抛弃了基于查表的数据寻址,改用基于计算的数据寻址,使得其非常适合海量小文件的存储。 基于 RADOS 出色的设计,Ceph 用统一的系统提供了分布式对象存储、块存储和文件存储。

Ceph 的底层是 RADOS,Ceph 所有的存储功能都是基于 RADOS 实现。

Ceph 的上层应用调用本机上的 librados,再由 librados 通过 Socket 与 RADOS 集群中的其他节点通信并完成各种操作。

RADOS GateWay 和 RADOS BlockDevice 是在 librados 库的基础上提供抽象层次更高、更便于应用或客户端使用的上层接口。

RADOS GateWay 提供了与 Amazon S3 和 Swift 兼容的 RESTful API,以供相应的对象存储应用开发使用。

RADOS BlockDevice 提供了一个标准的块设备接口,常用于在虚拟化的场景下为虚拟机创建 Volume。

CephFS 提供了 POSIX 接口,用户可直接通过客户端挂载使用。

存储的数据首先被切分成对象(Objects)。ObjectsSize 大小可以调整,通常为 2M 或 4M。

每个对象都会有一个唯一的 oid,由 ino 与 ono 生成。ino 是文件的 File ID,用于在全局唯一标示每一个文件,而 ono 则是分片的编号。

例,一个文件 FileID 为 A,它被切成了两个对象,一个对象编号 0,另一个编号 1,那么这两个文件的 oid 则为 A0 与 A1。

oid 唯一标示了每个不同的对象,并且存储了对象与文件的从属关系,Ceph的所有数据都虚拟成了统一的对象。

但是对象并不会直接存储进 OSD 中,因为对象很小,在一个大规模的集群中可能有极大规模的对象。

如果将对象直接通过某种固定映射的哈希算法映射到 OSD 上。当这个 OSD 的数量变化时,对象无法自动迁移至其他 OSD 上面。

PG 是一个逻辑概念,每个对象都会固定映射进一个 PG 中。

首先使用静态 Hash 函数对 oid 做 Hash,用 Hash 值与 PG 的数量去模,得到的序号则是 PGID。

通过 CRUSH 算法计算出候选 OSD,存储到这些节点上。第一个 OSD 节点为主节点,其余均为从节点。

Ceph 的读写操作采用主从模型,客户端要读写数据时,只能向对象所对应的主 OSD 节点发起请求。

主节点在接受到写请求时,会同步的向从 OSD 中写入数据。

当所有的 OSD 节点都写入完成后,主节点才会向客户端报告写入完成的信息,保证主从节点数据的高度一致性。

读取的时候,客户端也只会向主 OSD 节点发起读请求,并不会有类似于数据库中的读写分离的情况出现,这也是出于强一致性的考虑。

由于所有写操作都要交给主 OSD 节点来处理,所以在数据量很大时,性能可能会成为瓶颈。

顶层是一个 root bucket,每个 root 下有四个 row 类型 bucket,每个 row 下面有 4 个 cabinet,每个 cabinet 下有若干个 OSD。

图中有 4 个 host,每个 host 有若干个 OSD。

在 map 中并没有设置 host 这一级别的 bucket,直接把 4 个 host 上的 OSD 设备定义为一个 cabinet

1)选中 rootbucket 作为下一个步骤的输入。

2)从 root 类型的 bucket 中选择一个 row 类的子 bucket,其选择的算法在 root 的定义中设置,一般设置为 straw2 算法。

3)从上一步的输出 row 中,选择三个 cabinet,其选择的算法在 row 中定义。

4)从上一步输出的三个 cabinet 中,分别选择一个 OSD,并输出。

1)首先 take 操作选择 ssd为 root 类型的 bucket。

2)在 ssd 的 root 中先选择一个 host,然后以该 host 为输入,递归至叶子节点,选择一个 osd设备。

3)输出选择的设备,也就是 ssd 设备。

4)选择 hdd 作为 root 的输入。

5)选择 2 个 host(副本数减一,默认 3 副本),并分别递归选择一个 OSD 设备,最终选择出两个 hdd 设备。

6)输出最终的结果。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180423G0XCRG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券