NAME

pveceph - 管理 Proxmox VE 节点上的 Ceph 服务

SYNOPSIS

pveceph <COMMAND> [ARGS] [OPTIONS]

常用命令示例:

pveceph status
pveceph pool ls

pveceph createmgr

pveceph mgr create 的别名。

pveceph createmon

pveceph mon create 的别名。

pveceph createosd

pveceph osd create 的别名。

pveceph createpool

pveceph pool create 的别名。

pveceph destroymgr

pveceph mgr destroy 的别名。

pveceph destroymon

pveceph mon destroy 的别名。

pveceph destroyosd

pveceph osd destroy 的别名。

pveceph destroypool

pveceph pool destroy 的别名。

pveceph fs create [OPTIONS]

创建 Ceph 文件系统。

--add-storage <boolean> (default = 0)

将已创建的 CephFS 配置为此集群的存储。

--name (?^:^[^:/\s]+$) (default = cephfs)

Ceph 文件系统名称。

--pg_num <integer> (8 - 32768) (default = 128)

后端数据池的 placement group 数量。元数据池将使用该数量的四分之一。

pveceph fs destroy <name> [OPTIONS]

销毁 Ceph 文件系统。

<name>: <string>

Ceph 文件系统名称。

--remove-pools <boolean> (default = 0)

移除此 fs 配置的数据池和元数据池。

--remove-storages <boolean> (default = 0)

移除此 fs 配置的所有由 pveceph 管理的存储。

pveceph help [OPTIONS]

获取指定命令的帮助。

--extra-args <array>

显示特定命令的帮助。

--verbose <boolean>

详细输出格式。

pveceph init [OPTIONS]

创建初始 Ceph 默认配置并设置符号链接。

--cluster-network <string>

声明一个独立的集群网络,OSD 会通过该网络传输 heartbeat、对象复制和恢复流量。

Note 需要选项:network
--disable_cephx <boolean> (default = 0)

禁用 cephx 认证。

Warning cephx 是用于防范中间人攻击的安全功能。只有在网络为私有网络时,才应考虑禁用 cephx。
--min_size <integer> (1 - 7) (default = 2)

允许 I/O 时每个对象所需的最少可用副本数。

--network <string>

为所有 Ceph 相关流量使用指定网络。

--pg_bits <integer> (6 - 14) (default = 6)

placement group 位数,用于指定默认 placement group 数量。

已弃用。此设置已在较新的 Ceph 版本中弃用。

--size <integer> (1 - 7) (default = 3)

每个对象的目标副本数。

pveceph install [OPTIONS]

安装 Ceph 相关软件包。

--allow-experimental <boolean> (default = 0)

允许使用实验版本。请谨慎使用。

--repository <enterprise | no-subscription | test> (default = enterprise)

要使用的 Ceph 仓库。

--version <quincy | reef | squid> (default = quincy)

要安装的 Ceph 版本。

pveceph lspools

pveceph pool ls 的别名。

pveceph mds create [OPTIONS]

创建 Ceph Metadata Server(MDS)。

--hotstandby <boolean> (default = 0)

决定 ceph-mds 守护进程是否应轮询并重放活动 MDS 的日志。MDS 故障时切换更快,但需要更多空闲资源。

--name [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])? (default = nodename)

mds 的 ID;省略时与 nodename 相同。

pveceph mds destroy <name>

销毁 Ceph Metadata Server。

<name>: [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?

mds 的名称(ID)。

pveceph mgr create [OPTIONS]

创建 Ceph Manager。

--id [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?

manager 的 ID;省略时与 nodename 相同。

pveceph mgr destroy <id>

销毁 Ceph Manager。

<id>: [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?

manager 的 ID。

pveceph mon create [OPTIONS]

创建 Ceph Monitor 和 Manager。

--mon-address <string>

覆盖自动检测到的 monitor IP 地址。必须位于 Ceph 的 public network 中。

--monid [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?

monitor 的 ID;省略时与 nodename 相同。

pveceph mon destroy <monid>

销毁 Ceph Monitor 和 Manager。

<monid>: [a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?

Monitor ID。

pveceph osd create <dev> [OPTIONS]

创建 OSD。

<dev>: <string>

块设备名称。

--crush-device-class <string>

在 CRUSH 中设置 OSD 的设备类别。

--db_dev <string>

block.db 的块设备名称。

--db_dev_size <number> (1 - N) (default = bluestore_block_db_size or 10% of OSD size)

block.db 的大小,单位为 GiB。

Note 需要选项:db_dev
--encrypted <boolean> (default = 0)

启用 OSD 加密。

--osds-per-device <integer> (1 - N)

每个物理设备上的 OSD 服务数量。仅对高速 NVMe 设备有用,可更好地利用其性能。

--wal_dev <string>

block.wal 的块设备名称。

--wal_dev_size <number> (0.5 - N) (default = bluestore_block_wal_size or 1% of OSD size)

block.wal 的大小,单位为 GiB。

Note 需要选项:wal_dev

pveceph osd destroy <osdid> [OPTIONS]

销毁 OSD。

<osdid>: <integer>

OSD ID。

--cleanup <boolean> (default = 0)

设置后,会移除分区表条目。

pveceph osd details <osdid> [OPTIONS] [FORMAT_OPTIONS]

获取 OSD 详细信息。

<osdid>: <string>

OSD 的 ID。

--verbose <boolean> (default = 0)

打印详细信息,与 json-pretty 输出格式相同。

pveceph pool create <name> [OPTIONS]

创建 Ceph pool。

<name>: (?^:^[^:/\s]+$)

pool 的名称。必须唯一。

--add_storages <boolean> (default = 0; for erasure coded pools: 1)

使用新的 pool 配置虚拟机和容器存储。

--application <cephfs | rbd | rgw> (default = rbd)

pool 的应用类型。

--crush_rule <string>

用于在集群中映射对象放置位置的规则。

--erasure-coding k=<integer> ,m=<integer> [,device-class=<class>] [,failure-domain=<domain>] [,profile=<profile>]

为 RBD 创建 erasure coded pool,并创建配套的 replicated pool 用于元数据存储。使用 EC 时,通用 Ceph 选项 sizemin_sizecrush_rule 参数会应用到元数据池。

--min_size <integer> (1 - 7) (default = 2)

每个对象的最少副本数。

--pg_autoscale_mode <off | on | warn> (default = warn)

pool 的自动 PG 扩缩模式。

--pg_num <integer> (1 - 32768) (default = 128)

placement group 数量。

--pg_num_min <integer> (-N - 32768)

最小 placement group 数量。

--size <integer> (1 - 7) (default = 3)

每个对象的副本数。

--target_size ^(\d+(\.\d+)?)([KMGT])?$

PG autoscaler 使用的 pool 估算目标大小。

--target_size_ratio <number>

PG autoscaler 使用的 pool 估算目标比例。

pveceph pool destroy <name> [OPTIONS]

销毁 pool。

<name>: <string>

pool 的名称。必须唯一。

--force <boolean> (default = 0)

如果为 true,即使 pool 正在使用也会销毁。

--remove_ecprofile <boolean> (default = 1)

移除 erasure code profile。适用时默认为 true。

--remove_storages <boolean> (default = 0)

移除此 pool 配置的所有由 pveceph 管理的存储。

pveceph pool get <name> [OPTIONS] [FORMAT_OPTIONS]

显示当前 pool 状态。

<name>: <string>

pool 的名称。必须唯一。

--verbose <boolean> (default = 0)

启用后,将显示额外数据(例如统计信息)。

pveceph pool ls [FORMAT_OPTIONS]

列出所有 pool 及其设置(这些设置可通过 POST/PUT 端点设置)。

pveceph pool set <name> [OPTIONS]

更改 POOL 设置。

<name>: (?^:^[^:/\s]+$)

pool 的名称。必须唯一。

--application <cephfs | rbd | rgw>

pool 的应用类型。

--crush_rule <string>

用于在集群中映射对象放置位置的规则。

--min_size <integer> (1 - 7)

每个对象的最少副本数。

--pg_autoscale_mode <off | on | warn>

pool 的自动 PG 扩缩模式。

--pg_num <integer> (1 - 32768)

placement group 数量。

--pg_num_min <integer> (-N - 32768)

最小 placement group 数量。

--size <integer> (1 - 7)

每个对象的副本数。

--target_size ^(\d+(\.\d+)?)([KMGT])?$

PG autoscaler 使用的 pool 估算目标大小。

--target_size_ratio <number>

PG autoscaler 使用的 pool 估算目标比例。

pveceph purge [OPTIONS]

销毁 Ceph 相关数据和配置文件。

--crash <boolean>

同时清除 Ceph 崩溃日志 /var/lib/ceph/crash。

--logs <boolean>

同时清除 Ceph 日志 /var/log/ceph。

pveceph start [OPTIONS]

启动 Ceph 服务。

--service (ceph|mon|mds|osd|mgr)(\.[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?)? (default = ceph.target)

Ceph 服务名称。

pveceph status

获取 Ceph 状态。

pveceph stop [OPTIONS]

停止 Ceph 服务。

--service (ceph|mon|mds|osd|mgr)(\.[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?)? (default = ceph.target)

Ceph 服务名称。

DESCRIPTION

screenshot/gui-ceph-status-dashboard.png

Proxmox VE 将计算系统和存储系统统一起来,也就是说,你可以在同一个集群中的相同物理 节点上同时用于计算(处理虚拟机和容器)以及副本存储。传统上相互隔离的计算资源 和存储资源可以整合为单一的超融合设备。独立的存储网络(SAN)以及通过网络附加 存储(NAS)建立的连接也随之消失。通过集成 Ceph 这一开源软件定义存储平台, Proxmox VE 能够直接在 hypervisor 节点上运行和管理 Ceph 存储。

Ceph 是一个分布式对象存储和文件系统,旨在提供出色的性能、可靠性和可扩展性。

在 Proxmox VE 上使用 Ceph 的一些优势包括:
  • 可通过 CLI 和 GUI 轻松设置和管理

  • 精简置备

  • 支持快照

  • 自愈

  • 可扩展到 EB 级别

  • 提供块存储、文件系统和对象存储

  • 可设置具备不同性能和冗余特征的池

  • 数据会进行复制,从而具备容错能力

  • 可运行在通用硬件上

  • 不需要硬件 RAID 控制器

  • 开源

对于中小规模部署,可以直接在 Proxmox VE 集群节点上安装 Ceph 服务器,以使用 RADOS Block Devices(RBD)或 CephFS(参见 Ceph RADOS Block Devices (RBD))。现代硬件拥有大量 CPU 计算能力和内存,因此可以在同一 节点上同时运行存储服务和虚拟客户机。

为简化管理,Proxmox VE 提供原生集成,可通过内置 Web 界面或 pveceph 命令行工具在 Proxmox VE 节点上安装和管理 Ceph 服务。

术语

作为 RBD 存储使用时,Ceph 由多个守护进程组成:
  • Ceph Monitor(ceph-mon,或 MON)

  • Ceph Manager(ceph-mgr,或 MGR)

  • Ceph Metadata Service(ceph-mds,或 MDS)

  • Ceph Object Storage Daemon(ceph-osd,或 OSD)

Tip 强烈建议熟悉 Ceph
[Ceph intro https://docs.ceph.com/en/quincy/start/]
, 其架构
[Ceph architecture https://docs.ceph.com/en/quincy/architecture/]
以及术语
[Ceph glossary https://docs.ceph.com/en/quincy/glossary]
.

健康 Ceph 集群的建议

要构建超融合 Proxmox + Ceph 集群,必须至少使用三台服务器,并且最好使用相同配置 的服务器。

也请查看 Ceph 网站中的建议。

Note 以下建议应视为选择硬件时的粗略指导。因此,仍然必须根据具体需求进行调整。 应测试你的部署,并持续监控健康状态和性能。
CPU

Ceph 服务可分为两类:

  • CPU 使用密集型,受益于较高的 CPU 基础频率和多个核心。此类别包括:

    • Object Storage Daemon(OSD)服务

    • CephFS 使用的 Meta Data Service(MDS)

  • 中等 CPU 使用型,不需要多个 CPU 核心。此类别包括:

    • Monitor(MON)服务

    • Manager(MGR)服务

作为简单经验法则,应为每个 Ceph 服务至少分配一个 CPU 核心(或线程),以提供 稳定且持久的 Ceph 性能所需的最低资源。

例如,如果计划在一个节点上运行一个 Ceph monitor、一个 Ceph manager 和 6 个 Ceph OSD 服务,并以基础且稳定的性能为目标,则应为 Ceph 专门保留 8 个 CPU 核心。

请注意,OSD 的 CPU 使用率主要取决于磁盘性能。磁盘可能提供的 IOPS(IO Operations per Second)越高,OSD 服务可利用的 CPU 就越多。对于现代企业级 SSD 磁盘,例如可以长期承受超过 100’000 IOPS 且延迟低于毫秒级的 NVMe,每个 OSD 都可能使用多个 CPU 线程;对于非常高性能的磁盘,每个 NVMe 支撑的 OSD 使用四到六 个 CPU 线程是可能的。

内存

尤其是在超融合部署中,需要仔细规划并监控内存消耗。除了虚拟机和容器的预期内存 使用量外,还必须考虑为 Ceph 保留足够内存,以提供出色且稳定的性能。

作为经验法则,每个 OSD 大约会为 1 TiB 数据使用 1 GiB 内存。正常情况下使用量 可能更低,但在恢复、重新平衡或 backfilling 等关键操作期间会使用最多内存。这 意味着应避免在正常运行时就耗尽可用内存,而应保留一定余量以应对故障。

OSD 服务本身也会使用额外内存。该守护进程的 Ceph BlueStore 后端默认需要 3-5 GiB 内存(可调整)。

网络

建议至少使用 10 Gbps 或更高带宽的网络专门承载 Ceph 流量。对于三到五节点集群, 如果没有可用的 10+ Gbps 交换机,也可以选择网状网络部署
[Full Mesh Network for Ceph https://docs.pxvirt.lierfag.comFull_Mesh_Network_for_Ceph_Server]

Important 流量规模,尤其是恢复期间的流量,会干扰同一网络上的其他服务;其中对延迟敏感的 Proxmox VE corosync 集群栈尤其可能受到影响,并可能导致集群 quorum 丢失。将 Ceph 流量迁移到专用且物理隔离的网络,可以避免这种干扰;这不仅适用于 corosync,也 适用于任何虚拟客户机提供的网络服务。

估算带宽需求时,需要考虑磁盘性能。单块 HDD 可能无法打满 1 Gb 链路,但每个节点上 多个 HDD OSD 也可能已经打满 10 Gbps。如果使用现代 NVMe SSD,单块磁盘就可能打满 10 Gbps 或更高带宽。对于这类高性能部署,建议至少使用 25 Gbps;为了充分利用底层 磁盘的性能潜力,甚至可能需要 40 Gbps 或 100+ Gbps。

如果不确定,对于高性能部署,建议使用三个(物理)独立网络:

  • 一个超高带宽(25+ Gbps)网络,用于 Ceph(内部)集群流量。

  • 一个高带宽(10+ Gbps)网络,用于 ceph server 和 ceph client 之间的 Ceph (public)存储流量。根据需求,也可用于承载虚拟客户机流量和虚拟机在线迁移流量。

  • 一个中等带宽(1 Gbps)网络,专用于对延迟敏感的 corosync 集群通信。

磁盘

规划 Ceph 集群规模时,必须考虑恢复时间。尤其是在小型集群中,恢复可能需要较长 时间。建议在小型部署中使用 SSD 而不是 HDD,以缩短恢复时间,并尽量降低恢复期间 发生后续故障事件的可能性。

通常,SSD 会比机械磁盘提供更多 IOPS。考虑到这一点,并结合更高成本,实施基于 类别的池分离可能是有意义的。另一种加速 OSD 的 方法,是使用更快的磁盘作为 journal 或 DB/Write-Ahead-Log 设备,参见 创建 Ceph OSD。如果将更快的磁盘用于多个 OSD,必须在 OSD 与 WAL/DB(或 journal)磁盘之间选择合适平衡,否则这块更快的磁盘会成为所有关联 OSD 的瓶颈。

除磁盘类型外,当每个节点上的磁盘容量一致且数量均匀分布时,Ceph 性能最佳。例如, 每个节点使用 4 块 500 GB 磁盘,优于混合使用一块 1 TB 磁盘和三块 250 GB 磁盘。

还需要平衡 OSD 数量和单个 OSD 容量。更高容量可以提升存储密度,但也意味着单个 OSD 故障会迫使 Ceph 一次恢复更多数据。

避免 RAID

由于 Ceph 自行处理数据对象冗余以及对磁盘(OSD)的多路并行写入,使用 RAID 控制器通常不会提升性能或可用性。相反,Ceph 的设计目标是自行处理整块磁盘,中间 不需要任何抽象层。RAID 控制器并非为 Ceph 工作负载设计,可能会使问题复杂化, 有时甚至降低性能,因为其写入和缓存算法可能会干扰 Ceph 的算法。

Warning 避免使用 RAID 控制器。请改用 host bus adapter(HBA)。

Ceph 初始安装与配置

使用基于 Web 的向导

screenshot/gui-node-ceph-install.png

使用 Proxmox VE 时,可以受益于易用的 Ceph 安装向导。点击某个集群节点,并在菜单树中 导航到 Ceph 部分。如果尚未安装 Ceph,你会看到安装提示。

向导分为多个部分,每一部分都需要成功完成,才能使用 Ceph。

首先需要选择要安装的 Ceph 版本。优先选择与其他节点相同的版本;如果这是第一个 安装 Ceph 的节点,则选择最新版本。

开始安装后,向导会从 Proxmox VE 的 Ceph 仓库下载并安装所有必需软件包。

screenshot/gui-node-ceph-install-wizard-step0.png

完成安装步骤后,需要创建配置。每个集群只需要执行一次此步骤,因为该配置会通过 Proxmox VE 的集群化 配置文件系统(pmxcfs)自动分发 到所有剩余集群成员。

配置步骤包括以下设置:

  • Public Network: 此网络用于 public 存储通信(例如使用 Ceph RBD 后端磁盘的 虚拟机,或 CephFS 挂载),以及不同 Ceph 服务之间的通信。此设置为必填项。
    强烈建议将 Ceph 流量与 Proxmox VE 集群通信(corosync)分离,并尽可能与虚拟客户机 面向前端的(public)网络分离。否则,Ceph 的高带宽 IO 流量可能会干扰其他依赖 低延迟的服务。

  • Cluster Network: 指定是否也分离 OSD 复制和心跳流量。此 设置为可选项。
    建议使用物理隔离的网络,因为它可以减轻 Ceph public 网络和虚拟客户机网络的负载, 同时显著提升 Ceph 性能。
    Ceph cluster network 可以在之后配置并迁移到另一个物理隔离网络。

screenshot/gui-node-ceph-install-wizard-step2.png

还有两个被视为高级设置的选项,因此只有在明确理解其作用时才应更改。

  • Number of replicas: 定义对象被复制的次数。

  • Minimum replicas: 定义将 I/O 标记为完成所需的最小副本数。

此外,还需要选择第一个 monitor 节点。此步骤为必需项。

至此完成。现在应在最后一步看到成功页面,其中包含后续操作说明。系统现在已准备好 开始使用 Ceph。要开始使用,需要创建一些额外的 monitorsOSDs 以及至少一个 pool

本章后续内容将指导你充分利用基于 Proxmox VE 的 Ceph 部署。这包括前述提示,以及更多 内容,例如 CephFS;它是新 Ceph 集群的有用补充。

通过 CLI 安装 Ceph 软件包

除了推荐使用 Web 界面中的 Proxmox VE Ceph 安装向导外,也可以在每个节点上使用以下 CLI 命令:

pveceph install

这会在 /etc/apt/sources.list.d/ceph.list 中设置 apt 软件包仓库,并安装必需 软件。

通过 CLI 进行 Ceph 初始配置

使用 Proxmox VE Ceph 安装向导(推荐),或在一个节点上运行以下命令:

pveceph init --network 10.10.10.0/24

这会在 /etc/pve/ceph.conf 创建初始配置,并为 Ceph 使用专用网络。该文件会通过 pmxcfs 自动分发到所有 Proxmox VE 节点。该命令还会在 /etc/ceph/ceph.conf 创建指向该文件的符号链接。因此,可以直接运行 Ceph 命令, 而无需指定配置文件。

常用命令示例

以下命令可用于安装 Ceph、初始化集群网络,并查看 Ceph 当前状态:

pveceph install
pveceph init --network 10.10.10.0/24
ceph -s

Ceph Monitor

screenshot/gui-ceph-monitor.png

Ceph Monitor(MON)
[Ceph Monitor https://docs.ceph.com/en/quincy/rados/configuration/mon-config-ref/]
维护集群映射的主副本。为了实现高可用,至少需要 3 个 monitor。如果使用安装向导, 则已经安装了一个 monitor。只要集群为中小规模,就不需要超过 3 个 monitor。只有 非常大的集群才需要更多。

创建 Monitor

在每个要放置 monitor 的节点上(建议使用三个 monitor),可通过 GUI 中的 Ceph → Monitor 选项卡创建,或运行:

pveceph mon create

销毁 Monitor

要通过 GUI 移除 Ceph Monitor,首先在树视图中选择一个节点,并进入 Ceph → Monitor 面板。选择 MON 并点击 Destroy 按钮。

要通过 CLI 移除 Ceph Monitor,首先连接到运行该 MON 的节点。然后执行以下命令:

pveceph mon destroy
Note quorum 至少需要三个 Monitor。

Ceph Manager

Manager 守护进程与 monitor 一起运行。它提供用于监控集群的接口。自 Ceph luminous 发布以来,至少需要一个 ceph-mgr 守护进程
[Ceph Manager https://docs.ceph.com/en/quincy/mgr/]

创建 Manager

可以安装多个 Manager,但任意时刻只有一个 Manager 处于 active 状态。

pveceph mgr create
Note 建议在 monitor 节点上安装 Ceph Manager。为了实现高可用,请安装多个 manager。

销毁 Manager

要通过 GUI 移除 Ceph Manager,首先在树视图中选择一个节点,并进入 Ceph → Monitor 面板。选择 Manager 并点击 Destroy 按钮。

要通过 CLI 移除 Ceph Manager,首先连接到运行该 Manager 的节点。然后执行以下 命令:

pveceph mgr destroy
Note 虽然 manager 不是硬依赖,但它对 Ceph 集群非常关键,因为它负责 PG-autoscaling、设备健康监控、telemetry 等重要功能。

Ceph OSDs

screenshot/gui-ceph-osd-status.png

Ceph Object Storage Daemons 通过网络为 Ceph 存储对象。建议每块物理磁盘 使用一个 OSD。

创建 OSD

可以通过 Proxmox VE Web 界面创建 OSD,也可以通过 CLI 使用 pveceph 创建。例如:

pveceph osd create /dev/sd[X]
Tip 建议 Ceph 集群至少包含三个节点和至少 12 个 OSD,并在各节点之间均匀分布。

如果磁盘此前已被使用(例如用于 ZFS 或作为 OSD),首先需要清除所有使用痕迹。要 移除分区表、引导扇区和任何其他 OSD 残留,可以使用以下命令:

ceph-volume lvm zap /dev/sd[X] --destroy
Warning 上述命令会销毁磁盘上的所有数据!
Ceph Bluestore

从 Ceph Kraken 版本开始,引入了一种新的 Ceph OSD 存储类型,称为 Bluestore
[Ceph Bluestore https://ceph.com/community/new-luminous-bluestore/]
. 自 Ceph Luminous 起,这是创建 OSD 时的默认类型。

pveceph osd create /dev/sd[X]
Block.db 与 block.wal

如果希望为 OSD 使用单独的 DB/WAL 设备,可以通过 -db_dev-wal_dev 选项 指定。如果未单独指定 WAL,它会与 DB 放在一起。

pveceph osd create /dev/sd[X] -db_dev /dev/sd[Y] -wal_dev /dev/sd[Z]

可以分别使用 -db_size-wal_size 参数直接选择它们的大小。如果未给出这些 参数,将按顺序使用以下值:

  • Ceph 配置中的 bluestore_block_{db,wal}_size…

    • … database,osd

    • … database,global

    • … file,osd

    • … file,global

  • OSD 大小的 10%(DB)/1%(WAL)

Note DB 存储 BlueStore 的内部元数据,WAL 是 BlueStore 的内部 journal 或 write-ahead log。建议使用快速 SSD 或 NVRAM 以获得更好性能。
Ceph Filestore

在 Ceph Luminous 之前,Filestore 是 Ceph OSD 的默认存储类型。自 Ceph Nautilus 起,Proxmox VE 不再支持使用 pveceph 创建此类 OSD。如果仍想创建 filestore OSD,请 直接使用 ceph-volume

ceph-volume lvm create --filestore --data /dev/sd[X] --journal /dev/sd[Y]

销毁 OSD

如果遇到 OSD 或其磁盘问题,请先尝试 排查,以决定是否 需要 替换

要销毁 OSD,请导航到 <Node> → Ceph → OSD 面板,或在该 OSD 所在节点上使用 下述 CLI 命令。

  1. 确保集群有足够空间处理 OSD 移除。 在 Ceph → OSD 面板中,如果待销毁 OSD 仍为 upinAVAIL 为非零值), 请确保所有 OSD 的 Used (%) 值都明显低于默认 85%nearfull_ratio

    这样可以降低即将发生的重新平衡带来的风险;重新平衡可能导致 OSD 写满,从而阻塞 Ceph pool 上的 I/O。

    使用以下命令可在 CLI 上获取相同信息:

    ceph osd df tree
  2. 如果待销毁 OSD 尚未 out,请选择该 OSD 并点击 Out。这会将它从数据分布中 排除,并启动重新平衡。

    以下命令执行相同操作:

    ceph osd out <id>
  3. 如果可以,请等待 Ceph 完成重新平衡,以确保始终有足够副本。该 OSD 会变为空; 一旦变空,将显示 0 PGs

  4. 点击 Stop。如果此时停止尚不安全,会出现警告,此时应点击 Cancel。稍等 片刻后再试。

    可以使用以下命令检查是否可以安全停止,并停止该 OSD:

    ceph osd ok-to-stop <id>
    pveceph stop --service osd.<id>
  5. 最后:

    要从 Ceph 移除 OSD 并删除所有磁盘数据,首先点击 More → Destroy。启用 cleanup 选项以清理分区表和其他结构。这样即可在 Proxmox VE 中立即复用该磁盘。然后点击 Remove

    销毁 OSD 的 CLI 命令为:

    pveceph osd destroy <id> [--cleanup]

Ceph Pools

screenshot/gui-ceph-pools.png

pool 是用于存储对象的逻辑组。它包含一组对象集合,称为 Placement Groups (PGpg_num)。

创建和编辑 Pool

可以通过命令行创建和编辑 pool,也可以在任意 Proxmox VE 主机的 Web 界面中通过 Ceph → Pools 进行操作。

如果未给出选项,默认设置为 128 PGssize 为 3 个副本以及 min_size 为 2 个副本,以确保任意 OSD 发生故障时不会丢失数据。

Warning 不要将 min_size 设置为 1。min_size 为 1 的 replicated pool 会允许在 对象只有 1 个副本时执行 I/O,这可能导致数据丢失、PG 不完整或对象无法找到。

建议启用 PG-Autoscaler,或根据部署情况计算 PG 数量。可以在线找到公式和 PG 计算器
[PG calculator https://web.archive.org/web/20210301111112/http://ceph.com/pgcalc/]
。 从 Ceph Nautilus 开始,可以在部署后更改 PG 数量
[Placement Groups https://docs.ceph.com/en/quincy/rados/operations/placement-groups/]

PG autoscaler
[Automated Scaling https://docs.ceph.com/en/quincy/rados/operations/placement-groups/#automated-scaling]
可以在后台自动扩缩 pool 的 PG 数量。设置 Target SizeTarget Ratio 高级参数,有助于 PG-Autoscaler 做出更好的决策。

通过 CLI 创建 pool 的示例
pveceph pool create <pool-name> --add_storages
Tip 如果还希望自动为 pool 定义一个存储,请在 Web 界面中保持 ‘Add as Storage’ 复选框选中,或在创建 pool 时使用命令行选项 --add_storages

Pool 选项

screenshot/gui-ceph-pool-create.png

以下选项可在创建 pool 时使用,其中部分选项也可在编辑 pool 时使用。

Name

pool 名称。必须唯一,之后不能更改。

Size

每个对象的副本数。Ceph 始终会尝试为对象保留这么多副本。默认值:3

PG Autoscale Mode

该 pool 的自动 PG 扩缩模式
[autoscaler]
。如果设置为 warn,当 pool 的 PG 数量不是最优时会生成警告消息。默认值:warn

Add as Storage

使用新 pool 配置虚拟机或容器存储。默认值:true(仅在创建时 可见)。

高级选项
Min. Size

每个对象的最小副本数。如果某个 PG 的副本数低于该值,Ceph 会拒绝该 pool 上的 I/O。默认值:2

Crush Rule

用于在集群中映射对象放置位置的规则。这些规则定义数据在集群内的 放置方式。有关基于设备的规则信息,请参见 Ceph CRUSH & device classes

# of PGs

pool 初始应拥有的 placement group 数量
[placement_groups]
。 默认值:128

Target Ratio

pool 中预期数据量的比例。PG autoscaler 使用该比例相对于其他比例集 进行计算。如果同时设置了 target size,该选项优先。

Target Size

pool 中预期数据量的估计值。PG autoscaler 使用此大小估算最优 PG 数量。

Min. # of PGs

placement group 的最小数量。该设置用于微调该 pool 的 PG 数量下限。 PG autoscaler 不会将 PG 合并到低于此阈值。

有关 Ceph pool 处理的更多信息,请参见 Ceph pool operation 手册
[Ceph pool operation https://docs.ceph.com/en/quincy/rados/operations/pools/]

纠删码 Pool

Erasure coding(EC)是一种 ‘forward error correction’ 编码形式,允许从一定量的 数据丢失中恢复。与 replicated pools 相比,erasure coded pools 可以提供更多可用 空间,但代价是性能下降。

作为对比:在经典 replicated pools 中,会存储数据的多个副本(size);而在 erasure coded pool 中,数据会拆分为 k 个数据块,并附加 m 个编码(校验)块。 当数据块缺失时,这些编码块可用于重建数据。

编码块数量 m 定义了在不丢失任何数据的情况下可以丢失多少个 OSD。存储的对象总量 为 k + m

创建 EC Pool

可以使用 pveceph CLI 工具创建 erasure coded(EC)pool。规划 EC pool 时需要考虑 它与 replicated pools 的工作方式不同。

EC pool 的默认 min_size 取决于 m 参数。如果 m = 1,EC pool 的 min_size 将为 k。如果 m > 1min_size 将为 k + 1。Ceph 文档建议采用更保守的 min_size,即 k + 2
[Ceph Erasure Coded Pool Recovery https://docs.ceph.com/en/quincy/rados/operations/erasure-code/#erasure-coded-pool-recovery]
.

如果可用 OSD 数量少于 min_size,该 pool 的任何 IO 都会被阻塞,直到再次有足够 OSD 可用。

Note 规划 erasure coded pool 时,请关注 min_size,因为它定义了需要有多少 OSD 可用。否则,IO 会被阻塞。

例如,k = 2m = 1 的 EC pool 将具有 size = 3min_size = 2,并且在 一个 OSD 故障时仍可运行。如果 pool 配置为 k = 2m = 2,则它会具有 size = 4min_size = 3,并在丢失一个 OSD 时仍可运行。

要创建新的 EC pool,请运行以下命令:

pveceph pool create <pool-name> --erasure-coding k=2,m=1

可选参数包括 failure-domaindevice-class。如果需要更改该 pool 使用的任何 EC profile 设置,则必须使用新 profile 创建新的 pool。

这会创建一个新的 EC pool,并创建所需的 replicated pool 来存储 RBD omap 和其他 元数据。最终会得到 <pool name>-data<pool name>-metadata 两个 pool。默认 行为还会创建匹配的存储配置。如果不需要此行为,可以通过提供 --add_storages 0 参数禁用。手动配置存储配置时,请记住需要设置 data-pool 参数。只有这样,EC pool 才会用于存储数据对象。例如:

Note 可选参数 --size--min_size--crush_rule 会用于 replicated metadata pool,但不会用于 erasure coded data pool。如果需要更改 data pool 上的 min_size, 可以稍后执行。erasure coded pools 上不能更改 sizecrush_rule 参数。

如果需要进一步自定义 EC profile,可以直接使用 Ceph 工具创建
[Ceph Erasure Code Profile https://docs.ceph.com/en/quincy/rados/operations/erasure-code/#erasure-code-profiles]
, 并使用 profile 参数指定要使用的 profile。

例如:

pveceph pool create <pool-name> --erasure-coding profile=<profile-name>

将 EC Pool 添加为存储

可以将现有 EC pool 作为存储添加到 Proxmox VE。其工作方式与添加 RBD pool 相同,但 需要额外的 data-pool 选项。

pvesm add rbd <storage-name> --pool <replicated-pool> --data-pool <ec-pool>
Tip 对于任何不由本地 Proxmox VE 集群管理的外部 Ceph 集群,不要忘记添加 keyringmonhost 选项。

销毁 Pool

要通过 GUI 销毁 pool,请在树视图中选择一个节点,并进入 Ceph → Pools 面板。 选择要销毁的 pool 并点击 Destroy 按钮。要确认销毁 pool,需要输入 pool 名称。

运行以下命令可销毁 pool。指定 -remove_storages 还会移除关联存储。

pveceph pool destroy <name>
Note Pool 删除会在后台运行,可能需要一些时间。在此过程中,你会看到集群中的数据 使用量逐步下降。

PG Autoscaler

PG autoscaler 允许集群考虑每个 pool 中存储的(预期)数据量,并自动选择合适的 pg_num 值。它自 Ceph Nautilus 起可用。

在调整生效之前,可能需要先激活 PG autoscaler 模块。

ceph mgr module enable pg_autoscaler

autoscaler 按 pool 配置,并具有以下模式:

warn

如果建议的 pg_num 值与当前值差异过大,则发出健康警告。

on

自动调整 pg_num,无需任何人工交互。

off

不自动调整 pg_num,即使 PG 数量不是最优,也不会发出警告。

可以使用 target_sizetarget_size_ratiopg_num_min 选项调整扩缩因子,以便 适应未来的数据存储。

Warning 默认情况下,如果 pool 的 PG 数量偏差达到 3 倍,autoscaler 就会考虑调整 该 pool 的 PG 数量。这会导致数据放置发生明显变化,并可能给集群带来高负载。

可以在 Ceph Blog 中找到对 PG autoscaler 更深入的介绍: New in Nautilus: PG merging and autotuning.

Ceph CRUSH 与设备类别

screenshot/gui-ceph-config.png

CRUSH
[https://ceph.com/assets/pdfs/weil-crush-sc06.pdf]
Controlled Replication Under Scalable Hashing)算法是 Ceph 的基础。

CRUSH 计算数据应存储在哪里以及从哪里检索。其优势在于不需要中心化索引服务。 CRUSH 使用由 OSD、bucket(设备位置)和 pool 的 ruleset(数据复制)组成的映射来 工作。

Note 更多信息可在 Ceph 文档的 CRUSH map 章节中找到
[CRUSH map https://docs.ceph.com/en/quincy/rados/operations/crush-map/]

可以修改此映射以反映不同的复制层级。对象副本可以被分离(例如按 failure domain), 同时保持期望的分布。

一种常见配置是为不同 Ceph pool 使用不同类别的磁盘。因此,Ceph 从 luminous 开始 引入 device classes,以满足轻松生成 ruleset 的需求。

可以在 ceph osd tree 输出中看到设备类别。这些类别表示各自的 root bucket,可 通过以下命令查看:

ceph osd crush tree --show-shadow

上述命令的示例输出:

ID  CLASS WEIGHT  TYPE NAME
-16  nvme 2.18307 root default~nvme
-13  nvme 0.72769     host sumi1~nvme
 12  nvme 0.72769         osd.12
-14  nvme 0.72769     host sumi2~nvme
 13  nvme 0.72769         osd.13
-15  nvme 0.72769     host sumi3~nvme
 14  nvme 0.72769         osd.14
 -1       7.70544 root default
 -3       2.56848     host sumi1
 12  nvme 0.72769         osd.12
 -5       2.56848     host sumi2
 13  nvme 0.72769         osd.13
 -7       2.56848     host sumi3
 14  nvme 0.72769         osd.14

要指示 pool 仅在特定设备类别上分布对象,首先需要为该设备类别创建 ruleset:

ceph osd crush rule create-replicated <rule-name> <root> <failure-domain> <class>

<rule-name>

规则名称,用于关联 pool(可在 GUI 和 CLI 中看到)

<root>

它应属于哪个 crush root(默认 Ceph root 为 "default")

<failure-domain>

对象应在哪个 failure-domain 上分布(通常为 host)

<class>

要使用的 OSD 后端存储类型(例如 nvme、ssd、hdd)

规则进入 CRUSH map 后,即可让 pool 使用该 ruleset。

ceph osd pool set <pool-name> crush_rule <rule-name>
Tip 如果 pool 中已经包含对象,则必须相应移动这些对象。根据部署情况,这可能会对 集群产生较大性能影响。作为替代方案,可以创建新 pool 并单独移动磁盘。

Ceph Client

screenshot/gui-ceph-log.png

按照前面章节完成设置后,可以配置 Proxmox VE 使用这些 pool 存储虚拟机和容器镜像。只需 使用 GUI 添加新的 RBD 存储(参见 Ceph RADOS Block Devices (RBD) 章节)。

对于外部 Ceph 集群,还需要将 keyring 复制到预定义位置。如果 Ceph 安装在 Proxmox 节点本身,则会自动完成此操作。

Note 文件名需要是 <storage_id> + `.keyring,其中 <storage_id>/etc/pve/storage.cfgrbd: 后面的表达式。在以下示例中,my-ceph-storage 就是 <storage_id>
mkdir /etc/pve/priv/ceph
cp /etc/ceph/ceph.client.admin.keyring /etc/pve/priv/ceph/my-ceph-storage.keyring

CephFS

Ceph 还提供文件系统,它运行在与 RADOS block devices 相同的对象存储之上。Ceph 使用 Metadata Server(MDS)将 RADOS 后端对象映射为文件和目录,使 Ceph 能够提供兼容 POSIX 的复制文件系统。这使你可以轻松配置集群化、高可用的共享文件 系统。Ceph 的 Metadata Servers 保证文件在整个 Ceph 集群中均匀分布。因此,即使 在高负载场景下,也不会压垮单个主机;而这可能是传统共享文件系统方案(例如 NFS)中的问题。

screenshot/gui-node-ceph-cephfs-panel.png

Proxmox VE 既支持创建超融合 CephFS,也支持使用现有 CephFS as storage 保存备份、ISO 文件和容器模板。

Metadata Server(MDS)

CephFS 至少需要配置并运行一个 Metadata Server 才能工作。可以通过 Proxmox VE Web GUI 的 Node -> CephFS 面板创建 MDS,也可以使用命令行:

pveceph mds create

一个集群中可以创建多个 metadata server,但在默认设置下,任意时刻只有一个可以处于 active 状态。如果某个 MDS 或其节点无响应(或崩溃),另一个 standby MDS 会被 提升为 active。可以在创建时使用 hotstandby 参数选项,加快 active 与 standby MDS 之间的切换;如果已经创建,也可以设置/添加:

mds standby replay = true

/etc/pve/ceph.conf 中相应的 MDS 段。启用后,指定 MDS 会保持在 warm 状态, 并轮询 active MDS,从而在出现问题时更快接管。

Note 这种主动轮询会对系统和 active MDS 带来额外性能影响。
多个 Active MDS

自 Luminous(12.2.x)起,可以同时运行多个 active metadata server,但通常只有在有 大量客户端并行运行时才有用。否则,MDS 很少是系统瓶颈。如果要设置此模式,请 参阅 Ceph 文档。
[Configuring multiple active MDS daemons https://docs.ceph.com/en/quincy/cephfs/multimds/]

创建 CephFS

借助 Proxmox VE 对 CephFS 的集成,可以使用 Web 界面、CLI 或外部 API 接口轻松创建 CephFS。要使其正常工作,需要满足一些前提条件:

成功设置 CephFS 的前提条件:

完成后,可以通过 Web GUI 的 Node -> CephFS 面板,或使用命令行工具 pveceph 创建 CephFS,例如:

pveceph fs create --pg_num 128 --add-storage

这会创建名为 cephfs 的 CephFS,使用名为 cephfs_data 的数据 pool,其中包含 128 个 placement groups;并使用名为 cephfs_metadata 的元数据 pool,其中的 placement groups 数量为数据 pool 的四分之一(32)。请查看 Proxmox VE managed Ceph pool chapter 或访问 Ceph 文档,了解适合 你部署的 placement group 数量(pg_num
[placement_groups]
。此外, --add-storage 参数会在 CephFS 成功创建后,将其添加到 Proxmox VE 存储配置中。

销毁 CephFS

Warning 销毁 CephFS 会使其中所有数据不可用。此操作无法撤销!

要完整且平稳地移除 CephFS,需要执行以下步骤:

  • 断开每个非 Proxmox VE 客户端(例如在客户机中卸载 CephFS)。

  • 禁用所有相关的 CephFS Proxmox VE 存储条目(以防止其被自动挂载)。

  • 从客户机中移除位于要销毁 CephFS 上的所有已使用资源(例如 ISO)。

  • 使用以下命令在所有集群节点上手动卸载 CephFS 存储

    umount /mnt/pve/<STORAGE-NAME>

    其中 <STORAGE-NAME> 是 Proxmox VE 中 CephFS 存储的名称。

  • 现在确保没有 metadata server(MDS)正在为该 CephFS 运行,可通过停止或销毁它们 来实现。这可以通过 Web 界面完成,也可以通过命令行接口完成;对于后者,可执行 以下命令:

    pveceph stop --service mds.NAME

    以停止它们,或

    pveceph mds destroy NAME

    以销毁它们。

    请注意,当 active MDS 被停止或移除时,standby server 会自动提升为 active, 因此最好先停止所有 standby server。

  • 现在可以使用以下命令销毁 CephFS

    pveceph fs destroy NAME --remove-storages --remove-pools

    这会自动销毁底层 Ceph pool,并从 pve 配置中移除存储。

完成这些步骤后,CephFS 应已被完全移除;如果还有其他 CephFS 实例,可以再次启动 已停止的 metadata server,让它们作为 standby 运行。

Ceph 维护

替换 OSD

通过以下步骤可以替换 OSD 的磁盘,这是 Ceph 中最常见的维护任务之一。如果某个 OSD 出现问题,但其磁盘看起来仍然健康,请先阅读 故障排查 章节。

  1. 如果磁盘发生故障,请获取同类型、同容量的 推荐替换磁盘。

  2. 销毁有问题的 OSD。

  3. 从服务器上拆下旧磁盘并接入新磁盘。

  4. 再次 创建 OSD。

  5. 自动重新平衡后,集群状态应切回 HEALTH_OK。对于仍列出的任何 crash,可以运行 以下命令确认:

ceph crash archive-all

Trim/Discard

在虚拟机和容器中定期运行 fstrim(discard)是一项良好实践。这会释放文件系统 不再使用的数据块,从而减少数据使用量和资源负载。大多数现代操作系统都会定期向 磁盘发出这类 discard 命令。只需要确保虚拟机启用了 disk discard option

Scrub & Deep Scrub

Ceph 通过对 placement group 进行 scrubbing 来确保数据完整性。Ceph 会检查 PG 中 每个对象的健康状态。Scrubbing 有两种形式:每日执行的低开销元数据检查,以及每周 执行的深度数据检查。每周 deep scrub 会读取对象并使用校验和确保数据完整性。如果 正在运行的 scrub 干扰业务(性能)需求,可以调整 scrub
[Ceph scrubbing https://docs.ceph.com/en/quincy/rados/configuration/osd-config-ref/#scrubbing]
执行时间。

关闭 Proxmox VE + Ceph HCI 集群

要关闭整个 Proxmox VE + Ceph 集群,首先停止所有 Ceph 客户端。这些主要是虚拟机和容器。 如果还有可能访问 Ceph FS 或已安装 RADOS GW 的其他客户端,也应将其停止。通过 Proxmox VE 工具关机时,高可用客户机会将其状态切换为 stopped

一旦所有客户端、虚拟机和容器都已关闭,或不再访问 Ceph 集群,请确认 Ceph 集群 处于健康状态。可通过 Web UI 或 CLI 执行:

ceph -s

要禁用所有自愈操作,并暂停 Ceph 集群中的任何客户端 IO,请在 Ceph → OSD 面板 中或通过 CLI 启用以下 OSD 标志:

ceph osd set noout
ceph osd set norecover
ceph osd set norebalance
ceph osd set nobackfill
ceph osd set nodown
ceph osd set pause

开始关闭没有 monitor(MON)的节点。这些节点关闭后,再继续关闭运行 monitor 的 节点。

启动集群时,先启动带有 monitor(MON)的节点。所有节点启动并运行后,在取消设置 OSD 标志之前,确认所有 Ceph 服务都已启动并运行:

ceph osd unset pause
ceph osd unset nodown
ceph osd unset nobackfill
ceph osd unset norebalance
ceph osd unset norecover
ceph osd unset noout

现在可以启动客户机。高可用客户机开机后会将其状态更改为 started

Ceph 监控与故障排查

从一开始就持续监控 Ceph 部署的健康状态非常重要,可以使用 Ceph 工具,也可以通过 Proxmox VE API 访问状态。

以下 Ceph 命令可用于查看集群是否健康(HEALTH_OK)、是否存在警告 (HEALTH_WARN),甚至是否存在错误(HEALTH_ERR)。如果集群处于不健康状态, 下面的状态命令还会概览当前事件和应采取的操作。要停止执行,请按 CTRL-C。

持续观察集群状态:

watch ceph --status

打印一次集群状态(不会持续更新),并持续追加状态事件行:

ceph --watch

故障排查

本节包含常用故障排查信息。更多信息可在 Ceph 官方网站的故障排查部分找到
[Ceph troubleshooting https://docs.ceph.com/en/quincy/rados/troubleshooting/]
.

受影响节点上的相关日志
  • 磁盘健康监控

  • System → System Log,或通过 CLI 查看,例如最近 2 天:

    journalctl --since "2 days ago"
  • IPMI 和 RAID 控制器日志

可以运行以下命令列出并详细查看 Ceph 服务 crash:

ceph crash ls
ceph crash info <crash_id>

可运行以下命令确认标记为 new 的 crash:

ceph crash archive-all

要获得更详细视图,每个 Ceph 服务在 /var/log/ceph/ 下都有日志文件。如果需要更多 细节,可以调整日志级别
[Ceph log and debugging https://docs.ceph.com/en/quincy/rados/troubleshooting/log-and-debug/]

Ceph 问题的常见原因
常见 Ceph 问题
OSDs down/crashed

故障 OSD 会被报告为 down,并且通常会在 10 分钟后(自动)变为 out。根据原因, 它也可能自动再次变为 upin。要尝试通过 Web 界面手动激活,请进入 Any node → Ceph → OSD,选择该 OSD,并点击 StartInReload。 使用 shell 时,请在受影响节点上运行以下命令:

ceph-volume lvm activate --all

要激活失败的 OSD,可能需要 安全重启相应节点; 或者作为最后手段,重新创建或替换该 OSD。

版权和免责声明

Copyright © 2022-2025 成都市梨儿方信息技术有限责任公司.

本程序是自由软件:你可以依据自由软件基金会发布的 GNU Affero General Public License 条款重新分发和/或修改本程序;可使用该许可证第 3 版,或(由你选择)任何后续版本。

发布本程序是希望它能够有用,但不提供任何担保;甚至不包含对适销性或特定用途适用性的默示担保。更多详情请参见 GNU Affero General Public License。

你应当已经随本程序收到一份 GNU Affero General Public License 的副本。如果没有,请访问: https://www.gnu.org/licenses/

Copyright © 2007-2022 Proxmox Server Solutions GmbH

本程序是自由软件:你可以依据自由软件基金会发布的 GNU Affero General Public License 条款重新分发和/或修改本程序;可使用该许可证第 3 版,或(由你选择)任何后续版本。

发布本程序是希望它能够有用,但不提供任何担保;甚至不包含对适销性或特定用途适用性的默示担保。更多详情请参见 GNU Affero General Public License。

你应当已经随本程序收到一份 GNU Affero General Public License 的副本。如果没有,请访问: https://www.gnu.org/licenses/