升级到 Quincy 前,你需要了解下PG Autoscaler 的一切~

一颗小胡椒2022-07-19 09:22:19

介绍

在 Nautilus(14.2.x) 版本中首次引入的 pg_autoscaler 是一种在你的 ceph 集群中管理归置组的极佳方式。根据存储池预期的使用情况,pg_autoscaler 可以提供建议,并根据存储池的使用情况和用户设置的优化值来调整集群中归置组的数量。

autoscaler 带有一些调整选项,包括 --bulk 标志、target_size_ratio,、noautoscale、 bias、 pg_numpg_num_max 和 pg_num_min。在 Quincy 的最新版本的准备过程中,我们把这些调整选项通过了发布标准测试,并得出了优化建议和排障指南,用户可以在升级到 Quicy 时参考它们。在这篇博客当中,我们总结了 autoscaler 提出的最初挑战,概述了作为发布标准测试结果的最佳调优实践,并以一些 autoscaler 的排障技巧作为结尾。

对 —bulk 标志最初的挑战与动机

在 Quincy 之前,一些用户在一开始安装 Ceph 的时候就遇到了一些性能问题。默认情况下,autoscaler 在一开始对每个存储池都设置了最少的 PGs 数量,只有在(存储池)使用量增加后才会上涨 (PGs 的)数量。这种行为主要会导致大型存储池的性能问题,因为相比 autoscaler 提供的最低 PGs 数量,大型存储池需要更多的 PGs。

这种 “开箱即遇性能问题”的经历导致了 Quincy 中 --bulk 标志的引入。用户可以在创建他们事先就知道会变大的存储池时指定 --bulk 标记。通过对存储池设置 --bulk 标志,autoscaler 会在最开始的时候就分配更大的 PGs 数量。这种方式下,用户不再需要等待 autoscaler 探测到更多使用量后在分配适当的 PGs 数量

优化建议

—bulk 标志应该用在大型存储池上以获得优化性能

--bulk 标记现在可以用用来表示一个将会变大的存储池,这个存储池需要在一开始就分配大量的 PGs。用户可以在创建新的存储池以及对存在的存储池设置 --bulk 标志。任何没有使用 --bulk 标记创建的存储池都会保持默认在最初分配最小 PGs 数的默认行为

可以使用 ceph osd pool create <pool-name> --bulk 可以在存储池创建过程中设置 --bulk 标志。使用 ceph osd pool set <pool-name> bulk <true/false/1/0> 来为一个已经创建好的存储池设置或取消 --bulk 标志。使用 ceph osd pool get <pool-name> bulk 可查看一个已存在的存储池的 --bulk 标志

如果你预期到一个存储池相比于其他的存储池会消耗更多的集群容量,使用 target_size_ratio 设置

存储池的目标比例(target ration)可以通过 target_size_ratio 来明确指出。如果你知道一个存储池相对于其他存储池有确定的比例,这一设置将会特别有用。每个存储池的目标比例除非明确指出,否则默认为 0。你为一个存储池设置的目标比例越大,你期望存储池的 PG 也就越多。

使用 osd pool autoscale-status 命令可以在 TARGET RATIO 一栏中检查存储池的目标比例。使用 ceph osd pool set <pool_name> target_size_ratio <ratio> 可以对一个已存在的存储池设置target_size_ratio。使用 ceph osd pool create --target-size-ratio <ratio> 可以在存储池创建时候设置 target_size_ratio 。

使用 noautoscale 标志来为所有存储池全局切换 autoscaler

现在可以通过 noautoscale 标志来打开或关闭所有的存储池的 autoscaler。默认情况下,这一标志设置为 false,并且每个存储池的 pg_autoscale 默认模式都是 on

如果你想为每一个存储池打开 autoscaler,使用 ceph osd pool unset noautoscale。如果你想为每一个存储池关闭 autoscaler,使用 ceph osd pool set noautoscale。使用 ceph osd pool get noautoscale 可以获得当前 noautoscale 的值。

使用偏置值来帮助 autoscaler 更准确滴调整 PGs 数量

偏置值是一个乘数,用于根据事先关于该池的预期 PG 数量的信息手动调整该池的 PG。默认情况下,除非另有规定,否则偏置值应为1.0。你给一个池子的偏置值越大,你预期的该池子的 PG 就越大。

使用 osd pool autoscale-status 并在 BIAS 栏中查看存储池的 bias 值。使用 ceph osd pool set <pool_name> pg_autoscale_bias <bias> 可以为已存在的存储池设置 bias

如果预先知道一个存储池的使用比例,在创建存储池时使用 pg_num 选项

当一个集群或存储池首次被创建时,只有一小部分集群容量会被消耗。因此,你的系统可能会低估集群或者存储池所需要的 PG 数。如果你事先知道你的集群或存储池的使用比例,在创建存储池时使用 pg_num 选项。这有助于你的集群提前核算适当数量的 PG

使用 ceph osd pool autoscale-status 并在 PG_NUM 栏中查看一个存储池 pg_num 的值。使用 ceph osd pool create <pool_name> <pg_num> 在创建存储池的时候指定 pg_num。使用 ceph osd pool set <pool-name> pg_num_min <pg_num> 指定存储池允许的最小 pg 数量。使用 ceph osd pool set <pool-name> pg_num_max <pg_num> 设置存储池所允许的最大 pg 数量。

使用 pg_num_max 设置存储池最大的 PG 数量

指定一个存储池的最大 PG 数量是可能的。这在创建小存储池时,如 .mgr, meta 存储,或者没有使用过 --bulk标志的存储,是非常有用的。

使用带 --pg-num-max <num> 选项的 ceph osd pool create 命令可以在存储池创建时指定最大 PG 数。在创建好存储池之后,使用 ceph osd pool set <pool-name> pg_num_max <num> (设置存储池的最大 PG 数)

使用 pg_num_min 值设置存储池的最小 PG 数

类似的,我们可以指定一个存储池的最小 PG 数。这在我们希望客户端在执行 I/O 时看到并行量的下限时是非常有利的,即便此时存储池中大部分是空的。这在创建一些大存储池(例如设置了 --bulk 标志的存储池)时是有用的。

使用带 --pg-num-min <num> 的 ceph osd pool create 命令可以在创建存储池的时候指定最小 PG 数。在创建好存储池之后,使用 ceph osd pool set <pool-name> pg_num_min <num> (设置存储池的最小 PG 数)

升级到 Quincy 之前你所需要知道的事情

当从一个不带 autoscaler 的 Ceph 版本升级到一个带有 autoscaler 的 Ceph 版本时,完成升级后 autoscaler 便可用于每个存储池,并且它默认对所有存储池都处于 off 状态。然而,如果你从一个带有 autoscaler 的 Ceph 版本升级到同样带有 autoscaler 的更新的版本时,所有存储池都会保持他们升级前原来的 autoscaler 设置,无论它们是 offon 或者 warn

要对一个存储池使用 --bulk 标志,需要升级的版本 >= 16.2.8 的 Ceph

最后,重要的是要开启日志以便诊断 pg_autoscaler 模块所带来的任何问题。像所有的管理模块一样,pg_autoscaler 有用来描述自身 Python 日志级别的 log_level 选项。我们推荐使用 warning 以捕捉升级过程中的信息。使用 ceph config get mgr mgr/pg_autoscaler/log_level 可以获得 pg_autoscaler 模块当前日志级别。使用 ceph config set mgr mgr/pg-autoscaler/log_level warning 设置 pg_autoscaler 日志级别为 warning。其他的选项有 infodebugcritical 和 error

排障建议

如果 autoscaler 没有按预期方向进行扩展该怎么办?

使用 ceph osd pool autoscale-status 查看每个存储池的 bulk 值配置是否正确。如果 BULK 为 “false”,autoscaler 初始值为 PG 的最小值。如果 BULK 的值为 “true”,autoscaler 初始值为一个大的 PG 数量。当你看到输出的 bulk 值非你所预期的那样,你可以使用 ceph osd pool set <pool-name> bulk <true/false/1/0> 来改变它们。

为什么 autoscaler 无法缩放或者带着错误值缩放

  1. 检查待缩放的存储池的 autoscaler 是否为 on/off
  2. 如果 autoscaler 无法对存储池进行缩放,检查该存储池是否设置了(autoscaler) 为 on。你可以用 ceph osd pool autoscale-status 来验证。在 AUTOSCALE栏下,检查模式是否为 on
  3. 如果你发现它为 off, 你可以对受影响的存储池执行 osd pool set <pool-name> pg_autoscale_mode on 来将 autoscaler 打开。如果存储池的 autoscaler 为 on,但你更想要将其设置为 off, 你可以使用osd pool set <pool-name> pg_autoscale_mode off 来关闭它
  4. 检查重叠的 root

如果每个存储池的 autoscaler 模式都是正确的,autoscaler 可能会因为你既存中有重叠的 root 而导致缩放失败。检查集群日志中是否有这样的警告日志: pool <id> contains an overlapping root <id> … skipping scaling。我们推荐让存储池只属于一个 root,以避免这样的警告和确保缩放过程的成功执行。

  1. 检查阈值是否影响了缩放的过程

检查阈值是否设置为一个恰当的值(默认 3.0)。该值是缩放过程是否能够执行的决定性因素。如果阈值设置过大(大于 5.0),它会占用存储池的使用率来触发自动缩放的过程。另一方面,如果阈值设置过低(小于 2.0),存储池会对缩放过度敏感。

使用 ceph osd pool set threshold <value> 可以调整存储池的阈值

  1. 检查 mon_target_pg_per_osd 是否设置为一个适当的值
  2. 下一个需要检查的优化是 mon_target_pg_per_osd,表示每个 OSD 的目标 PG 数。默认情况下,该选项应该被设置为 100.如果你发现每个 OSD 的 PG 数和你预期的不同,你可以通过使用 ceph config set global mon_target_pg_per_osd <value> 来调整该值。
  3. 检查速率设置是否正确
  4. 另一个需要检查的优化项是 rate 值,代表了存储池的副本数或纠删码的值。这个值决定了存储池中能够被消耗的裸存储容量。根据你的存储池的副本数或纠删码配置,通过osd pool autoscale-status 命令验证相应值设置是否正确。在命令输出的 RATE 栏,可以看到为每个存储池设置的 rate 值。你可以通过ceph osd pool set <pool-name> size <value> 来调整独立存储池的 rate 值。
  5. 检查偏置值设置是否正确
  6. 如前面《优化建议》中解释的,为存储池设置的偏置值越大,你所期望的存储池的 PG 数也越大。因此,你应该检查受影响的存储池中的 bias 是否设置为一个恰当的值。
  7. 检查 target_size_ration 设置是否正确
  8. 类似的,target_size_ratio 是另一个为存储设置得越大,你所期望的存储池的 PG 就越多的选项。因此,你应该确保受影响的存储池的相应值设置了一个恰当的数值。

如何知道 autoscaler 正在做什么?

从高层视角来看,你可以使用 ceph progress命令来观察 autoscaler 的活动。该命令的输出展示了哪个存储池当前正在扩展 PG 以及扩展的程度。

此外,你可以通过 ceph osd pool autoscale-status 命令中每个存储池的 NEW PG_NUM栏推导出距离你的目标 PG 数还有多远

对于更多的 autoscaler 的细节,访问 manager 日志,并查找如下的 INFO 级别的日志输出

Pool <pool_name> root_id <root_id> using <capacity> of space, bias <bias>
pg target <pg_target> quantized to <pg_target_nearest_power_of_two> (current <current_pg>)
effective_target_ratio <target_size_ratio> <total_target_ratio> <total_target_bytes> <capacity>

我应该使用哪个日志级别来查看 autoscaler 活动?

查看 autoscaler 活动需要使用 Python 日志级别中的 error 级别。请参考前面 《升级到 Quincy 之前你所需要知道的事情》小节,了解关于检查和设置autoscaler日志级别的信息。

结论

当优化得当时,pg_autoscaler 模块是一种很好让你的 Ceph 集群自动管理归置组的方式。我们希望这些 autoscaler 优化建议和排障指南在升级到 Quincy 最新版本时能够提升所有用户开箱即用的体验。更多信息,请参考Placement Groups文档,其中有关于 autoscaler 行为的更多细节。我们也鼓励已经升级到 Quincy 的用户联系用户邮件列表ceph-users@ceph.io,提出任何关于 autoscaler 的问题或反馈。

国内唯一官方正式授权的社区,为所有Cepher 提供学习、交流、展示自己的舞台,致力于做中国Ceph的推广者、布道者。 Ceph中国社区网址:http://www.ceph.org.cn

numceph
本作品采用《CC 协议》,转载必须注明作者和本文链接
每个存储池的目标比例除非明确指出,否则默认为 0。一栏中检查存储池的目标比例。可以对一个已存在的存储池设置target_size_ratio。标志来打开或关闭所有的存储池的 autoscaler。默认情况下,除非另有规定,否则偏置值应为1.0。指定存储池允许的最小 pg 数量。使用 pg_num_max 设置存储池最大的 PG 数量指定一个存储池的最大 PG 数量是可能的。
xsshelp闲着没事随便写的一个辅助挖掘xss漏洞的工具xsshelp version: 1.0.0Usage: [-ut] [-u url] [-t thread] [-h help]Options: -h this help -t intthread Num -u string a target url
F-vuln(全称:Find-Vulnerability)是为了自己工作方便专门编写的一款自动化工具,主要适用于日常安全服务、渗透测试人员和RedTeam红队人员,它集合的功能包括:存活IP探测、开放端口探测、web服务探测、web漏洞扫描、smb爆破、ssh爆破、ftp爆破、mssql爆破等其他数据库爆破工作以及大量web漏洞检测模块。
发现漏洞一、环境准备1、在Linux主机上准备一套Xampp:模拟攻防2、在VSCode利用Remote Development进行远程调试3、在Lampp的htdos目录下创建security目录,用于编写服务器PHP代码二、编写Login.html三、编写Login.php"; echo "location.href='welcome.php'";}else{ // echo "login-fail. "; echo "location.href='login.html'";}//关闭数据库mysqli_close?
提出了一种用于JIT缺陷预测的端到端深度学习框架,从Commit消息和代码变更中提取特征,基于所提特征来识别缺陷。每个变更的文件通过一组删除和添加的代码行表示,每一个代码行被处理为一个单词序列。
经PHP官方确认,于6月9日,PHP官网发布了该漏洞的修复方案。
EXOCET 优于 Metasploit 的“Evasive Payloads”模块,因为 EXOCET 在 GCM 模式(Galois/Counter 模式)下使用 AES-256。Metasploit 的 Evasion Payloads 使用易于检测的 RC4 加密。虽然 RC4 可以更快地解密,但 AES-256 很难确定恶意软件的意图。
pwnhub 9月公开赛
2021-10-03 17:08:04
pwnhub 9月公开赛
实验一利用case语句编写脚本,满足下列要求1.执行create时根据userfile和passfile建立用户
MISC中常用python脚本
2021-09-20 20:26:46
MISC中常用python脚本总结
一颗小胡椒
暂无描述