Ceph简介

Ceph简介

什么是分布式存储

与集中式存储相反,分布式存储通常采用存储单元集群的形式,并具有在集群节点之间进行数据同步和协调的机制。分布式存储最初是由Google提出的,其目的是通过廉价服务器解决大规模,高并发情况下的Web访问问题。

分布式存储具有几个优点:

  1. 可扩展性-支持通过在系统中添加或删除存储单元来水平扩展存储系统。
  2. 冗余-在多台服务器之间存储相同数据的复制,以实现高可用性, 备份和灾难恢复目的。
  3. 节省成本 -可以使用更便宜的商品服务器以低成本存储大量 数据。
  4. 性能-在某些情况下,性能比单个服务器更好,例如,它可以将数据存储在离其使用者更近的位置,或者允许大规模并行访问大文件。

起源

Ceph项目最早起源于Sage就读博士期间发表的,并随后贡献给开源社区。在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储。但是在2014年OpenStack火爆的时候、Ceph并不被很多人所接受。当时Ceph并不稳定(Ceph发布的第四个版本 Dumpling v0.67),而且架构新颖,复杂,当时人们对Ceph在生产落地如何保障数据的安全,数据的一致性存在怀疑。

随着OpenStack的快速发展,越来越多的人使用Ceph作为OpenStack的底层共享存储,Ceph在中国的社区也蓬勃发展起来。近两年OpenStack火爆度不及当年,借助于云原生尤其是Kubernetes技术的发展,作为底层存储的基石,Ceph再次发力,为Kubernets有状态化业务提供了存储机制的实现。

优点

  1. 高性能undefineda. 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。undefinedb. 考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。undefinedc. 能够支持上千个存储节点的规模,支持TB到PB级的数据。
  2. 高可用性undefineda. 副本数可以灵活控制。undefinedb. 支持故障域分隔,数据强一致性。undefinedc. 多种故障场景自动进行修复自愈。undefinedd. 没有单点故障,自动管理。
  3. 高可扩展性undefineda. 去中心化。undefinedb. 扩展灵活。undefinedc. 随着节点增加而线性增长。
  4. 特性丰富undefineda. 支持三种存储接口:块存储、文件存储、对象存储。undefinedb. 支持自定义接口,支持多种语言驱动。

服务架构

一个 Ceph 存储集群至少需要一个 Ceph Monitor(监视器)、Ceph Manager(管理器) 和 Ceph OSD(对象存储守护进程)。

ceph-arch.png

Monitors

Ceph Monitor (ceph-mon) 通过维护包括监视器表(MonMap)、管理表(MGRMap)、OSD表(OSDMap)等组件状态表的保障集群正常运行。ceph-osd 相互之间协调工作时,需要从 ceph-mon 中获取这些表的信息。ceph-mon 还负责管理 ceph-osd 和客户端之间的身份验证。一个Ceph集群为了保证冗余和高可用性通常需要至少三个监视器,它们之间通过Paxos同步数据。

Managers

Ceph Manager (ceph-mgr) 负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率、当前性能指标、集群报警和系统负载等。ceph-mon 和 ceph-mgr 协调配合共同维持集群稳定。高可用性通常需要至少两个管理器。

OSDS

Ceph OSD(ceph-osd)全称是Object Storage Device,负责包括处理数据复制、恢复、重新平衡在内的实际数据存储工作,并且一个 OSD 检查可以通过检查其他 OSD 的心跳的方式将其他 OSD 的异常状态上报给 MON。一个Ceph集群一般都有很多个OSD。

逻辑架构

Ceph 将数据作为对象存储在逻辑存储池中。使用 CRUSH算法,Ceph 计算出哪个归置组应该包含该对象,并进一步计算出哪个 Ceph OSD Daemon 应该存储该归置组。CRUSH 算法使 Ceph 存储集群能够动态扩展、重新平衡和恢复。

RADOS: 由自我修复、自我管理、智能存储节点组成的可靠、自主、分布式对象存储。

LIBRADOS: Ceph 供的外部访问的对象存储 API,允许客户端通过此 API 访问Ceph集群完成文件的读写工作,支持 C、C++、Java、Python、Ruby 和 PHP 等多种语言。

ceph-stack.png

用户可以基于自己的业务需要直接 LIBRADOS API 的基础上,开发自己需要的存储业务。社区在 LIBRADOS API 开发了三种成熟的存储产品:块存储、分布式文件存储系统、对象存储。

RADOSGW(Rados Gateway)

基于LIBRADOS API构建的兼容了 s3 和 Swift 协议的 RESTful 网关。

rgw-stack.png

RBD(Rados Block Device)

基于LIBRADOS API构建的,使用了Linux内核client和QEMU/KVM驱动程序的分布式块存储设备。

rbd-stack.png

CEPHFS(Ceph FileSystem)

基于LIBRADOS API构建的,符合POSIX标准的分布式文件系统。Ceph 文件系统 需要至少指定一个metadata存储池和一个data存储池,并且Ceph 文件系统 需要集群至少有一个Metadata服务。

cephfs-stack.png

Ceph逻辑组件

Object

Ceph 最底层的存储单元是 Object 对象,每个 Object 包含元数据和原始数据。

PG

PG 全称 Placement Grouops,是一个逻辑的概念,一个 PG 包含多个 OSD。引入 PG 这一层其实是为了更好的分配数据和定位数据。

CRUSH

CRUSH 是 Ceph 使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。

文件存储

不管是来自 Ceph 块设备、 Ceph 对象存储、 Ceph 文件系统、还是基于 librados 的自定义存储,将数据存储到 Ceph 集群上的步骤大致相同,大概可以归纳为Ceph客户端将数据存放在存储对象中,存储对象经过Ceph集群处理被发送给了 OSD ,由 OSD 将对象持久化到磁盘上。

ceph-file.png

Ceph OSD 在扁平的命名空间内把所有数据存储为对象(也就是没有目录层次)。对象包含一个标识符、二进制数据、和由名字/值对组成的元数据,元数据语义完全取决于 Ceph 客户端。例如, CephFS 用元数据存储文件属性,如文件所有者、创建日期、最后修改日期等等。

IO流程

ceph-osd-io.png
  1. client 创建 cluster handler。
  2. client 读取配置文件。
  3. client 连接上 monitor,获取集群 map 信息。
  4. client 读写 io 根据 crshmap 算法请求对应的主 osd 数据节点。
  5. 主 osd 数据节点同时写入另外两个副本节点数据。
  6. 等待主节点以及另外两个副本节点写完数据状态。
  7. 主节点及副本节点写入状态都成功后,返回给 client,io 写入完成。

ceph-logical-io.png
  1. File 用户需要读写的文件。File->Object 映射:undefineda. ino (File 的元数据,File 的唯一 id)。undefinedb. ono(File 切分产生的某个 object 的序号,默认以 4M 切分一个块大小)。undefinedc. oid(object id: ino + ono)。
  2. Object 是 RADOS 需要的对象。Ceph 指定一个静态 hash 函数计算 oid 的值,将 oid 映射成一个近似均匀分布的伪随机值,然后和 mask 按位相与,得到 pgid。Object->PG 映射:undefineda) hash(oid) & mask-> pgid 。undefinedb) mask = PG 总数 m(m 为 2 的整数幂)-1 。
  3. PG(Placement Group),用途是对 object 的存储进行组织和位置映射, (类似于 redis cluster 里面的 slot 的概念) 一个 PG 里面会有很多 object。采用 CRUSH 算法,将 pgid 代入其中,然后得到一组 OSD。PG->OSD 映射:undefineda) CRUSH(pgid)->(osd1,osd2,osd3) 。

Ceph编排工具

Ceph社区开发了多种编排工具,方便你快速构建一个Ceph集群。

如果你想在物理机上以传统后台服务的方式运行你的集群,可以使用基于ansible框架开发的ceph-ansible。

https://docs.ceph.com/projects/ceph-ansible/en/latest/index.html

如果你希望你的集群运行在物理机上的docker容器中,可以使用cephadm工具。

https://docs.ceph.com/en/quincy/cephadm/#cephadm

如果你希望你的集群运行在Kubernetes中,运行在云服务器上,可以使用rook-ceph。

https://rook.io/docs/rook/v1.10/Getting-Started/intro/

参考

原文地址:https://cloud.tencent.com/developer/article/2150780

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340