Ceph存储池pg_num配置详解

PG_NUM

用此命令创建存储池时:

ceph osd pool create {pool-name} pg_num

确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值:

  • 少于 5 个 OSD 时可把 pg_num 设置为 128;
  • OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512;
  • OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096;
  • OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值;
  • 自己计算 pg_num 取值时可借助 pgcalc 工具( https://ceph.com/pgcalc/ )。

随着 OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。

各个归置组、 OSD 和监视器都一直需要内存、网络、处理器,在恢复期间需求更大。为消除过载而把对象聚集成簇是归置组存在的主要原因。

最小化归置组数量可节省不少资源。

确定归置组数量

             (OSDs * 100)
Total PGs =  ------------
              pool size

比如,一个配置了 200 个 OSD 且副本数为 3 的集群,你可以这样估算归置组数量:

(200 * 100)
----------- = 6667. Nearest power of 2: 8192
     3

当用了多个数据存储池来存储数据时,你得确保均衡每个存储池的归置组数量、且归置组数量分摊到每个 OSD ,这样才能达到较合理的归置组总量,并因此使得每个 OSD 无需耗费过多系统资源或拖慢连接进程就能实现较小变迁。例如,在10个OSD上具有512个放置组的10个池的集群是遍布10个OSD的总共5,120个放置组,即每个OSD 512个放置组。 这不会占用太多资源。 但是,如果创建了1,000个池,每个池有512个放置组,则OSD将每个处理约50,000个放置组,这将需要更多的资源和时间进行对等。

设置归置组数量

要设置某存储池的归置组数量,你必须在创建它时就指定好,详情见创建存储池。一存储池的归置组数量设置好之后,还可以增加(但不可以减少),下列命令可增加归置组数量:

ceph osd pool set {pool-name} pg_num {pg_num}

你增加归置组数量后、还必须增加用于归置的归置组( pgp_num )数量,这样才会开始重均衡。 pgp_num 数值才是 CRUSH 算法采用的用于归置的归置组数量。虽然 pg_num 的增加引起了归置组的分割,但是只有当用于归置的归置组(即 pgp_num )增加以后,数据才会被迁移到新归置组里。 pgp_num 的数值应等于 pg_num 。可用下列命令增加用于归置的归置组数量:

ceph osd pool set {pool-name} pgp_num {pgp_num}

获取归置组数量

要获取一个存储池的归置组数量,执行命令:

ceph osd pool get {pool-name} pg_num

获取归置组统计信息

要获取集群里归置组的统计信息,执行命令:

ceph pg dump [--format {format}]

可用格式有纯文本 plain (默认)和 json 。

获取卡住的归置组统计信息

要获取所有卡在某状态的归置组统计信息,执行命令:

ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format <format>] [-t|--threshold <seconds>]

Inactive (不活跃)归置组不能处理读写,因为它们在等待一个有最新数据的 OSD 复活且进入集群。
Unclean (不干净)归置组含有复制数未达到期望数量的对象,它们应该在恢复中。
Stale (不新鲜)归置组处于未知状态:存储它们的 OSD 有段时间没向监视器报告了(由 mon_osd_report_timeout 配置)。
可用格式有 plain (默认)和 json 。阀值定义的是,归置组被认为卡住前等待的最小时间(默认 300 秒)。

获取一归置组运行图

要获取一个具体归置组的归置组图,执行命令:

ceph pg map {pg-id}

例如:

ceph pg map 1.6c

Ceph 将返回归置组图、归置组、和 OSD 状态:

osdmap e13 pg 1.6c (1.6c) -> up [1,0] acting [1,0]

获取一 PG 的统计信息

要查看一个具体归置组的统计信息,执行命令:

ceph pg {pg-id} query

洗刷归置组

要洗刷一个归置组,执行命令:

ceph pg scrub {pg-id}

Ceph 检查原始的和任何复制节点,生成归置组里所有对象的目录,然后再对比,确保没有对象丢失或不匹配,并且它们的内容一致。

恢复丢失的归置组

如果集群丢了一或多个对象,而且必须放弃搜索这些数据,你就要把未找到的对象标记为丢失( lost )。

如果所有可能的位置都查询过了,而仍找不到这些对象,你也许得放弃它们了。这可能是罕见的失败组合导致的,集群在写入完成前,未能得知写入是否已执行。

当前只支持 revert 选项,它使得回滚到对象的前一个版本(如果它是新对象)或完全忽略它。要把 unfound 对象标记为 lost ,执行命令:

ceph pg {pg-id} mark_unfound_lost revert|delete

Important:要谨慎使用,它可能迷惑那些期望对象存在的应用程序。

posted @ 2020-11-04 09:19  Varden  阅读(4343)  评论(1编辑  收藏  举报