注意
本文档适用于 Ceph 的开发版本。
配置 Ceph
每个 Ceph 存储集群 至少运行三种类型的守护进程:
Ceph 监控器 (
ceph-mon)Ceph 管理器 (
ceph-mgr)Ceph OSD 守护进程 (
ceph-osd)
部署 Ceph 文件系统 的 Ceph 存储集群还至少运行一个 Ceph 元数据服务器 (ceph-mds)。部署 Ceph 对象存储 的集群运行 Ceph RADOS 网关守护进程 (radosgw)。
每个守护进程都有许多配置选项,每个选项都有一个默认值。通过更改这些配置选项来调整系统的行为。在覆盖默认值之前,请确保了解其后果,因为这可能会显着降低集群的性能和稳定性。请记住,默认值有时会在不同版本之间发生变化。因此,最好查阅适用于您的 Ceph 版本的本文档版本。升级到新的 Ceph 版本时,也请查阅发行说明以了解重要的更改。
选项名称
每个 Ceph 配置选项都有一个唯一的名称,由小写字母和下划线字符 (_) 连接的单词组成。
在命令行或持久化配置中指定选项名称时,下划线 (_) 和短横线 (-) 字符可以互换使用(例如,--mon-host 等同于 --mon_host)。
当选项名称出现在配置文件中时,空格也可以用来代替下划线或短横线。
为了清晰和方便起见,我们建议您始终使用下划线,就像我们在整个文档中所做的那样。
配置源
每个 Ceph 守护进程和客户端都从下面列出的一个或多个源中提取配置选项值。在列表中较晚找到的选项值将覆盖在列表中较早找到的任何选项值。换句话说,最后一个值获胜。
编译进的默认值
监控器维护的中央配置数据库
存储在本地主机上的配置文件
环境变量
命令行参数
通过管理套接字或注入设置的运行时覆盖
Ceph 进程启动时首先做的事情之一是解析通过命令行、环境变量和本地配置文件提供的配置选项。接下来,进程联系监控器集群以检索整个集群的中央存储配置。在获得完整的配置选项集后,守护进程或进程将开始启动。
引导选项
引导选项使每个 Ceph 守护进程能够联系监控器、进行身份验证并检索中央配置值。因此,这些选项通常存储在每个节点的本地配置文件中。这些选项包括:
- mon_host
这是一个由逗号、空格或分号分隔的 IP 地址或主机名列表。主机名通过 DNS 解析。所有 A 和 AAAA 记录都包含在搜索列表中。
- 类型:
str
- mon_host_override
这是 Ceph 进程在首次与 Ceph 集群建立通信时最初联系的监控器列表。这会覆盖从发送给较旧 Ceph 实例(如 librados 集群句柄)的 MonMap 更新中得出的已知监控器列表。此选项预计主要用于调试。
- 类型:
str
mon_data,osd_data,mds_data,mgr_data,以及定义守护进程存储数据的本地目录的类似选项。keyring,keyfile, and/orkey,可用于指定用于向监控器进行身份验证的凭据。请注意,在大多数情况下,默认的密钥环位置在上面指定的数据目录中。
通常没有理由修改这些选项的默认值。但是,有一个例外:mon_host 选项,它标识集群监控器的地址。当使用 DNS 来标识监控器 时,可以完全避免使用本地 Ceph 配置文件。
跳过监控器配置
可以将选项 --no-mon-config 传递给任何命令,以跳过从集群监控器检索配置信息的步骤。在配置完全通过配置文件管理的情况下,或者在需要维护但监控器法定人数已关闭的情况下,跳过此配置选项源非常有用。
配置段落
与单个进程或守护进程关联的每个配置选项都有一个值。可以为所有守护进程类型或仅为给定类型的守护进程设置配置选项的值。存储在监控器配置数据库或本地配置文件中的 Ceph 选项被分组到配置段落中,以指示它们适用于哪些守护进程或客户端。
这些段落包括:
- global
global下的设置会影响 Ceph 存储集群中的所有守护进程和客户端。在某些情况下,可能需要在一个或多个段落中为一个或多个守护进程设置某个选项,而这从其名称中并不明显。在这种情况下,该选项的描述可能会指出这一点,或者在大多数情况下,可以选择global段落(即中央配置who)以确保它应用于所有适当的守护进程或客户端。- 示例:
log_file = /var/log/ceph/$cluster-$type.$id.log
- mon
mon下的设置会影响 Ceph 存储集群中的所有ceph-mon监控器守护进程,并覆盖global中设置的任何值。- 示例:
mon_cluster_log_to_syslog = true
- mgr
mgr段落中的设置会影响 Ceph 存储集群中的所有ceph-mgr管理器守护进程,并覆盖global中设置的任何值。- 示例:
mgr_stats_period = 10
- osd
osd下的设置会影响 Ceph 存储集群中的所有ceph-osdOSD 守护进程,并覆盖global中设置的任何值。- 示例:
osd_op_queue = wpq
- mds
mds段落中的设置会影响 Ceph 存储集群中的所有 CephFSceph-mds守护进程,并覆盖global中设置的任何值。- 示例:
mds_cache_memory_limit = 10G
- client
client下的设置会影响所有 Ceph 客户端(例如,挂载的 Ceph 文件系统、附加的 Ceph 块设备)和守护进程,包括 RADOS 网关 (RGW) 和 NVMeoF 网关。- 示例:
objecter_inflight_ops = 512
配置段落也可以指定特定的守护进程或客户端名称。例如,mon.foo、osd.123 和 client.smith 都是有效的段落名称。很少需要这种粒度:在大多数情况下,最好将设置应用于所有监控器、所有 OSD(可能带有设备类别的掩码)等,以便随着集群的增长或编排器改变守护进程位置,预期的值仍然有效。
任何给定的守护进程都会从 global 段落、守护进程或客户端类型段落以及与其名称相同的段落中获取设置。最具体段落中的设置具有优先权:例如,如果在同一源(即同一配置文件)中的 global、mon 和 mon.foo 中指定了相同的选项,则将使用 mon.foo 设置。
如果在同一段落中指定了同一配置选项的多个值,则最后指定的值优先。
请注意,无论它们出现在哪个段落中,在本地配置文件中设置的值始终优先于来自监控器中央配置数据库的值。
元变量
元变量极大地简化了 Ceph 存储集群的配置。当在配置值中设置元变量时,Ceph 会在使用配置值时扩展元变量。通过这种方式,Ceph 元变量的行为类似于 Bash shell 中变量扩展的工作方式。
Ceph 支持以下元变量:
- $cluster
扩展为 Ceph 存储集群名称。当在同一硬件上运行多个 Ceph 存储集群时很有用。请注意,集群虚荣名称已弃用,并可能在未来版本中完全删除。我们强烈建议新集群仅使用默认名称
ceph进行配置,并且现有具有虚荣名称的集群应改造为默认名称。- 示例:
/etc/ceph/$cluster.keyring- 默认值:
ceph
- $type
扩展为守护进程或进程类型(例如,
mds、osd或mon)- 示例:
/var/lib/ceph/$type
- $id
扩展为守护进程或客户端标识符。对于
osd.0,这将是0;对于mds.a,它将是a。- 示例:
/var/lib/ceph/$type/$cluster-$id
- $host
扩展为运行进程的主机名。
- $name
扩展为
$type.$id。- 示例:
/var/run/ceph/$cluster-$name.asok
- $pid
扩展为守护进程的进程 ID (
PID)。- 示例:
/var/run/ceph/$cluster-$name-$pid.asok
Ceph 配置文件
在启动时,Ceph 进程在以下位置搜索配置文件:
$CEPH_CONF(即如果设置了$CEPH_CONF环境变量的值)-c path/path(即如果提供了-c命令行参数)/etc/ceph/$cluster.conf~/.ceph/$cluster.conf./$cluster.conf(即在当前工作目录中)仅在 FreeBSD 系统上,
/usr/local/etc/ceph/$cluster.conf
这里的 $cluster 是集群的名称(默认值:ceph)。
Ceph 配置文件使用 ini 样式的语法。可以在井号 (#) 或分号 (;) 之后添加注释文本。例如:
# <--A number (#) sign number sign (#) precedes a comment.
; A comment may be anything.
# Comments always follow a semi-colon semicolon (;) or a pound sign (#) on each line.
# The end of the line terminates a comment.
# We recommend that you provide comments in your configuration file(s).
配置文件段落名称
配置文件分为多个段落。每个段落必须以方括号中的有效配置段落名称开头(请参阅上面的 配置段落)。例如:
[global]
debug_ms = 0
[osd]
debug_ms = 1
[osd.1]
debug_ms = 10
[osd.2]
debug_ms = 10
配置文件选项值
配置选项的值是一个字符串。如果字符串太长无法容纳在一行上,您可以在行尾放置一个反斜杠 (\),反斜杠将充当行继续标记。在这种情况下,选项的值将是当前行中 = 之后的字符串与下一行中的字符串组合在一起。这是一个例子:
[global]
foo = long long ago\
long ago
在这个例子中,“foo” 选项的值是 “long long ago long ago”。请注意不要在多行字符串的最后一行末尾放置反斜杠。
本地配置文件中的选项值设置以换行符结束。在换行符之前可以添加以 # 为前缀的注释。
示例
[global]
obscure_one = difficult to explain # I will try harder in next release
simpler_one = nothing to explain
在这个例子中,“obscure one” 选项的值是 “difficult to explain”,“simpler one” 选项的值是 “nothing to explain”。
当选项值包含空格时,可以用单引号或双引号括起来,以使其范围清晰,并确保值中的第一个空格不会被解释为值的结束。例如:
[global]
line = "to be, or not to be"
有四个元字符如果打算作为选项值的一部分,则必须使用反斜杠 (\) 进行转义:=、#、; 和 [。
示例
[global]
secret = "I l0ve \# and \["
每个配置选项为其值指定以下类型之一:
- int
一个 64 位带符号整数。支持一些 SI 后缀,包括
K、M、G、T、P和E。它们分别代表 103、106、109 等)。B(字节)是唯一支持的单位字符串。因此1K、1M、128B和-1都是有效的选项值。当为定义阈值或限制的选项分配负值时,这通常表示该值是“无限制的”——即不强制执行阈值或限制。允许此类值的选项通常会在其单独的描述文本中指出。- 示例:
42,-1
- uint
一个无符号整数,与
integer的区别仅在于不允许负值。- 示例:
256,0
- str
一个 UTF-8 编码的字符串。某些字符是不允许的。请参阅上面的注释了解详细信息。
- 示例:
"hello world","i love \#",yet-another-name
- boolean
通常是
true或false。但是,允许任何整数:“0”表示false,任何非零值表示true。我们鼓励使用true或false以保持清晰。- 示例:
true,false,1,0
- addr
一个地址,可选地带有
v1、v2或any前缀用于信使协议。如果未指定前缀,则使用v2协议。有关更多详细信息,请参阅 地址格式。- 示例:
v1:1.2.3.4:567,v2:1.2.3.4:567,1.2.3.4:567,2409:8a1e:8fb6:aa20:1260:4bff:fe92:18f5::567,[::1]:6789
- addrvec
一组由逗号 (
,) 分隔的 IPv4 或 IPv6 地址。地址集可以选择用[和]分隔。- 示例:
[v1:1.2.3.4:567,v2:1.2.3.4:568],v1:1.2.3.4:567,v1:1.2.3.14:567,[2409:8a1e:8fb6:aa20:1260:4bff:fe92:18f5::567], [2409:8a1e:8fb6:aa20:1260:4bff:fe92:18f5::568]
- uuid
一个 UUID 字符串,格式由 RFC4122 定义。某些变体也受支持。有关更多详细信息,请参阅此 Boost 文档。
- 示例:
f81d4fae-7dec-11d0-a765-00a0c91e6bf6
- 大小
一个 64 位无符号整数。支持 SI 前缀和 IEC 前缀。
B是唯一支持的单位字符串。不允许负值。- 示例:
1Ki,1K,1KiBand1B。
- 秒
表示时间持续时间。默认时间单位是秒。支持以下时间单位:
second:
s,sec,second,secondsminute:
m,min,minute,minuteshour:
hs,hr,hour,hoursday:
d,day,daysweek:
w,wk,week,weeksmonth:
mo,month,monthsyear:
y,yr,year,years
- 示例:
1 m,1mand1 week
监控器配置数据库
监控器管理一个配置选项数据库,可供整个集群使用。这允许对整个系统进行简化的集中配置。为了方便管理、透明度并避免不一致,绝大多数配置选项可以而且应该设置在这个数据库中,而不是设置在守护进程或客户端节点上的 ceph.conf 文件中。
一些特定的设置可能需要存储在本地配置文件中,因为它们会影响进程连接到监控器、进行身份验证和获取额外配置信息的能力。在大多数情况下,这仅适用于 mon_host 选项。如果您的 DNS 基础设施非常健壮并且在您的控制之下,可以通过使用 DNS SRV 记录 来避免这个问题。
段落和掩码
存储在监控器中的配置选项可以存储在全局段落、守护进程类型段落或特定守护进程段落中。从这个意义上讲,它们与在节点本地配置文件中设置的选项没有什么不同,受制于上述源优先级。
此外,选项可能与一个掩码关联,以进一步限制选项值适用于哪些守护进程或客户端。掩码有两种形式:
type:location,其中type是 CRUSH 桶类型,例如rack或host,location是该属性的值。例如,host:foo会将选项限制为仅在名为foo的主机上运行的守护进程或客户端。最近的 Ceph 版本提供了功能,避免了以前需要特定于主机的配置值的大多数情况。示例包括 OSD 设备类别、osd_memory_target自动调谐器以及特定于某些介质的选项值。后者的示例包括osd_recovery_sleep_ssd和osd_recovery_max_active_hdd。class:device-class,其中device-class是 CRUSH 设备类别的名称(例如hdd或ssd)。例如,class:ssd会将选项限制为仅基于 SAS、SATA 和 NVMe SSD 构建的 OSD。此掩码对非 OSD 守护进程或客户端没有影响
在指定配置选项的命令中,选项的参数(在以下示例中,这是 who 字符串)可以是段落名称、掩码,或者是用斜杠字符 (/) 分隔的两者组合。例如,osd/rack:foo 将指代 foo CRUSH rack 桶下的所有 OSD 守护进程。
当显示配置选项时,段落名称和任何掩码都显示在单独的字段或列中,以使其更具可读性。
命令
以下 CLI 命令用于配置集群:
ceph config dump转储整个监控器中央配置数据库。ceph config get <who>转储存储在监控器配置数据库中用于特定守护进程或客户端的配置选项(例如mds.a)。ceph config get <who> <option>显示存储在监控器配置数据库中用于特定守护进程或客户端的配置值(例如mds.a),或者,如果该值不存在于监控器配置数据库中,则显示编译进的默认值。ceph config set <who> <option> <value>在监控器的配置数据库中设置配置选项。如果此选项以前设置过值,它将被覆盖。注意使用适当的who和可选的掩码属性设置值。例如,如果存在一个who范围为osd的someoption选项值,然后执行形式为ceph config set global someoption somevalue的命令,中央数据库将保留两者。这在某些情况下可能有用,但可能导致混乱,通常最好避免。ceph config show <who>显示正在运行的守护进程的配置值。如果正在使用本地配置文件,或者通过命令行或运行时通过管理套接字、ceph tell或ceph daemon命令覆盖了选项,则这些设置可能与监控器存储的设置不同。显示每个选项值的来源。ceph config show-with-defaults <who>与上述命令类似,但也会显示所有默认值,对于已更改的值,还会显示更改位置。ceph config assimilate-conf -i <input_file> -o <output_file>摄取来自 input_file 的配置文件,并将找到的任何有效选项设置到监控器配置数据库中。任何无法识别、无效或无法由监控器管理的设置将以缩写的配置文件形式返回到 output_file 中。此命令在从传统配置文件过渡到基于监控器的集中式配置时非常有用。ceph-conf --show-config是一个传统命令。
请注意,ceph config get <who> [<option>] 和 ceph config show <who> 返回的值不一定相同。前者命令仅显示编译进的默认值。要确定配置选项是否存在于监控器配置数据库中,请运行 ceph config dump。
帮助
要获取特定选项的帮助,请运行以下命令:
ceph config help <option>
例如
ceph config help log_file
log_file - path to log file
(std::string, basic)
Default (non-daemon):
Default (daemon): /var/log/ceph/$cluster-$name.log
Can update at runtime: false
See also: [log_to_stderr,err_to_stderr,log_to_syslog,err_to_syslog]
或
ceph config help log_file -f json-pretty
{
"name": "log_file",
"type": "std::string",
"level": "basic",
"desc": "path to log file",
"long_desc": "",
"default": "",
"daemon_default": "/var/log/ceph/$cluster-$name.log",
"tags": [],
"services": [],
"see_also": [
"log_to_stderr",
"err_to_stderr",
"log_to_syslog",
"err_to_syslog"
],
"enum_values": [],
"min": "",
"max": "",
"can_update_at_runtime": false
}
每个选项的 level 属性为 basic、advanced 或 dev。标记为 dev 级别的选项旨在供开发人员用于测试目的,Ceph 管理员(操作员)被敦促在没有专家级理解或专家支持专业人员建议的情况下不要更改其值。
注意
此命令使用编译到正在运行的监控器中的配置 schema。如果您有一个混合版本集群(在升级期间可能存在),您可能希望通过运行以下形式的命令从特定的正在运行的守护进程查询选项 schema:
ceph daemon <name> config help [option]
注意
可以通过运行 ceph versions 命令报告正在运行的守护进程的 Ceph 版本。如果您的集群未处于升级过程中,所有守护进程应显示相同的版本。如果在升级之外报告了多个版本,则先前的升级可能失败或执行了手动更改,应检查情况并考虑升级以协调版本。
运行时更改
在大多数情况下,对守护进程配置的运行时更改无需重新启动守护进程即可生效。这可用于增加或减少日志输出量、临时提高或降低日志子系统调试级别,或用于运行时优化。
使用 ceph config set 命令更新配置选项。例如,要在特定 OSD 上启用最详细的调试日志级别,请运行以下形式的命令:
ceph config set osd.1701 debug_ms 20
注意
如果选项已在本地配置文件中自定义,则中央配置设置将被忽略,因为它具有低于本地配置文件的优先级。
注意
日志子系统级别范围从 0 到 20。
覆盖值
可以通过使用 ceph tell 或 ceph daemon CLI 命令临时设置运行时选项值。此过程称为注入。这些覆盖值是短暂的,这意味着它们仅影响守护进程的当前实例,并在守护进程重新启动时恢复为持久配置的值。因此,它们对于仔细测试选项值调整很有用,但请注意也要通过 ceph config set 持久化永久更改。
覆盖值可以通过两种方式设置:
从任何主机,使用以下形式的命令向守护进程发送消息:
ceph tell <name> config set <option> <value>例如
ceph tell osd.1701 config set debug_osd 20tell命令也可以接受通配符作为守护进程标识符。例如,要调整所有 OSD 守护进程的调试级别,请运行以下形式的命令:ceph tell osd.* config set debug_osd 20在运行特定守护进程的主机上,通过
/var/run/ceph中的套接字连接到守护进程,运行以下形式的命令:ceph daemon <name> config set <option> <value>例如
ceph daemon osd.4 config set debug_osd 20
注意
在 ceph config show 命令的输出中,这些临时值显示为来源 override。
查看运行时设置
您可以使用 ceph config show 命令查看正在运行的守护进程指定的当前设置。例如,要查看守护进程 osd.1701 的(非默认)设置,请运行以下命令:
ceph config show osd.1701
要仅查看特定守护进程的单个选项值,请运行以下形式的命令:
ceph config show osd.1701 debug_osd
要查看特定守护进程的所有设置(包括具有默认值的设置),请运行以下形式的命令:
ceph config show-with-defaults osd.1701
您可以通过连接到运行该守护进程的主机上的管理套接字来显示该守护进程的所有设置。例如,要转储 osd.1701 的所有当前设置,请在运行 osd.1701 的主机上运行以下命令。可以使用 ceph osd find 命令或 ceph orch ps 命令确定守护进程运行的主机。
ceph daemon osd.1701 config show
要查看非默认设置并查看每个值的来源(例如,配置文件、中央监控器数据库或覆盖),请运行以下形式的命令:
ceph daemon osd.1701 config diff
要查看单个选项的值,请运行以下形式的命令:
ceph daemon osd.1701 config get debug_osd
Octopus 版本引入的更改
Octopus 版本更改了配置文件解析方式。这些更改如下:
允许重复的配置选项,并且不会显示警告。这意味着文件中最后出现的值将生效。在此更改之前,当遇到包含重复选项的行时,Ceph 会显示以下形式的警告消息:
warning line 42: 'foo' in section 'bar' redefined
在 Octopus 之前,包含无效 UTF-8 字符的选项会被忽略并显示警告消息。在 Octopus 及更高版本中,它们被视为致命错误。
反斜杠字符
\被解释为行继续标记,它将下一行与当前行合并。在 Octopus 之前,要求行尾的反斜杠后面必须跟一个非空行。在 Octopus 及更高版本中,允许反斜杠后面跟一个空行。在配置文件中,每行指定一个单独的配置选项。选项的名称及其值用
=分隔,值可以用单引号或双引号括起来。如果指定了无效配置,我们将将其视为无效配置文件并记录以下形式的消息:bad option ==== bad value
在 Octopus 之前,如果配置文件中未指定段落名称,则所有选项都将设置为仿佛它们位于
global段落中。不鼓励这种方法。自 Octopus 以来,任何没有段落名称的配置文件必须只包含一个选项。