我同时收到这两个错误。我无法减少pg计数,我无法添加更多存储空间。
这是一个新的集群,当我上传大约40GB时,我收到了这些警告。我想是因为radosgw创造了一堆游泳池。
ceph如何能够获得太多的每个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内部结构的类似误解有所了解。
在平衡展示位置组时,您必须考虑到:
我将使用我的设置作为示例,您应该能够将其用作自己的模板。
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元数据和簿记。
文档将让我们使用此计算来确定每个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的最大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
如果像我一样你用你那些“合理的默认值”(128 pgs for < 5 osds)
配置你的群集,那么当你尝试用rados做任何事情时,它会创建一大堆池,你的群集就会出现问题。原因是因为我误解了上面提到的一切之间的关系。
10 * 128 / 4 = 320 pgs per osd
这个~320
可能是我的集群上每个osd的一些pgs。但是,ceph可能会以不同的方式分发这正是正在发生的事情,并且超过了上面提到的256 max osd。我的集群的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必须确保网站上的所有内容至少都可以访问网站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的max pgs开始有意义:
别担心我们会解决它。我担心这里的程序风险和时间可能会有所不同,具体取决于您的群集有多大。但是,改变这种情况的唯一方法是添加更多存储空间,以便放置组可以在更大的表面区域上重新分配。或者我们必须将所有内容移动到新创建的池中。
我将展示移动default.rgw.buckets.data
池的示例:
old_pool=default.rgw.buckets.data
new_pool=new.default.rgw.buckets.data
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
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,它可以快速测试基础架构并返回存储桶统计信息和元数据。他们向我保证,集群恢复正常运行,没有任何先前遇到的问题。祝好运!
这实际上意味着,您需要增加池的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
吗?哈哈^ _ ^
在Ceph Nautilus(v14或更高版本)中,您可以打开“PG Autotuning”。有关更多信息,请参阅this documentation和this blog entry。
我不小心创建了具有实时数据的池,我无法迁移以修复PG。恢复需要几天时间,但PG的调整是零问题。