Ceph太多pgs per osd:所有你需要知道的

时间:2016-09-20 08:54:01

标签: storage ceph

我同时得到这两个这些错误。我无法减少pg数量,也无法增加存储空间。

这是一个新的群集,当我上传大约40GB时,我收到了这些警告。我想是因为radosgw创造了一堆游泳池。

如果ceph每个osd有太多的pgs,但每pg的对象多于平均值,而pgs建议太少了?

HEALTH_WARN too many PGs per OSD (352 > max 300); 
pool default.rgw.buckets.data has many more objects per pg than average (too few pgs?)

osds: 4 (2 per site 500GB per osd)
size: 2 (cross site replication)
pg:  64
pgp: 64
pools: 11

使用rbd和radosgw,没什么特别的。

2 个答案:

答案 0 :(得分:25)

我将回答我自己的问题,希望能够对这个问题或对ceph内部的类似误解有所了解。

一次性修复HEALTH_WARN每个OSD(352>最大300)的过多PG

平衡展示位置组时,您必须考虑到:

我们需要的数据

  • pgs per osd
  • 每泳池数
  • pool per osd
  • 粉碎地图
  • 合理的默认值pg和pgp num
  • replica count

我将使用我的设置作为示例,您应该可以将其用作自己的模板。

我们拥有的数据

  • num osds:4
  • num sites:2
  • pgs per osd:???
  • 每个泳池
  • pgs:???
  • pool os osd:10
  • 合理的默认值pg和pgp num:64(...或者是吗?)
  • 副本数:2(跨站点复制)
  • 粉碎地图

ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY root ourcompnay site a rack a-esx.0 host prdceph-strg01 osd.0 up 1.00000 1.00000 osd.1 up 1.00000 1.00000 site b rack a-esx.0 host prdceph-strg02 osd.2 up 1.00000 1.00000 osd.3 up 1.00000 1.00000

我们的目标是在'???'上面填写HEALTH OK群集所需的内容。我们的池在初始化时由rados网关创建。 我们有一个default.rgw.buckets.data,其中存储了所有数据,其余的池是管理性的,内部是cephs元数据和簿记。

PGs per osd(无论如何,这是一个合理的默认值???)

文档将让我们使用此计算来确定每个osd的pg计数:

 (osd * 100)
----------- = pgs UP to nearest power of 2
 replica count

据说,向上舍入是最佳的。所以我们目前的设置是:

 (4 * 100)
----------- = (200 to the nearest power of 2) 256
    2
  • osd.1~ = 256
  • osd.2~ = 256
  • osd.3~ = 256
  • osd.4~ = 256

这是推荐的 max 每个osd的pgs数。那么......你目前到底有什么?为什么它不起作用?如果你设置了一个 '合理的默认'并理解上述为什么ISN的工作!!! > = [

可能,有几个原因。我们必须了解那些合理的默认值'以上实际上意味着,ceph如何应用它们以及在哪里。有人可能会误解,我可以像这样创建一个新的池:

ceph osd pool create <pool> 256 256

或者我甚至可能认为我可以安全地播放并遵循说明(128 pgs for < 5 osds)可以使用的文档:

ceph osd pool create <pool> 128 128

这是错误的,平坦的。因为它决不能解释ceph与这些数字一起行动的关系或平衡 从技术上讲,正确的答案是:

ceph osd pool create <pool> 32 32

让我解释一下原因:

如果像我一样,您为群集配置了合理的默认设置&#39; (128 pgs for < 5 osds)一旦你尝试用rados做任何事情,就会创建一大堆池,你的集群也会出现问题。 原因是因为我误解了上面提到的一切之间的关系。

  • pool:10(由rados创建)
  • 每个池
  • pgs:128(在文档中推荐)
  • osds:4(每个站点2个)

10 * 128 / 4 = 320 pgs per osd

这个~320可能是我的群集上每个osd的pgs数。但是,ceph可能会以不同的方式分发这正是发生的事情 超过上面所述的 256 max osd 。我的群集HEALTH WARNHEALTH_WARN too many PGs per OSD (368 > max 300)

使用this命令,我们可以更好地看到数字之间的关系:

pool :17 18  19  20  21  22  14  23  15  24  16 | SUM
------------------------------------------------< - *total pgs per osd*
osd.0 35 36  35  29  31  27  30  36  32  27  28 | 361
osd.1 29 28  29  35  33  37  34  28  32  37  36 | 375
osd.2 27 33  31  27  33  35  35  34  36  32  36 | 376
osd.3 37 31  33  37  31  29  29  30  28  32  28 | 360
-------------------------------------------------< - *total pgs per pool*
SUM :128 128 128 128 128 128 128 128 128 128 128

您拥有的游泳池数量与分配给它们的展示位置组数量之间存在直接相关。 我上面的片段中有11个游泳池,它们每个都有128个pgs,而且太多了!我的合理默认值是64!那发生了什么?

我误解了合理的违约行为&#39;正在被使用。当我将默认值设置为64时,你可以看到ceph将我的暗粉映射考虑在内 我在站点a和站点b之间有失败域。 Ceph必须确保网站a上的所有内容至少可以在网站b上访问。

WRONG

site a
osd.0
osd.1 TOTAL of ~ 64pgs

site b
osd.2 
osd.3 TOTAL of ~ 64pgs

我们需要每个游戏总计64 pgs 所以我们合理的默认值应该从一开始就设置为32!

如果我们使用ceph osd pool create <pool> 32 32这相当于我们的 pgs per pool pgs per osd 之间的关系,那些&#39;合理的默认值& #39;我们推荐的 max pgs per osd开始有意义了:

所以你打破了你的群集^ _ ^

不要担心我们会修复它。我担心的程序可能会因风险和时间而异,具体取决于您的群集有多大。但唯一的方法 改变这种情况是为了增加更多存储空间,以便放置组可以在更大的表面区域上重新分配。或者我们必须将一切都移到 新创建的池。

我将展示移动default.rgw.buckets.data池的示例:

old_pool=default.rgw.buckets.data
new_pool=new.default.rgw.buckets.data

使用正确的pg计数创建一个新池:

ceph osd pool create $new_pool 32

将旧池的内容复制到新池中:

rados cppool $old_pool $new_pool

删除旧池:

ceph osd pool delete $old_pool $old_pool --yes-i-really-really-mean-it

将新池重命名为&#39; default.rgw.buckets.data&#39;

ceph osd pool rename $new_pool $old_pool

现在重启你的radosgws可能是一个安全的选择。

最终正确

site a
osd.0
osd.1 TOTAL of ~ 32pgs

site b
osd.2 
osd.3 TOTAL of ~ 32pgs

正如您所看到的,我的池编号已增加,因为它们是按池ID添加的,并且是新副本。我们的每个osgs总数低于 ~256 ,这使我们有空间在需要时添加自定义池。

pool :  26 35 27 36 28 29 30 31 32 33 34 | SUM
-----------------------------------------------
osd.0   15 18 16 17 17 15 15 15 16 13 16 | 173
osd.1   17 14 16 15 15 17 17 17 16 19 16 | 179
osd.2   17 14 16 18 12 17 18 14 16 14 13 | 169
osd.3   15 18 16 14 20 15 14 18 16 18 19 | 183
-----------------------------------------------
SUM :   64 64 64 64 64 64 64 64 64 64 64 

现在你应该用你掌握的任何东西来测试你的ceph集群。就个人而言,我已经在boto上编写了一堆python,可以测试基础架构并快速返回存储桶统计信息和元数据。他们向我保证,集群恢复正常运行,没有任何先前遇到的问题。祝你好运!

修复池default.rgw.buckets.data每个pg比平均值更多的对象(pgs太少?)一劳永逸

这实际上意味着,您需要增加池的pg和pgp num。所以......做吧。考虑到上面提到的一切。但是,请注意,群集将启动backfilling,您可以在另一个终端窗口或屏幕中观看此过程%:watch ceph -s

ceph osd pool set default.rgw.buckets.data pg_num 128
ceph osd pool set default.rgw.buckets.data pgp_num 128

有了上述部分提供的系统知识和信心,我们可以清楚地了解这种变化对集群的关系和影响。

pool :  35 26 27 36 28 29 30 31 32 33 34 | SUM
----------------------------------------------
osd.0   18 64 16 17 17 15 15 15 16 13 16 | 222
osd.1   14 64 16 15 15 17 17 17 16 19 16 | 226
osd.2   14 66 16 18 12 17 18 14 16 14 13 | 218
osd.3   18 62 16 14 20 15 14 18 16 18 19 | 230
-----------------------------------------------
SUM :   64 256 64 64 64 64 64 64 64 64 64 

你能猜出哪个池ID是default.rgw.buckets.data吗?哈哈^ _ ^

答案 1 :(得分:1)

在Ceph Nautilus(v14或更高版本)中,您可以打开“ PG Autotuning”。有关更多信息,请参见this documentationthis blog entry

我意外地创建了带有无法迁移以修复PG的实时数据的池。恢复花了几天的时间,但PG的最佳调整是零问题。