我同时遇到了这两个错误。我无法减少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,没什么特别的。
最佳答案
我将回答我自己的问题,以期为该问题或对ceph内部结构的类似误解提供一些启示。
一劳永逸地修复每个OSD的HEALTH_WARN PG过多(352>最大300)
平衡展示位置组时,必须考虑以下因素:
我们需要的数据
每OSD pgs
每个池的pgs
每个OSD池
暗恋地图
合理的默认pg和pgp num
副本数
我将以我的设置为例,您应该可以将其用作自己的模板。
我们拥有的数据
操作系统:4
num个站点:2
每OSD的pgs:???
每个池的pgs:???
每个OSD的池数:10
合理的默认pg和pgp num:64(...或者是?)
副本数:2(跨站点复制)
暗恋地图ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITYroot 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元数据和簿记内部。
每个OSG的PG(无论如何都是合理的默认值???)
文档将让我们使用此计算来确定每个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
这是每个osd建议的最大pgs数。那么...您目前实际拥有什么?为什么不起作用?如果您设置了
“合理的默认设置”并了解上述原因,而不是正常工作!!! > = [
可能有几个原因。我们必须了解上述“合理的违约”的实际含义,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
让我解释一下原因:
如果像我一样,一旦您尝试使用rados进行任何操作,便会为这些群集配置“合理的默认值”
(128 pgs for < 5 osds)
,这会创建一堆池,并且群集会变得混乱。原因是因为我误解了上述所有内容之间的关系。
池数:10(由rados创建)
每个池的pgs:128(在文档中推荐)
osds:4(每个站点2个)
10 * 128 / 4 = 320 pgs per osd
这个
~320
可能是我的集群上每个osd的pgs。但是ceph可能以不同的方式分发这些内容。到底发生了什么,远远超过了上述每个osd的256个最大值。我的集群的
HEALTH WARN
是HEALTH_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!所以发生了什么事??
我误会了如何使用“合理的默认值”。当我将默认值设置为64时,您可以看到ceph已将我的暗恋地图考虑在内
我在站点a和站点b之间有一个故障域。 Ceph必须确保站点a上的所有内容至少可以在站点b上访问。
错误
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和每个osd的pgs与那些“合理的默认值”之间的关系以及我们推荐的每个osd的最大pgs之间的关系才有意义:因此,您破坏了群集^ _ ^
不用担心,我们会修复它。恐怕这里的过程可能会因群集的大小而导致风险和时间的变化。但是唯一的办法
解决这个问题的方法是增加存储空间,以便放置组可以在更大的表面积上重新分布。否则我们必须将所有内容移至
新创建的池。
我将展示一个移动
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
将新池重命名为“ default.rgw.buckets.data”
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添加的,并且是新副本。每个osd的总pgs在〜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
吗?哈哈^ _ ^