我将回答我自己的问题,希望它能够阐明这个问题或对 ceph 内部结构的类似误解。
一劳永逸地修复每个 OSD 的 HEALTH_WARN 太多 PG(352 > 最大 300)
在平衡归置组时,您必须考虑:
我们需要的数据
- 每个 osd 的 pgs
- 每个池的 pgs
- 每个 osd 的池
- 暗恋地图
- 合理的默认 pg 和 pgp num
- 副本数
我将以我的设置为例,您应该可以将其用作您自己的模板。
我们拥有的数据
- 操作系统数量:4
- 站点数:2
- 每个 osd 的 pgs:???
- 每个池的 pgs:???
- 每个 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 元数据和簿记的内部。
每个 osd 的 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推荐的最大pg 数。那么......你现在实际上有什么?为什么它不起作用?如果您设置了一个“合理的默认值”并理解上述为什么它不起作用!!!>=[
可能,有几个原因。我们必须了解上面那些“合理的默认值”实际上是什么意思,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)
.
使用这个命令,我们可以更好地看到数字之间的关系:
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 per pool和pgs per osd与那些“合理的默认值”和我们推荐的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
将新池重命名为“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。所以……去做吧。考虑到上面提到的一切。但是,当您执行此操作时,请注意集群将开始回填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
吗?哈哈^_^