注意
本文档适用于 Ceph 的开发版本。
OSD 配置参考
您可以在 Ceph 配置文件中配置 Ceph OSD 守护程序(或者在最新版本中,在中央配置存储中),但 Ceph OSD 守护程序可以使用默认值和最少的配置。最少的 Ceph OSD 守护程序配置设置 host 并使用几乎所有其他设置的默认值。
Ceph OSD 守护程序以递增方式进行数字标识,从 0 开始,遵循以下惯例。
osd.0
osd.1
osd.2
在配置文件中,您可以通过在配置文件的 [osd] 部分添加配置设置,为集群中的所有 Ceph OSD 守护程序指定设置。要直接为特定的 Ceph OSD 守护程序添加设置(例如,host),请将其输入到配置文件的 OSD 特定部分中。例如
[osd]
osd_journal_size = 5120
[osd.0]
host = osd-host-a
[osd.1]
host = osd-host-b
常规设置
以下设置提供 Ceph OSD 守护程序的 ID,并确定数据和日志的路径。Ceph 部署脚本通常会自动生成 UUID。
警告
不要更改数据或日志的默认路径,因为这会使以后对 Ceph 进行故障排除变得更加麻烦。
使用 Filestore 时,日志大小应至少是预期驱动器速度乘以 filestore_max_sync_interval 的两倍。然而,最常见的做法是分区日志驱动器(通常是 SSD),并将其挂载,以便 Ceph 将整个分区用于日志。请注意,Filestore 已弃用多个版本,任何传统的 Filestore OSD 都应迁移到 BlueStore。
- osd_uuid
Ceph OSD 守护程序的通用唯一标识符 (UUID)。
- 类型:
uuid
注意
osd_uuid适用于单个 Ceph OSD 守护程序。fsid适用于整个集群。
- osd_data
OSD 数据的路径。部署 Ceph 时必须创建该目录。您应该在此挂载点挂载一个用于 OSD 数据的驱动器。我们不建议更改默认设置。
- 类型:
str- 默认值:
/var/lib/ceph/osd/$cluster-$id
- osd_max_write_size
写入的最大大小(以兆字节为单位)。
- 类型:
大小- 默认值:
90B- min:
4
- osd_max_object_size
RADOS 对象在字节中的最大大小。
- 类型:
大小- 默认值:
128Mi
- osd_client_message_size_cap
内存中允许的最大客户端数据消息。
- 类型:
大小- 默认值:
500Mi
- osd_class_dir
RADOS 类插件的类路径。
- 类型:
str- 默认值:
$libdir/rados-classes
文件系统设置
Ceph 构建和挂载用于 Ceph OSD 的文件系统。
osd_mkfs_options {fs-type}
- 描述:
创建类型为 {fs-type} 的新 Ceph Filestore OSD 时使用的选项。
- 类型:
String
- xfs 的默认值:
-f -i 2048- 其他文件系统的默认值:
{空字符串}
- 例如:
osd_mkfs_options_xfs = -f -d agcount=24
osd_mount_options {fs-type}
- 描述:
挂载类型为 {fs-type} 的 Ceph Filestore OSD 时使用的选项。
- 类型:
String
- xfs 的默认值:
rw,noatime,inode64- 其他文件系统的默认值:
rw, noatime
- 例如:
osd_mount_options_xfs = rw, noatime, inode64, logbufs=8
日志设置
此部分仅适用于较旧的 Filestore OSD 后端。自 Luminous 版本以来,BlueStore 已成为默认首选。
默认情况下,Ceph 期望您在以下路径配置 Ceph OSD 守护程序的日志,该路径通常是指向设备或分区的符号链接
/var/lib/ceph/osd/$cluster-$id/journal
当使用单个设备类型(例如,机械驱动器)时,日志应为同位:逻辑卷(或分区)应与 data 逻辑卷位于同一设备中。
当混合使用快速(SSD、NVMe)设备和较慢设备(如机械驱动器)时,将日志放置在较快设备上是有意义的,而 data 则完全占用较慢设备。
默认的 osd_journal_size 值为 5120(5 GB),但可以更大,在这种情况下需要将其设置在 ceph.conf 文件中。在实践中,10 GB 的值很常见。
osd_journal_size = 10240
- osd_journal
OSD 日志的路径。这可以是文件的路径,也可以是块设备(例如 SSD 的分区)。如果它是一个文件,您必须创建包含它的目录。当
osd_data驱动器是 HDD 时,我们建议使用单独的快速设备。- 类型:
str- 默认值:
/var/lib/ceph/osd/$cluster-$id/journal
- osd_journal_size
日志大小(以兆字节为单位)。
- 类型:
大小- 默认值:
5Ki
有关更多详细信息,请参阅 日志配置参考。
监视器 OSD 交互
Ceph OSD 守护程序会互相检查心跳并定期向监视器报告。在许多情况下,Ceph 可以使用默认值。但是,如果您的网络存在延迟问题,您可能需要采用更长的时间间隔。有关心跳的详细讨论,请参阅 配置监视器/OSD 交互。
数据放置
有关详细信息,请参阅 池和 PG 配置参考。
清洗
Ceph 确保数据完整性的一种方法是“清洗”放置组。Ceph 清洗类似于对象存储层上的 fsck。Ceph 会生成每个放置组中所有对象的目录,并将每个主对象与其副本进行比较,确保没有对象丢失或不匹配。轻度清洗检查对象大小和属性,通常每天进行。深度清洗读取数据并使用校验和确保数据完整性,通常每周进行。轻度清洗和深度清洗的频率由集群的配置决定,您可以通过本节下面解释的设置完全控制它。
虽然清洗对于维护数据完整性很重要,但它会降低 Ceph 集群的性能。您可以调整以下设置来增加或减少清洗操作的频率和深度。
- osd_max_scrubs
Ceph OSD 守护程序同时执行的最大清洗操作数。
- 类型:
int- 默认值:
3
- osd_scrub_begin_hour
这会将清洗限制为一天的这个小时或更晚。使用
osd_scrub_begin_hour = 0和osd_scrub_end_hour = 0以允许全天清洗。它们与osd_scrub_end_hour一起定义了一个时间窗口,只有在此窗口内才会启动定期清洗。- 类型:
int- 默认值:
0- 允许范围:
[0, 23]- 另请参阅:
- osd_scrub_end_hour
这会将清洗限制为早于此时间的小时。使用
osd_scrub_begin_hour = 0和osd_scrub_end_hour = 0以允许全天清洗。它们与osd_scrub_begin_hour一起定义了一个时间窗口,只有在此窗口内才能自动启动定期清洗。- 类型:
int- 默认值:
0- 允许范围:
[0, 23]- 另请参阅:
- osd_scrub_begin_week_day
这会将清洗限制为一周中的这一天或更晚。0 = 星期日,1 = 星期一,以此类推。使用
osd_scrub_begin_week_day = 0和osd_scrub_end_week_day = 0以允许全周清洗。它们与osd_scrub_end_week_day一起定义了一个时间窗口,在此窗口内可以自动启动定期清洗。- 类型:
int- 默认值:
0- 允许范围:
[0, 6]- 另请参阅:
- osd_scrub_end_week_day
这会将清洗限制为早于一周中这一天的天数。0 = 星期日,1 = 星期一,以此类推。使用
osd_scrub_begin_week_day = 0和osd_scrub_end_week_day = 0以允许全周清洗。它们与osd_scrub_begin_week_day一起定义了一个时间窗口,在此窗口内可以自动启动定期清洗。- 类型:
int- 默认值:
0- 允许范围:
[0, 6]- 另请参阅:
- osd_scrub_during_recovery
允许在恢复期间进行清洗。将其设置为
false将在有活动的恢复时禁用调度新的清洗(和深度清洗)。已在运行的清洗将继续。这对于减少繁忙集群的负载可能很有用。- 类型:
bool- 默认值:
false
- osd_scrub_load_threshold
归一化的最大负载。当系统负载(定义为
getloadavg() / number of online CPUs)高于此数值时,Ceph 不会启动定期(常规)清洗。默认设置足够高,允许在大多数负载条件下进行定期清洗。- 类型:
float- 默认值:
10.0
- osd_scrub_min_interval
特定 PG 之间清洗所需的最小间隔时间(以秒为单位)。
- 类型:
float- 默认值:
1 day- 另请参阅:
- osd_scrub_max_interval
每个 PG 清洗的最大间隔时间(以秒为单位)。
- 类型:
float- 默认值:
7 days- 另请参阅:
- osd_scrub_chunk_min
单个操作期间要清洗的最小对象数。即使在清洗被客户端操作抢占且有效块大小减半之后,它也用作最小块大小。
- 类型:
int- 默认值:
5- 另请参阅:
- osd_shallow_scrub_chunk_min
单个操作期间要清洗的最小对象存储块数。不适用于深度清洗。Ceph 在清洗期间会阻塞对单个块的写入。
- 类型:
int- 默认值:
50- 另请参阅:
- osd_scrub_chunk_max
单个内部清洗操作期间要深度清洗的最大对象数。较大的值会提高清洗性能,但可能会对客户端操作的延迟产生不利影响。
- 类型:
int- 默认值:
15- 另请参阅:
- osd_shallow_scrub_chunk_max
单个操作期间要清洗的最大对象存储块数。不适用于深度清洗。
- 类型:
int- 默认值:
100- 另请参阅:
- osd_scrub_sleep
清洗下一组对象(下一个块)之前的休眠时间(以秒为单位)。增加此值会降低清洗的整体速率,从而减少清洗对客户端操作的影响。
- 类型:
float- 默认值:
0.0
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_deep_scrub_interval
“深度”清洗(完全读取所有数据)的间隔。
- 类型:
float- 默认值:
7 days
- osd_scrub_interval_randomize_ratio
在调度 PG 的下一个清洗作业时,向
osd_scrub_min_interval添加随机延迟。延迟是一个随机值,小于osd_scrub_min_interval*osd_scrub_interval_randomized_ratio。默认设置会将清洗分散在[1, 1.5]*osd_scrub_min_interval允许的时间窗口内。- 类型:
float- 默认值:
0.5- 另请参阅:
- osd_deep_scrub_stride
执行深度清洗时的读取大小。
- 类型:
大小- 默认值:
4Mi
- osd_scrub_auto_repair
将其设置为
true将启用自动 PG 修复,当清洗或深度清洗发现错误时。但是,如果发现的损坏对象多于osd_scrub_auto_repair_num_errors,则不执行修复。- 类型:
bool- 默认值:
false
- osd_scrub_auto_repair_num_errors
如果发现的损坏对象多于此数量,则清洗不会执行自动修复。
- 类型:
uint- 默认值:
5- 另请参阅:
操作
- osd_op_num_shards
分配给给定 OSD 的分片数。每个分片都有自己的处理队列。OSD 上的 PG 在分片中均匀分布。如果非零,此设置将覆盖 _ssd 和 _hdd。
- 类型:
int- 默认值:
0
- osd_op_num_shards_hdd
分配给给定 OSD 的分片数(用于旋转介质)。
- 类型:
int- 默认值:
1- 另请参阅:
- osd_op_num_shards_ssd
分配给给定 OSD 的分片数(用于固态介质)。
- 类型:
int- 默认值:
8- 另请参阅:
- osd_op_num_threads_per_shard
为给定 OSD 的每个 OSD 分片生成的 worker 线程数。每个 worker 线程在运行时都会处理分片队列中的项。如果非零,此设置将覆盖 _ssd 和 _hdd。
- 类型:
int- 默认值:
0
- osd_op_num_threads_per_shard_hdd
为给定 OSD 的每个 OSD 分片生成的 worker 线程数(用于旋转介质)。
- 类型:
int- 默认值:
5- 另请参阅:
- osd_op_num_threads_per_shard_ssd
为给定 OSD 的每个 OSD 分片生成的 worker 线程数(用于固态介质)。
- 类型:
int- 默认值:
2- 另请参阅:
- osd_op_queue
这设置了用于在每个 OSD 内对操作进行优先级的队列类型。两个队列都具有一个在正常队列之前出队的严格子队列。正常队列在不同实现之间有所不同。WeightedPriorityQueue (
wpq) 根据操作的优先级出队操作,以防止任何队列饿死。WPQ 应该有助于解决少数 OSD 比其他 OSD 过载的情况。mClockQueue (mclock_scheduler) 根据操作所属的类别(恢复、清洗、快照修剪、客户端操作、OSD 子操作)对操作进行优先级排序。请参阅 基于 mClock 的 QoS。需要重新启动。- 类型:
str- 默认值:
mclock_scheduler- 有效选项:
wpqmclock_schedulerdebug_random
- 另请参阅:
- osd_op_queue_cut_off
这选择哪些优先级操作将被发送到严格队列而不是正常队列。
low设置将所有复制操作和更高优先级的操作发送到严格队列,而high选项仅将复制确认操作和更高优先级的操作发送到严格队列。当集群中的少数 OSD 非常繁忙时,将此设置为high应该会有所帮助,特别是当与osd_op_queue设置中的wpq结合使用时。在没有这些设置的情况下,忙于处理复制流量的 OSD 可能会使这些 OSD 上的主客户端流量饿死。需要重新启动。- 类型:
str- 默认值:
high- 有效选项:
lowhighdebug_random
- 另请参阅:
- osd_client_op_priority
为客户端操作设置的优先级。此值相对于下面的
osd_recovery_op_priority。默认值强烈倾向于客户端操作而不是恢复操作。- 类型:
uint- 默认值:
63
- osd_recovery_op_priority
恢复操作相对于客户端操作的优先级,如果池的
recovery_op_priority未指定。默认值优先考虑客户端操作(见上文)而不是恢复操作。您可以通过降低此值以增加客户端操作的优先级,或通过增加此值以支持恢复,来调整客户端影响与恢复集群健康所需时间之间的权衡。- 类型:
uint- 默认值:
3
- osd_scrub_priority
当池未指定
scrub_priority值时,计划清洗的默认工作队列优先级。当清洗阻塞客户端操作时,可以将其提升到osd_client_op_priority的值。- 类型:
uint- 默认值:
5
- osd_requested_scrub_priority
已弃用。请改用
osd_scrub_priority。- 类型:
uint- 默认值:
5
- osd_snap_trim_priority
为快照修剪工作队列设置的优先级。
- 类型:
uint- 默认值:
5
- osd_snap_trim_sleep
在下一个快照修剪操作之前休眠的时间(以秒为单位)。增加此值会减慢快照修剪。此选项会覆盖特定后端的变体。
- 类型:
float- 默认值:
0.0
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_snap_trim_sleep_hdd
HDD 的下一个快照修剪之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
5.0
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_snap_trim_sleep_ssd
SSD OSD(包括 NVMe)的下一个快照修剪操作之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
0.0
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_snap_trim_sleep_hybrid
当 OSD 数据位于 HDD 上且 OSD 日志或 WAL+DB 位于 SSD 上时,下一个快照修剪操作之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
2.0
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_op_thread_timeout
Ceph OSD 守护程序操作线程超时时间(以秒为单位)。
- 类型:
int- 默认值:
15
- osd_op_complaint_time
在经过指定秒数后,操作变为值得投诉。
- 类型:
float- 默认值:
30.0
- osd_op_history_size
要跟踪的已完成操作的最大数量。
- 类型:
uint- 默认值:
20
- osd_op_history_duration
要跟踪的最旧已完成操作。
- 类型:
uint- 默认值:
600
- osd_op_log_threshold
一次显示的操作日志数量。
- 类型:
int- 默认值:
5
- osd_op_thread_suicide_timeout
- 类型:
int- 默认值:
150
注意
有关 osd_op_thread_suicide_timeout 的更多信息,请参阅 https://old.ceph.com/planet/dealing-with-some-osd-timeouts/。请注意,这是一个指向 2017 年博客文章重写的链接,其结论将引导您返回此页面以获取“更多信息”。
基于 mClock 的 QoS
Ceph 对 mClock 的使用现在更加完善,可以按照 mClock 配置参考 中所述的步骤使用。
核心概念
Ceph 的 QoS 支持是使用基于 dmClock 算法 的排队调度程序实现的。该算法根据权重分配 Ceph 集群的 I/O 资源,并强制执行最小保留和最大限制的约束,以便服务可以公平地竞争资源。目前,mclock_scheduler 操作队列将涉及 I/O 资源的 Ceph 服务分为以下几类
client op:客户端发出的 iops
osd subop:主 OSD 发出的 iops
snap trim:快照修剪相关的请求
pg recovery:恢复相关的请求
pg scrub:清洗相关的请求
资源使用以下三组标签进行分区。换句话说,每种服务的份额由三个标签控制
reservation:为服务分配的最小 IOPS。
limitation:为服务分配的最大 IOPS。
weight:如果有额外的容量或系统超额订阅,则按比例分配容量份额。
在 Ceph 中,操作按“成本”分级。为各种服务提供的资源被这些“成本”消耗。因此,例如,服务拥有的保留越多,它就越能保证拥有更多资源,只要它需要。假设有两种服务:恢复和客户端操作
recovery: (r:1, l:5, w:1)
client ops: (r:2, l:0, w:9)
上面的设置确保恢复不会获得超过每秒 5 个请求的服务,即使它需要如此(请参阅下面的“当前实现说明”),并且没有其他服务与之竞争。但是,如果客户端开始发出大量 I/O 请求,它们也不会耗尽所有 I/O 资源。只要有恢复作业,每秒始终为恢复作业分配 1 个请求。因此,即使在负载高的集群中,恢复作业也不会饿死。同时,客户端操作可以享受更大比例的 I/O 资源,因为它的权重是“9”,而竞争对手的权重是“1”。在客户端操作的情况下,它不受限制设置的约束,因此如果没有正在进行的恢复,它可以使用所有资源。
当前实现说明:当前实现强制执行限制值。因此,如果服务超过强制限制,操作将保留在操作队列中,直到恢复限制。
mClock 的精妙之处
保留和限制值的单位是每秒请求数。然而,权重在技术上没有单位,并且权重是相互关联的。因此,如果一类请求的权重为 1,另一类请求的权重为 9,则后一类请求的执行比例应为 9:1。然而,这只有在满足保留之后才会发生,并且这些值包括在保留阶段执行的操作。
尽管权重没有单位,但必须小心选择它们的值,因为算法如何将权重标签分配给请求。如果权重是 W,那么对于给定类别的请求,下一个进来的请求将具有权重标签 1/W 加上上一个权重标签或当前时间,以较大者为准。这意味着如果 W 足够大,因此 1/W 足够小,则计算出的标签可能永远不会被分配,因为它将获得当前时间的值。最终的教训是,权重的值不应该太大。它们应该低于预期每秒服务的请求数。
注意事项
有一些因素可以减少 Ceph 中 mClock 操作队列的影响。首先,对 OSD 的请求按其放置组标识符分片。每个分片都有自己的 mClock 队列,这些队列既不交互也不共享信息。分片数可以通过配置选项 osd_op_num_shards、osd_op_num_shards_hdd 和 osd_op_num_shards_ssd 进行控制。较低的分片数会增加 mClock 队列的影响,但可能会产生其他有害影响。如果分片 worker 线程不足,情况尤其如此。分片 worker 线程数可以通过配置选项 osd_op_num_threads_per_shard、osd_op_num_threads_per_shard_hdd 和 osd_op_num_threads_per_shard_ssd 进行控制。
其次,请求从操作队列传输到操作定序器,在其中经历执行阶段。操作队列是 mClock 所在的位置,mClock 确定要传输到操作定序器的下一个操作。操作定序器中允许的操作数是一个复杂的问题。通常,我们希望在定序器中保留足够的操作,以便它在等待磁盘和网络访问完成其他操作时始终在某些操作上进行工作。另一方面,一旦操作传输到操作定序器,mClock 就不再控制它。因此,为了最大限度地发挥 mClock 的影响,我们希望在操作定序器中保留尽可能少的操作。所以我们存在固有的矛盾。
影响操作定序器中操作数的配置选项是 bluestore_throttle_bytes、bluestore_throttle_deferred_bytes、bluestore_throttle_cost_per_io、bluestore_throttle_cost_per_io_hdd 和 bluestore_throttle_cost_per_io_ssd。
影响 mClock 算法影响的第三个因素是,我们使用的是分布式系统,其中请求发送到多个 OSD,并且每个 OSD 都有(可以有)多个分片。然而,我们目前使用的是 mClock 算法,它不是分布式的(注意:dmClock 是 mClock 的分布式版本)。
各种组织和个人目前正在试验 mClock 在此代码库中的存在以及他们对代码库的修改。我们希望您能在 ceph-devel 邮件列表上分享您使用 mClock 和 dmClock 的经验。
- osd_async_recovery_min_cost
当前日志条目差异和历史丢失对象的混合度量,超过此值时,我们会切换到在适当情况下使用异步恢复。
- 类型:
uint- 默认值:
100
- osd_push_per_object_cost
服务推送操作的开销。
- 类型:
大小- 默认值:
1000B
- osd_mclock_scheduler_client_res
为每个客户端保留的 IO 比例(默认)。
- 类型:
float- 默认值:
0.0- 允许范围:
[0, 1.0]- 另请参阅:
- osd_mclock_scheduler_client_wgt
每个客户端的 IO 份额(默认)超过保留。
- 类型:
uint- 默认值:
1- 另请参阅:
- osd_mclock_scheduler_client_lim
每个客户端的 IO 限制(默认)超过保留。
- 类型:
float- 默认值:
0.0- 允许范围:
[0, 1.0]- 另请参阅:
- osd_mclock_scheduler_background_recovery_res
为后台恢复保留的 IO 比例(默认)。
- 类型:
float- 默认值:
0.0- 允许范围:
[0, 1.0]- 另请参阅:
- osd_mclock_scheduler_background_recovery_wgt
每个后台恢复的 IO 份额超过保留。
- 类型:
uint- 默认值:
1- 另请参阅:
- osd_mclock_scheduler_background_recovery_lim
后台恢复的 IO 限制超过保留。
- 类型:
float- 默认值:
0.0- 允许范围:
[0, 1.0]- 另请参阅:
- osd_mclock_scheduler_background_best_effort_res
为后台 best_effort 保留的 IO 比例(默认)。
- 类型:
float- 默认值:
0.0- 允许范围:
[0, 1.0]- 另请参阅:
- osd_mclock_scheduler_background_best_effort_wgt
每个后台 best_effort 的 IO 份额超过保留。
- 类型:
uint- 默认值:
1- 另请参阅:
- osd_mclock_scheduler_background_best_effort_lim
后台 best_effort 的 IO 限制超过保留。
- 类型:
float- 默认值:
0.0- 允许范围:
[0, 1.0]- 另请参阅:
回填
当您向集群添加或删除 Ceph OSD 守护程序时,CRUSH 将通过将放置组移动到 OSD 或从 OSD 移动以恢复平衡利用率来重新平衡集群。迁移放置组及其包含的对象的过程会显著降低集群的操作性能。为了保持操作性能,Ceph 使用“回填”执行此迁移,这允许 Ceph 将回填操作设置为低于读取或写入数据请求的优先级。
- osd_max_backfills
允许到或来自单个 OSD 的最大回填数。请注意,这分别适用于读取和写入操作。使用 mClock 调度程序时,此设置会自动重置。
- 类型:
uint- 默认值:
1- 另请参阅:
- osd_backfill_scan_min
每次回填扫描的最小对象数。
- 类型:
int- 默认值:
64
- osd_backfill_scan_max
每次回填扫描的最大对象数。
- 类型:
int- 默认值:
512
- osd_backfill_retry_interval
重试回填请求之前等待的秒数。
- 类型:
float- 默认值:
30.0
OSD Map
OSD map 反映了集群中运行的 OSD 守护程序。随着时间的推移,map 纪元数会增加。Ceph 提供了一些设置来确保 Ceph 在 OSD map 变大时仍能表现良好。
- osd_map_dedup
启用删除 OSD map 中的重复项。
- 类型:
bool- 默认值:
true
- osd_map_cache_size
要缓存的 OSD map 数量。
- 类型:
int- 默认值:
50
- osd_map_message_max
每个 MOSDMap 消息允许的最大 map 条目数。
- 类型:
int- 默认值:
40
恢复
当集群启动或 Ceph OSD 守护程序崩溃并重新启动时,OSD 会在可以进行写入之前开始与其他 Ceph OSD 守护程序对等。有关详细信息,请参阅 监视 OSD 和 PG。
如果 Ceph OSD 守护程序崩溃并重新联机,它通常会与包含放置组中最新版本对象的其他 Ceph OSD 守护程序不同步。发生这种情况时,Ceph OSD 守护程序进入恢复模式,并寻求获取数据的最新副本并使其 map 保持最新。根据 Ceph OSD 守护程序离线的时间长短,OSD 的对象和放置组可能严重过时。此外,如果故障域发生故障(例如,一个机架),可能会有多个 Ceph OSD 守护程序同时重新联机。这会使恢复过程耗时且资源密集。
为了保持操作性能,Ceph 通过限制恢复请求数、线程数和对象块大小来执行恢复,这使得 Ceph 在降级状态下也能表现良好。
- osd_recovery_delay_start
对等完成后,Ceph 将延迟指定的秒数,然后开始恢复 RADOS 对象。
- 类型:
float- 默认值:
0.0
- osd_recovery_max_active
一次每个 OSD 的活动恢复请求数。更多请求将加速恢复,但请求会增加集群的负载。
- 类型:
uint- 默认值:
0- 另请参阅:
osd_recovery_max_active_hdd、osd_recovery_max_active_ssd、osd_mclock_override_recovery_settings
注意
仅当此值非零时才使用。通常为
0,这意味着使用hdd或ssd值(如下所示),具体取决于支持 OSD 的主设备的类型。使用 mClock 调度程序时,此设置会自动重置。
- osd_recovery_max_active_hdd
如果主设备是旋转的,则一次每个 OSD 的活动恢复请求数。
- 类型:
uint- 默认值:
3- 另请参阅:
osd_recovery_max_active、osd_recovery_max_active_ssd、osd_mclock_override_recovery_settings
注意
使用 mClock 调度程序时,此设置会自动重置。
- osd_recovery_max_active_ssd
如果主设备是非旋转的(即 SSD),则一次每个 OSD 的活动恢复请求数。
- 类型:
uint- 默认值:
10- 另请参阅:
osd_recovery_max_active、osd_recovery_max_active_hdd、osd_mclock_override_recovery_settings
注意
使用 mClock 调度程序时,此设置会自动重置。
- osd_recovery_max_chunk
恢复操作可以携带的最大数据块总大小。
- 类型:
大小- 默认值:
8Mi
- osd_recovery_max_single_start
当 OSD 正在恢复时,每个 OSD 将新启动的最大恢复操作数。
- 类型:
uint- 默认值:
1
- osd_recover_clone_overlap
在恢复期间保留克隆重叠。应始终设置为
true。- 类型:
bool- 默认值:
true
- osd_recovery_sleep
在下一个恢复或回填操作之前休眠的时间(以秒为单位)。增加此值会减慢恢复操作,同时客户端操作受到的影响较小。
- 类型:
float- 默认值:
0.0
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_recovery_sleep_hdd
HDD 的下一个恢复或回填操作之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
0.1
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_recovery_sleep_ssd
SSD 的下一个恢复或回填操作之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
0.0- 另请参阅:
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_recovery_sleep_hybrid
当 OSD 数据位于 HDD 上且 OSD 日志 / WAL+DB 位于 SSD 上时,下一个恢复或回填操作之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
0.025- 另请参阅:
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_recovery_sleep_degraded
当 PG 降级时,在下一个恢复或回填操作之前休眠的时间(以秒为单位)。增加此值会减慢恢复操作,同时客户端操作受到的影响较小。
- 类型:
float- 默认值:
0.0
- osd_recovery_sleep_degraded_hdd
当 PG 降级时,HDD 的下一个恢复或回填操作之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
0.1
- osd_recovery_sleep_degraded_ssd
当 PG 降级时,SSD 的下一个恢复或回填操作之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
0.0- 另请参阅:
- osd_recovery_sleep_degraded_hybrid
当 PG 降级且 OSD 数据位于 HDD 上且 OSD 日志 / WAL+DB 位于 SSD 上时,下一个恢复或回填操作之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
0.025- 另请参阅:
- osd_recovery_priority
恢复工作队列的默认优先级。与池的
recovery_priority无关。- 类型:
uint- 默认值:
5
分层
- osd_agent_max_ops
在高速模式下,每个分层代理同时刷新的最大操作数。
- 类型:
int- 默认值:
4
- osd_agent_max_low_ops
在低速模式下,每个分层代理同时刷新的最大操作数。
- 类型:
int- 默认值:
2
有关分层代理何时在高速模式下刷新脏对象的详细信息,请参阅 cache target dirty high ratio。
杂项
- osd_default_notify_timeout
OSD 默认通知超时时间(以秒为单位)。
- 类型:
uint- 默认值:
30
- osd_check_for_log_corruption
检查日志文件是否损坏。可能会占用大量计算资源。
- 类型:
bool- 默认值:
false
- osd_delete_sleep
在下一次删除事务之前休眠的时间(以秒为单位)。这会限制 PG 删除过程。
- 类型:
float- 默认值:
0.0
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_delete_sleep_hdd
HDD 的下一次删除事务之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
5.0
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_delete_sleep_ssd
SSD 的下一次删除事务之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
1.0
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_delete_sleep_hybrid
当 OSD 数据位于 HDD 上且 OSD 日志或 WAL+DB 位于 SSD 上时,下一次删除事务之前休眠的时间(以秒为单位)。
- 类型:
float- 默认值:
1.0
注意
使用 mClock 调度程序时,此设置将被忽略。
- osd_command_max_records
限制返回的丢失对象数量。
- 类型:
int- 默认值:
256
- osd_fast_fail_on_connection_refused
如果启用此选项,崩溃的 OSD 会立即被连接的对等点和 MON(假设崩溃的 OSD 主机存活)标记为 down。禁用它以恢复旧行为,代价是在 OSD 在 I/O 操作中间崩溃时可能出现长时间的 I/O 停滞。
- 类型:
bool- 默认值:
true