注意

本文档适用于 Ceph 开发版本。

配置管理系统

配置管理系统存在是为了为每个守护进程提供适当的配置信息。配置可以被视为一组键值对。

配置如何设置?嗯,有几种来源:

  • ceph 配置文件,通常命名为 ceph.conf

  • 命令行参数:

    --debug-ms=1
    --debug-monc=10
    

    等。

  • 在运行时注入的参数使用injectargsconfig set

配置文件

大多数配置设置都源自 Ceph 配置文件。

我们如何找到配置文件?嗯,按顺序,我们检查:

  • 默认位置

  • 环境变量CEPH_CONF

  • 命令行参数-c

配置文件的每个节描述了将生效于守护进程特定子集的键值对。“global”节适用于所有内容。“mon”、“osd”和“mds”节分别指定所有监控器、所有 OSD 和所有 mds 服务器的设置。形式为mon.$name, osd.$namemds.$name的节分别给出该名称的监控器、OSD 或 MDS 的设置。文件中出现的配置值会覆盖先前的值。

可以在 src/sample.ceph.conf 中找到一个示例配置文件。

伪变量

配置系统允许使用$varname语法将任何配置值替换到另一个值中,类似于 bash shell 扩展的工作方式。

还定义了一些额外的特殊 metavariables:

  • $host: 展开为当前主机名

  • $type: 展开为“mds”、“osd”、“mon”或“client”中的一个

  • $id: 展开为守护进程标识符。对于osd.0,这将是一个0;对于mds.a,它将是a;对于client.admin,它将是admin.

  • $num: 与 $id 相同

  • $name: 展开为 $type.$id

读取配置值

Ceph 代码获取配置值有两种方式。一种是从名为g_conf的变量直接读取,或者等效地,g_ceph_ctx->_conf。另一种是注册一个观察者,该观察者将在相关配置值每次变化时被调用。这个观察者将在初始配置读取后不久被调用,并且之后每当相关值之一发生变化时都会被调用。每个观察者跟踪一组键,并且仅在相关键之一发生变化时被调用。

实现接口位于common/config_obs.h.

新代码应优先使用观察者方法,因为

  • 它更灵活,允许代码执行任何重新初始化以实现新配置值所需的操作。

  • 这是创建一个可被 injectargs 修改的 std::string 配置变量的唯一方法。

  • 即使对于整数值配置选项,当一个线程在另一个线程读取它们时更改值也可能导致微妙且难以诊断的错误。

由于这些原因,直接从g_conf读取应被视为已弃用,并且在新代码中不应这样做。永远不要更改g_conf.

修改配置值

配置值可以通过调用g_conf()->set_val来更改。更改配置后,您应该调用g_conf()->apply_changes来重新运行所有受影响的配置观察者。为了方便起见,您可以调用g_conf()->set_val_or_die来执行您认为永远不会失败的配置更改。

injectargs, parse_argv, and parse_env是三个其他修改配置的函数。与 set_val 类似,调用这些函数后应调用 apply_changes 以确保您的更改被应用。

定义配置选项

配置选项在common/options/*.yaml.in中定义。选项按其消费者进行分类。如果一个选项只由 ceph-osd 使用,它应该放在osd.yaml.in中。所有.yaml.in文件在构建时被转换为.cc.h文件y2c.py.

每个选项都使用 YAML 映射(字典)表示。一个典型的选项看起来像

- name: public_addr
  type: addr
  level: basic
  desc: public-facing address to bind to
  long_desc: The IP address for the public (front-side) network.
    Set for each daemon.
  services:
  - mon
  - mds
  - osd
  - mgr
  flags:
  - startup
  with_legacy: true

其中,允许以下键:

level

The level选项的属性是操作员或开发人员调整选项可能性的指示器:

基本

basic:用于普通操作员可能调整的基本配置选项。

advanced:用于操作员

for options that an operator 可以调整,但除非他们了解自己在做什么,否则不应触摸。不正确地调整高级选项可能会导致问题(性能甚至数据丢失)。 adjust, but should not touch unless they understand what they are doing. Adjusting advanced options poorly can lead to problems (performance or even data loss) if done incorrectly.

dev

internal:用于仅供开发人员使用的选项,无论是用于测试目的,还是用于描述用户不应调整但我们宁愿不编译到代码中的常量。

desc, long_descfmt_desc

desc

选项的简短描述。句子片段。例如

desc: Default checksum algorithm to use
long_desc

长描述是完整的句子,甚至可能是多个段落,并可能包括其他详细信息或注释。例如

long_desc: crc32c, xxhash32, and xxhash64 are available.  The _16 and _8 variants use
  only a subset of the bits for more compact (but less reliable) checksumming.
fmt_desc

使用 reStructuredText 格式化的描述。此属性仅由confval指令用于在文档中渲染选项。例如:

fmt_desc: The interval for "deep" scrubbing (fully reading all data). The
  ``osd_scrub_load_threshold`` does not affect this setting.

默认值

每个配置选项都有一个默认值。在某些情况下,还可能有守护进程默认仅适用于声明自己为守护进程的代码(在这种情况下,常规默认值仅适用于非守护进程)。例如:

default: crc32c

对于类型为float, sizesecs的选项,允许使用一些文字后缀,例如:

- name: mon_scrub_interval
  type: secs
  default: 1_day
- name: osd_journal_size
  type: size
  default: 5_K

为了更好的可读性,建议在添加或更新选项的默认值时使用这些文字后缀。

服务

服务是一个组件名称,如“common”、“osd”、“rgw”、“mds”等。它可能是一组组件,如:

services:
- mon
- mds
- osd
- mgr

例如,rocksdb 选项影响 osd 和 mon。如果一个选项被放入特定服务的.yaml.in文件中,相应的服务会自动添加到它的services属性中。例如,osd_scrub_begin_hour选项位于osd.yaml.in,即使它的services在此文件中未明确指定,此属性仍然包含osd.

标签

标签用于识别在不同服务之间以某种方式相关联的选项。例如:

网络中的任何主机

影响网络配置的选项

mkfs

仅在 mkfs 时重要的选项

例如:

tags:
- network

Enums

对于具有定义好的允许值集的选项:

enum_values:
- none
- crc32c
- crc32c_16
- crc32c_8
- xxhash32
- xxhash64

标志

runtime:值可以在运行时更新

守护进程/客户端不会从监控器配置数据库中拉取此值。我们不允许通过

no_mon_update

Daemons/clients do not pull this value from the monitor config database. We disallow setting this option via ceph config set ...设置此选项。此选项应通过ceph.conf或通过命令行配置。

startup:选项仅在守护进程启动期间生效

选项仅影响集群创建

cluster_create

选项仅影响守护进程创建

创建

option only affects daemon creation

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.