ceph容量损耗(ceph容量损耗计算公式)

ceph容量损耗(ceph容量损耗计算公式)在部署完 Ceph 集群之后 一般地我们可以通过 Ceph df 这个命令来查看集群的容量状态 但是 Ceph 是如何计算和管理的呢 相信大家都比较好奇 因为用过 ceph df 这个命令的人都会有这个疑问 它的输出到底是怎么计算的呢 为什么所有 pool 的可用空间有时候等于 GLOBAL 中的可用空间 有时候不等呢 带着这些疑问我们可以通过分析 ceph df 的实现 来看看 Ceph 是如何计算容量和管理容量的

大家好,我是讯享网,很高兴认识大家。



在部署完Ceph集群之后,一般地我们可以通过Ceph df这个命令来查看集群的容量状态,但是Ceph是如何计算和管理的呢?相信大家都比较好奇。因为用过 ceph df这个命令的人都会有这个疑问,它的输出到底是怎么计算的呢?为什么所有pool的可用空间有时候等于GLOBAL中的可用空间,有时候不等呢? 带着这些疑问我们可以通过分析ceph df的实现,来看看Ceph是如何计算容量和管理容量的。

一般情况下ceph df的输出如下所示:

从上面的输出可以看到,ceph对容量的计算其实是分为两个维度的。一个是GLOBAL维度,一个是POOLS的维度。

GLOBAL 维度中有SIZE,AVAIL,RAW USED,%RAW USED。

POOLS 维度中有 USED,%USED,MAX AVAIL,OBJECTS。

我们这里先把注意力放在RAW USED,和AVAIL上。这个两个分析清楚之后,其它的也就迎刃而解了。

这里我们粗略算一下GLOBAL中的RAW USED 为91706M,明显大于下面pool 中USED 20480k*3 + 522bytes*3啊。而且各个pool的MAX AVAIL 相加并不等于GLOBAL中的AVAIL。我们需要深入代码分析一下为什么。

Ceph 命令基本上都是首先到Montior这里,如何Monitor能处理请求,就直接处理,不能就转发。

我们看看Monitor是如何处理ceph df这个命令的。Monitor处理命令主要是在Monitor::hanlde_command函数里。

从上面的代码可以知道,主要是两个函数完成了df命令的输出。一个是pgmon()->dump_fs_stats,另一个是pgmon()->dump_pool_stats。

dump_fs_stats 对应GLOBAL这个维度。dump_pool_stats对应POOLS这个维度。


讯享网

  • GLOBAL维度

从PGMonitor::dump_fs_stats开始:

可以看到相关字段数值的输出主要依赖pg_map.osd_sum的值,而osd_sum是各个osd_stat的总和。所以我们需要知道单个osd的osd_stat_t是如何计算的。

从上面我们可以看到update_osd_stat 主要是通过osd->store->statfs(&stbuf),来更新osd_stat的。因为这里使用的是Filestore,所以需要进入FileStore看其是如何statfs的。

可以看到上面FileStore主要是通过::statfs()这个系统调用来获取信息的。这里的basedir.c_str()就是data目录。所以osd_sum计算的就是将所有osd 数据目录的磁盘使用量加起来。回到上面的输出,因为我使用的是一个磁盘上的目录,所以在statfs的时候,会把该磁盘上的其它目录也算到Raw Used中。回到上面的输出,因为使用两个OSD,且每个OSD都在同一个磁盘下,所以GLOBAL是这么算的

1

同上,就知道Ceph如何算Raw Used,AVAIL的。

  • POOLS维度

从PGMonitor::dump_pool_stats()来看,该函数以pool为粒度进行循环,通过 pg_map.pg_pool_sum来获取pool的信息。其中USED,%USED,OBJECTS是根据pg_pool_sum的信息算出来的。而MAX AVAIL 是单独算出来的。

这里有一张图,可以帮助同学们梳理整个的流程。中间仅取了一些关键节点。有一些省略,如想知道全貌,可以在PGMonitor::dump_pool_stats查阅。

2

通过分析代码我们知道,pool的使用空间(USED)是通过osd来更新的,因为有update(write,truncate,delete等)操作的的时候,会更新ctx->delta_stats,具体请见ReplicatedPG::do_osd_ops。举例的话,可以从处理WRITE的op为入手点,当处理

这里会将变化的pg的stat_queue_item入队到pg_stat_queue中。然后设置osd_stat_updated为True。入队之后,由tick_timer在C_Tick_WithoutOSDLock这个ctx中通过send_pg_stats()将PG的状态发送给Monitor。这样Monitor就可以知道pg的的变化了。

可用空间,即MAX AVAIL的值,计算稍微有点复杂。Ceph是先计算Available的值,然后根据副本策略再计算MAX AVAIL的值。Available的值是在get_rule_avail()中计算的。在该函数中通过get_rule_weight_osd_map()算出来一个有weight的osd列表。

注意这里的weight一般是

这么描述有些抽象了,具体举一个例子。比如这里我们的pool中有三个osd,假设kb_avail都是400G

即,

{osd_0: 0.9, osd_1, 0.8, osd_2: 0.7}。计算出来的weight值是{osd_0: 0.9/2.4,osd_1: 0.8/2.4,osd_2: 0.7/2.4}

这样后面用osd的available 空间除以这里的weight值,这里的Available的值就是400G*0.7/2.4。这里附上一个公式,可能更直观一些。

然后根据你的POOL的副本策略不同,POOL的AVAL计算方式也不同。如果是REP模式,就是直接除以副本数。如果是EC模式,则POOL的AVAL是A

所以一般情况下,各个POOL的MAX AVAIL之和与GLOBAL的AVAIL是不相等的,但是可以很接近(相差在G级别可以忽略为接近)。

分析到这里,我们知道CEPH中容量的计算是分维度的,如果是GLOBAL维度的话,因为使用的是osd的所在磁盘的statfs来计算所以还是比较准确的。而另一个维度POOLS

由于需要考虑到POOL的副本策略,CRUSH RULE,OSD WEIGHT,计算起来还是比较复杂的。容量的管理主要是在OSD端,且OSD会把信息传递给MON,让MON来维护。

计算osd weight值比较复杂,这里附上算weight的函数,添加了一些注释,有助于感兴趣的同学一起分析。

小讯
上一篇 2025-04-14 17:26
下一篇 2025-05-02 08:38

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/179050.html