注意
本文档适用于 Ceph 的开发版本。
添加/删除 OSD
当集群启动并运行时,可以添加或删除 OSD。
添加 OSD
可以将 OSD 添加到集群以扩展集群的容量和弹性。通常,一个 OSD 是一个 Ceph ceph-osd 守护程序,运行在一台主机机器的一个存储驱动器上。但是如果您的主机机器有多个存储驱动器,您可以为机器上的每个驱动器映射一个 ceph-osd 守护程序。
检查集群的容量是一个好主意,这样您就知道它何时接近其容量限制。如果您的集群已达到其 near full 比例,那么您应该添加 OSD 来扩展集群的容量。
警告
在添加 OSD 之前,不要让集群达到其 full ratio。在集群达到其 near full ratio 之后发生的 OSD 故障可能会导致集群超过其 full ratio。
部署硬件
如果您在添加新的 OSD 时也添加新的主机,请参阅 硬件建议 以获取 OSD 硬件最低建议的详细信息。要将 OSD 主机添加到集群,首先要确保已在主机机器上安装了适当版本的 Linux,并且已对存储驱动器进行了所有初始准备工作。
接下来,将 OSD 主机添加到集群中的机架,将主机连接到网络,并确保主机具有网络连接。有关详细信息,请参阅 网络配置参考。
安装所需软件
如果您的集群是手动部署的,您将需要手动安装 Ceph 软件包。有关详细信息,请参阅 安装 Ceph(手动)。为适当的用户配置 SSH,使其具有无密码身份验证和 root 权限。
添加 OSD(手动)
以下过程设置一个 ceph-osd 守护程序,配置此 OSD 以使用一个驱动器,并配置集群以将数据分发到该 OSD。如果您的主机机器有多个驱动器,您可以通过重复此过程为主机上的每个驱动器添加一个 OSD。
如以下过程所示,添加 OSD 涉及为其创建元数据目录、配置数据存储驱动器、将 OSD 添加到集群,然后将其添加到 CRUSH 映射中。
当您将 OSD 添加到 CRUSH 映射时,您需要考虑分配给新 OSD 的权重。由于存储驱动器容量会随着时间的推移而增加,较新的 OSD 主机可能比集群中较旧的主机具有更大的硬盘驱动器,因此可能具有更大的权重。
提示
Ceph 在池中使用统一硬件时效果最佳。可以添加不同大小的驱动器,然后相应地调整它们的权重。然而,为了获得最佳性能,请考虑一个具有相同类型和大小驱动器的 CRUSH 层次结构。最好将较大的驱动器统一添加到现有主机。这可以逐步完成,每次添加新驱动器时替换较小的驱动器。
运行以下形式的命令来创建新的 OSD。如果您选择不在该命令中指定 UUID,则 UUID 将在 OSD 启动时自动设置。OSD 编号(后续步骤需要)可在命令输出中找到
ceph osd create [{uuid} [{id}]]如果指定了可选参数 {id},它将用作 OSD ID。但是,如果 ID 号已被使用,命令将失败。
警告
不建议显式指定
{id}参数。ID 是作为数组分配的,任何跳过的条目都会消耗额外的内存。如果存在大的间隙或集群很大,这种内存消耗可能会变得很大。通过不指定{id}参数,我们确保 Ceph 使用可用的最小 ID 号,并避免这些问题。运行以下形式的命令来为新的 OSD 创建默认目录
ssh {new-osd-host} sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}
如果 OSD 将在非操作系统驱动器上创建,请准备好与 Ceph 一起使用。运行以下形式的命令
ssh {new-osd-host} sudo mkfs -t {fstype} /dev/{drive} sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number}
运行以下形式的命令来初始化 OSD 数据目录
ssh {new-osd-host} ceph-osd -i {osd-num} --mkfs --mkkey
在运行
ceph-osd之前,请确保目录为空。运行以下形式的命令来注册 OSD 身份验证密钥
ceph auth add osd.{osd-num} osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring此命令的呈现形式中包含
ceph-{osd-num},因为许多集群的名称为ceph。但是,如果您的集群名称不是ceph,则需要将ceph-{osd-num}中的字符串ceph替换为您的集群名称。例如,如果您的集群名称是cluster1,则命令中的路径应为/var/lib/ceph/osd/cluster1-{osd-num}/keyring。运行以下命令将 OSD 添加到 CRUSH 映射中。这允许 OSD 开始接收数据。
ceph osd crush add命令可以将 OSD 添加到 CRUSH 层次结构中的任何位置。如果您指定一个或多个存储桶,该命令会将 OSD 放置在最具体的存储桶中,并将其移动到您指定的任何其他存储桶下。重要提示:如果您只指定根存储桶,该命令会将 OSD 直接附加到根,但 CRUSH 规则要求 OSD 位于主机内部。如果 OSD 不在主机内部,OSD 可能不会接收到任何数据。ceph osd crush add {id-or-name} {weight} [{bucket-type}={bucket-name} ...]请注意,还有另一种将新 OSD 添加到 CRUSH 映射的方法:反编译 CRUSH 映射,将 OSD 添加到设备列表,将主机添加为存储桶(如果它尚未在 CRUSH 映射中),将设备添加为主机中的项目,为设备分配权重,重新编译 CRUSH 映射,然后设置 CRUSH 映射。有关详细信息,请参阅 添加/移动 OSD。在最近的版本中很少需要这样做(这句话是在 Reef 发布当月写的)。
替换 OSD
注意
如果本节中的过程对您不起作用,请尝试 cephadm 文档中的说明:替换 OSD。
有时需要替换 OSD:例如,当磁盘发生故障时,或者当管理员想要使用新的后端重新配置 OSD 时(可能是在从 Filestore 切换到 BlueStore 时)。替换 OSD 与 删除 OSD 的区别在于,替换的 OSD 的 ID 和 CRUSH 映射条目在销毁 OSD 以进行替换后必须保持完整。
确保销毁 OSD 是安全的
while ! ceph osd safe-to-destroy osd.{id} ; do sleep 10 ; done销毁 OSD
ceph osd destroy {id} --yes-i-really-mean-it可选:如果您计划使用的磁盘不是新磁盘且以前曾用于其他目的,请清除磁盘
ceph-volume lvm zap /dev/sdX使用在先前步骤中销毁的 OSD 的 ID 来准备替换磁盘
ceph-volume lvm prepare --osd-id {id} --data /dev/sdX最后,激活 OSD
ceph-volume lvm activate {id} {fsid}
或者,您可以通过运行以下形式的单个命令来重新创建 OSD,而不是执行最后两个步骤(准备磁盘和激活 OSD)
ceph-volume lvm create --osd-id {id} --data /dev/sdX
启动 OSD
将 OSD 添加到 Ceph 后,OSD 就在集群中。但是,在启动之前,OSD 被认为是 down 和 in。OSD 未运行,将无法接收数据。要启动 OSD,要么从管理员主机运行 service ceph,要么运行以下形式的命令从其主机机器启动 OSD
sudo systemctl start ceph-osd@{osd-num}
OSD 启动后,它被认为是 up 和 in。
观察数据迁移
将新的 OSD 添加到 CRUSH 映射后,Ceph 开始通过将放置组 (PG) 迁移到新的 OSD 来重新平衡集群。要使用 ceph 工具观察此过程,请运行以下命令
ceph -w
或者
watch ceph status
PG 状态将首先从 active+clean 更改为 active, some degraded objects,然后在迁移完成后返回到 active+clean。观察完成后,按 Ctrl-C 退出。
删除 OSD(手动)
可以在集群运行时手动删除 OSD:您可能希望这样做以减小集群大小或更换硬件。通常,一个 OSD 是一个 Ceph ceph-osd 守护程序,运行在一台主机机器的一个存储驱动器上。或者,如果您的主机机器有多个存储驱动器,您可能需要删除多个 ceph-osd 守护程序:机器上的每个驱动器对应一个守护程序。
警告
在开始删除 OSD 的过程之前,请确保您的集群不接近其 full ratio。否则,删除 OSD 的操作可能会导致集群达到或超过其 full ratio。
将 OSD 从集群中取出
OSD 在从集群中删除之前通常处于 up 和 in 状态。在 OSD 可以从集群中删除之前,必须将 OSD 从集群中取出 out,以便 Ceph 可以开始重新平衡并将其数据复制到其他 OSD。要将 OSD 从集群中取出 out,请运行以下形式的命令
ceph osd out {osd-num}
观察数据迁移
将 OSD 从集群中取出 out 后,Ceph 开始通过将放置组迁移出已删除的 OSD 来重新平衡集群。要使用 ceph 工具观察此过程,请运行以下命令
ceph -w
PG 状态将从 active+clean 更改为 active, some degraded objects,然后在迁移完成后返回到 active+clean。观察完成后,按 Ctrl-C 退出。
注意
在某些情况下,将 OSD 取出 out 的操作可能会导致 CRUSH 遇到一个边缘情况,其中一些 PG 保持卡在 active+remapped 状态。这个问题有时发生在主机数量很少的小型集群中(例如,在小型测试集群中)。要解决此问题,请运行以下形式的命令将 OSD 标记为 in
ceph osd in {osd-num}
OSD 返回到其初始状态后,不要再次将 OSD 标记为 out。相反,运行以下形式的命令将 OSD 的权重设置为 0
ceph osd crush reweight osd.{osd-num} 0
重新加权 OSD 后,观察数据迁移并确认其已成功完成。将 OSD 标记为 out 和将 OSD 重新加权为 0 之间的区别在于包含 OSD 的存储桶。当 OSD 被标记为 out 时,存储桶的权重不会改变。但是当 OSD 被重新加权为 0 时,存储桶的权重会更新(即,OSD 的权重从存储桶的总权重中减去)。在操作小型集群时,有时最好使用上述重新加权命令。
停止 OSD
将 OSD 从集群中取出 out 后,OSD 可能仍在运行。在这种情况下,OSD 处于 up 和 out 状态。在从集群中删除之前,必须通过运行以下形式的命令停止 OSD
ssh {osd-host} sudo systemctl stop ceph-osd@{osd-num}
OSD 停止后,它处于 down 状态。
删除 OSD
以下过程从集群映射中删除 OSD,删除 OSD 的身份验证密钥,从 OSD 映射中删除 OSD,并从 ceph.conf 文件中删除 OSD。如果您的主机有多个驱动器,可能需要通过重复此过程从每个驱动器中删除一个 OSD。
首先让集群忘记 OSD。此步骤从 CRUSH 映射中删除 OSD,删除 OSD 的身份验证密钥,并从 OSD 映射中删除 OSD。(purge 子命令 是在 Luminous 中引入的。对于旧版本,请参阅 此处链接的过程。)
ceph osd purge {id} --yes-i-really-mean-it导航到保留集群
ceph.conf文件主副本的主机ssh {admin-host} cd /etc/ceph vim ceph.conf
从
ceph.conf文件中删除 OSD 条目(如果存在此类条目)[osd.1] host = {hostname}
将更新后的
ceph.conf文件从保留集群ceph.conf文件主副本的主机位置复制到集群中其他主机的/etc/ceph目录。
如果您的 Ceph 集群早于 Luminous,您将无法使用 ceph osd purge 命令。相反,执行以下过程
从 CRUSH 映射中删除 OSD,使其不再接收数据(有关详细信息,请参阅 删除 OSD)
ceph osd crush remove {name}您可以选择两种替代方案,而不是从 CRUSH 映射中删除 OSD:(1) 反编译 CRUSH 映射,从设备列表中删除 OSD,并从主机存储桶中删除设备;(2) 从 CRUSH 映射中删除主机存储桶(前提是它在 CRUSH 映射中并且您打算删除主机),重新编译映射,然后设置它
删除 OSD 身份验证密钥
ceph auth del osd.{osd-num}删除 OSD
ceph osd rm {osd-num}例如
ceph osd rm 1