前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ceph架构概览

Ceph架构概览

作者头像
用户4700054
发布2022-08-17 11:29:38
1.3K0
发布2022-08-17 11:29:38
举报
文章被收录于专栏:存储内核技术交流

Ceph架构是什么样的?

  • 总体概览
  • 架构模块
  • ceph包括了底层最核心的rados,这个包含了monitor、mds、osd.
  • rados之上有一层librados,提供底层服务的接口
  • librados之上有三个服务,分别是cephfs、rbd、rgw
Ceph提供了哪几种类型的服务?
  • 基于多语言的API接口
  • RESTFul 接口,类似于(S3/Swift)
  • 块设备接口
  • 文件系统接口
部署一个ceph都包含了哪些组件?各自都是干什么的?
  • 部署一个Ceph集群,目前有如下进程组成
    • Ceph OSD Daemon,这是ceph用户处理客户端数据的进程,提供EC数据编码、数据均衡、数据恢复、监控等功能。目前每一个磁盘或者lvm对应一个osd进程,用于处理请求过来的数据
    • Ceph Monitor, Monitor进程维护了整个集群的各种map信息,包括osd map、mds map、pg map、 mon map等信息。整个集群采用了Paxos共识算法来保证整个集群维护数据的一致性。
    • Ceph Manager,Manager进程维护了PG的详细信息。处理来自客户端的只读的cli请求,比如pg的统计信息同时ceph也提供RESTful的监控API
客户端是如何读取数据的?
  • ceph客户端维护object id列表和object存储的pool信息。但是不维护object->osd的映射关系。为了读取数据,客户端需要访问monitor进程获取当前整个集群的cluster map信息。客户端提供object名称和pool名称给librados,librados计算object 所在的pg,根据crush算法在找到主的osd.客户端直接和主osd通信进行读写操作。
  • osd存储数据是采用扁平的方式,每个对象有一个唯一的ID,同时包括了数据和元数据。
Ceph Pool有哪些?
  • Pool Type,Ceph提供了2中Pool的类型,一种是三副本;另外一种是EC。Pool一旦创建就不能进行更改,数据也是基于Pool类型来进行存储
  • Placement Groups,Ceph的Pool存储上亿个对象对象,执行各种各样的复杂操作,比如通过多副本或者EC进行数据持久化、数据的CRC检查、数据复制、负载均衡、恢复等。基于每个数据对象的管理的扩展性和性能会是一个瓶颈。Ceph是通过在pool中放置placement groups来解决这个问题。首先crush算法计算数据对象的placement group和placement group对应的一组osd,两层映射关系,然后通过crush算法把每个placement group存储在一组osd中。
  • CRUSH Ruleset,CRUSH扮演这另外一个很重要的角色。crush可以检测osd的冗错域和性能。crush可以识别osd的存储介质和水平组织node、racks、rows等不同的域.crush算法可以把数据对象存储在不同的域,防止osd失效。比如一个数据存储在不同的nodes、racks,如果集群中有一些osd宕机,集群依然可以操作直到整个集群恢复。
  • Durability,在大规模存储集群中,硬件故障是非常平常的事情。ceph提供了2种存储策略
    • Replica Pool,使用crush算法把数据对象放到跨冗错域的osd上。也就是数据对象放到不同的node或者racks下的node的磁盘上。
    • Erasure Code Pool,每个数据对象被划分为K+M的分片,K是分片是数据对象分片数,M是数据对象校验分片。
Ceph Placement Groups 是什么?
  • Ceph采用Placement Group来存储数据对象,同时PG也是一个Pool的子集。Ceph把很多PG在分散Pool中,然后通过获取到集群的map信息和状态通过crush算法把pg伪随机分布到集群的osd中
Ceph Placement Groups怎么工作的?
  • 当用户创建pool过程中,crush来创建这个pool中的pg数量。通常来讲PGs的数量应该是一个合理数值。例如每个osd中有100个PG,这就意味着每个pg包含了整个pool的1%的数据。
  • PGs的数量会影响性能,这涉及到pg在osd之间的移动。如果出现了osd的故障或者异常情况,一个pool有少量的pg,ceph会迁移大量pg,到一个可用的osd中,同时pg中包含了大量的数据对象,这涉及的迁移数据量太多对于集群性能影响调大。如果一个pool中包含了非常多的pg,虽然迁移的数据量小了,但是会消耗更多的CPU和内存。一般会采用如下公式进行计算PG的数量
代码语言:javascript
复制
              (OSDs * 100)
   Total PGs =  ------------
                 pool size
Crush算法和PG在集群扩容或者osd失效情况下是什么样的行为?
  • 集群扩容,当添加新机器或者新osd到集群,cluster map改变了。添加新的osd意味着crush算法伪随机把原来osd中的pg迁移到新的osd中,这个是自动的过程。
  • osd宕机,当osd宕机,集群的状态改变了,采用副本或者EC。如果是主的osd宕机,从的osd立马充当主的osd,原来宕机的osd中的pg中的数据,通过crush算法迁移到其他的osd中
  • 一旦ceph集群中cluster map或者cluster state改变,crush会自动计算哪一个osd改变了。比如客户端写入数据testdata到pool A,crush算法把testdata放到PG 1中,然后存储在osd5中。osd5和osd10、osd15互为副本。如果osd5宕机了,集群状态改变了,ceph客户端从pool A读取数据testdata,通过librados自动从osd10(osd5宕机,osd10成为了主osd)读取
Crush Ruleset是什么?
  • crush ruleset 是整个osd的容灾top图,crush ruleset是给pool使用的,当客户端从pool获取数据,ceph会识别cursh ruleset.使用crush ruleset的规则,选择top-level的bucket来获取数据。当ceph进程处理crush rule,会识别出主osd,ceph客户端会直接和主osd进行连接,读写主osd中的pg中的数据对象
Ceph的读写操作是什么样的流程?

ceph 客户端从ceph monitor获取cluster map,然后执行在pool中的pg执行IO操作。cursh ruleset和pg的数量是决定数据对象放在哪里的核心因素。获取到最新的cluster map,ceph客户端是不知道数据对象在哪里。

只有写操作需要客户端的object id和pool名称,ceph把数据存储在pool中。当客户端写入数据对象时候,会输入object的哈希、pg的数量、pool名称作为写入参数,然后使用crush计算对应哪个pg id和主的osd.客户端会经过如下几个步骤计算PG ID:

代码语言:javascript
复制
1.客户端使用pool id和object id作为参数,然后根据object id进行哈希计算
2.crush拿到object id和哈希值,哈希值针对当前pool中所有的pg数量总数取余,获得pg id
3.crush通过crush规则计算出pg id对应的主osd
4.客户端在PG ID前加上pool ID,例如4.58,然后客户端这对数据对象的读写删操作直接和主的osd进行操作

ceph集群的topology和state是相对稳定的。让一个Ceph客户端通过librados来计算对象位置比要求客户端查询存储集群要快得多对于每个读/写操作。cursh算法允许客户端计算object存储在哪个位置,同时允许ceph客户端直接和主osd进行读写数据。如果集群的状态改变,ceph客户端可以直接从ceph minotor请求并且更新集群状态信息。

Ceph的多副本介绍
  • 和ceph客户端一样,ceph的osd可以从ceph monitor获取最新的cluster map信息。ceph的osd可以使用crush算法,osd使用crush算法数据对象存储需要的pg id和主osd。当客户端写数据对象到主的osd,主的osd发现需要些副本,这个是副本的值是通过osd_pool_default_size来定义,然后主的osd拿到object id、pool名称、集群的map,然后使用cursh算法来计算从的osd的位置,然后主osd通过集群网络写数据对象到从的osd,完成后主的osd通知客户端写入成功。
  • ceph在实际使用中一般会设置3副本pool,这样ceph的机制允许客户端在一个osd宕机后继续可以读写。但是如果是2副本,宕机一个osd,为了保证数据的一致性ceph集群对外会停止写服务。在ec pool中,ceph提供8+3、8+4、4+2的这三种EC的编码方式
Ceph的纠删码介绍
  • Ceph可以加载很多EC的算法,早期是使用Reed-Solomon算法。纠删码实际会把数据分为K个数据块和M个校验块。数据对象划分为N块,N=K+M.K个块是原始数据块,M是冗余的块。纠删码模式下允许M个块损坏,数据依然可以访问。比如10个数据块,6个校验块,一共16个块分布式16个osd中,原始10个数据块可以从6个osd中进行恢复。即使6个osd宕机,ceph集群也不会都是数据。
  • 和副本池类似,ec pool中的主osd负责负责数据所有的写操作。在replica pool中,每个数据对象都有副本。对于ec pool处理是有一些不同的。ec pool存储每个数据对象,数据对象被华为k+m个块,k个数据块,m个校验块。k+m个块分散pool的osd中。同时ceph也会存储每个数据分片的rank作为数据对象的属性。主的osd负责纠删编码k+m个块,然后发送给其他的osd。
Ceph的ObjectStore是什么?

ObjectStore提供了low-level的接口给osd的裸设备使用。当客户端read/write数据,直接和ObjectStore接口交互。ceph写操作具有ACID的事务的。ObjectStore写入一个事务要么成功要么失败,这是体现了原子性。数据对象存在ceph集群有一个唯一的编号、数据、元数据,因此ObjectStore根据这些信息来保证数据对象的一致性。ObjectStore通过顺序写操作来保证隔离性。osd提供副本或者EC pool的接口,这体现了持久性。ceph实现了如下方式存储引擎存储数据

代码语言:javascript
复制
1.FileStore:企业生产级别的使用文件系统存储数据对象
2.BlueStore:企业生产级别使用裸设备存储对象数据
3.MemeStore:开发级别用于在内存测试读写操作
4.K/V Store:ceph内部实现的key/value数据库

BlueStore介绍
  • 针对ssd或者非易失内存、NVME,采用FileStore实现对象存储有太多的限制。因此ceph自研了BlueStore来消除这些限制,直接接管裸设备来数据对象。BlueStore使用了非常轻量级的BlueFS来适配k/v database.同时BlueStore也消除了FileStore的写放大问题。
  • BlueStore存储了哪些数据呢?
    • object data:ceph存储裸设备上的block信息,以object作为block.
    • Block Database:block database中处理对象语义保证一致性。一个对象有唯一的ID,ID作为key存储block database中,value是有一系列的block地址(这些地址存储了数据对象、数据对象所在的pg、数据对象的元数据)。
    • Write-ahead Log:wal 日志保证了原子性,这个和FileStore的journaling日志相似。BlueStore记录了事务信息。
Ceph集群自身管理涉及哪些操作?
  • osds的健康检查,然后上报自身的健康状态给monitor
  • 通过cursh算法把数据对象映射到pg,同时也会把pg映射到一组osd中
  • osd自身也会使用crush算法来做数据均衡和恢复其他宕机osd中数据
Ceph 心跳有哪些?
  • 当osd加入到集群,osd会上报自身的状态给montior,一般osd会有up和down状态来反应osd是否是运行正常和客户端是否可以从这个osd请求数据。
  • 如果osd宕机,monitor会定期ping这个osd是否正常;同时osd之间也会进行心跳探测,然后上报状态给monitor
Ceph的数据均衡和恢复如何工作的?
  • 当添加新的osd到集群,cluster map会更新,cluster map更新也就以为需要改变数据对象的存储位置,这是cluster map更改,导致由于crush算法计算的输入变化了。当新添加osd时候,会从其他的osd迁移" 少量"的数据到新的osd中。比如集群中有50个osd,新添加一个osd,在新的osd中会有1/50的数据迁移到新的osd中。
Ceph如何保证数据完整性?
  • Scrubbing,osd进程会在副本间的数据扫描操作,以检测副本间的数据一致性。Scrubbing通常是每天执行执行。osd也会深度比较副本间的数据对象(一个比特一个比特比较),这种Deep Scrubbing是每周执行一次,这种能发现磁盘驱动器出现坏道
  • CRC Checks,在Ceph L版本以后采用了BlueStore,它可以通过CRC算法来校验写操作,然后存储CRC的值在BlueStore中的block database中。读取的时候从block database获取CRC 的值,然后和当前读取到数据对象的CRC来进行比较,来保证数据的一致性
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 存储内核技术交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Ceph架构是什么样的?
    • Ceph提供了哪几种类型的服务?
      • 部署一个ceph都包含了哪些组件?各自都是干什么的?
        • 客户端是如何读取数据的?
          • Ceph Pool有哪些?
            • Ceph Placement Groups 是什么?
              • Ceph Placement Groups怎么工作的?
                • Crush算法和PG在集群扩容或者osd失效情况下是什么样的行为?
                  • Crush Ruleset是什么?
                    • Ceph的读写操作是什么样的流程?
                    相关产品与服务
                    对象存储
                    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档