增加/删除 OSD

如果您的集群已经在运行,你可以在运行时添加或删除 OSD 。

增加 OSD

你迟早要扩容集群, Ceph 允许在运行时增加 OSD 。在 Ceph 里,一个 OSD 一般是一个 ceph-osd 守护进程,它运行在硬盘之上,如果你有多个硬盘,可以给每个硬盘启动一个 ceph-osd 守护进程。

通常,你应该监控集群容量,看是否达到了容量上限,因为达到了它的 near full 比率后,要增加一或多个 OSD 来扩容。

Warning

不要等空间满了再增加 OSD ,空间使用率达到 near full 比率后, OSD 失败可能导致集群空间占满。

部署硬件

如果你通过增加主机来增加 OSD ,关于 OSD 服务器硬件的配置请参见硬件推荐。要把一台 OSD 主机加入到集群,首先要安装最新版的 Linux ,而且存储硬盘要做好必要的准备,详情参见文件系统推荐

把 OSD 主机添加到集群机架上,连接好网络、确保网络通畅。详情见网络配置参考

安装必要软件

在手动部署的集群里,你必须手动安装 Ceph 软件包,详情见安装 Ceph (手动)。你应该配置一个无密码登录 SSH 的用户,且他有 root 权限。

增加 OSD (手动)

此过程要设置一个 ceph-osd 守护进程,让它使用一个硬盘,且让集群把数据发布到 OSD 。如果一台主机有多个硬盘,可以重复此过程,把每个硬盘配置为一个 OSD 。

要添加 OSD ,要依次创建数据目录、把硬盘挂载到目录、把 OSD 加入集群、然后把它加入 CRUSH 图。

往 CRUSH 图里添加 OSD 时建议设置权重,硬盘容量每年增长 40% ,所以较新的 OSD 主机拥有更大的空间(即它们可以有更大的权重)。

Tip

Ceph 喜欢统一的硬件,与存储池无关。如果你要新增容量不一的驱动器,还需调整它们的权重。但是,为实现最佳性能,CRUSH 的分级结构最好按类型、容量定义。

  1. 创建 OSD 。如果未指定 UUID , OSD 启动时会自动生成一个。下列命令会输出 OSD 号,后续步骤你会用到。

    ceph osd create [{uuid} [{id}]]

    如果指定了可选参数 {id} ,那么它将作为 OSD id 。要注意,如果此数字已使用,此命令会出错。

    Warning

    一般来说,我们不建议指定 {id} 。因为 ID 是按照数组分配的,跳过一些依然会浪费内存;尤其是跳过太多、或者集群很大时,会更明显。若未指定 {id} ,将用最小可用数字。

  2. 在新 OSD 主机上创建默认目录。

    ssh {new-osd-host}
    sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}
  3. 如果准备用于 OSD 的是单独的而非系统盘,先把它挂载到刚创建的目录下:

    ssh {new-osd-host}
    sudo mkfs -t {fstype} /dev/{drive}
    sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number}
  4. 初始化 OSD 数据目录。

    ssh {new-osd-host}
    ceph-osd -i {osd-num} --mkfs --mkkey

    运行 ceph-osd 时目录必须是空的。

  5. 注册 OSD 认证密钥, ceph-{osd-num} 路径里的 ceph 值应该是 $cluster-$id ,如果你的集群名字不是 ceph ,那就用改过的名字。

    ceph auth add osd.{osd-num} osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring
  6. 把 OSD 加入 CRUSH 图,这样它才开始收数据。用 ceph osd crush add 命令把 OSD 加入 CRUSH 分级结构的合适位置。如果你指定了不止一个桶,此命令会把它加入你所指定的桶中最具体的一个,并且把此桶挪到你指定的其它桶之内。重要:如果你只指定了 root 桶,此命令会把 OSD 直接挂到 root 下面,但是 CRUSH 规则期望它位于主机内。

    若用的是 v0.48 版,执行下列命令:

    ceph osd crush add {id} {name} {weight}  [{bucket-type}={bucket-name} ...]

    若用的是 v0.56 及更高版,执行下列命令:

    ceph osd crush add {id-or-name} {weight}  [{bucket-type}={bucket-name} ...]

    你也可以反编译 CRUSH 图、把 OSD 加入设备列表、以桶的形式加入主机(如果它没在 CRUSH 图里)、以条目形式把设备加入主机、分配权重、重编译并应用它。详情参见增加/移动 OSD

Argonaut 0.48 版最佳实践

为降低对用户 I/O 性能的影响,加入 CRUSH 图时应该把 OSD 的初始权重设为 0 ,然后每次增大一点、逐步增大 CRUSH 权重。例如每次增加 0.2

ceph osd crush reweight {osd-id} .2

迁移完成前,可以依次把权重重置为 0.40.6 等等,直到达到期望权重。

为降低 OSD 失败的影响,你可以设置:

mon osd down out interval = 0

它防止挂了的 OSD 自动被标记为 out ,然后逐步降低其权重:

ceph osd reweight {osd-num} .8

还是等着集群完成数据迁移,然后再次调整权重,直到权重为 0 。注意,这会阻止集群在发生故障时自动重复制数据,所以要确保监控的及时性,以便管理员迅速介入。

注意,以上经验在 Bobtail 及后续版本已不再必要。

启动 OSD

把 OSD 加入 Ceph 后, OSD 就在配置里了。然而它还没运行,它现在的状态为 downout 。你必须先启动 OSD 它才能收数据。可以用管理主机上的 service ceph 、或从 OSD 所在主机启动。

在 Debian/Ubuntu 上用 Upstart。

sudo start ceph-osd id={osd-num}

在 CentOS/RHEL 上用 sysvinit 。

sudo /etc/init.d/ceph start osd.{osd-num}

一旦你启动了 OSD ,其状态就变成了 upin

观察数据迁移

把新 OSD 加入 CRUSH 图后, Ceph 会重新均衡服务器,一些归置组会迁移到新 OSD 里,你可以用 ceph 命令观察此过程。

ceph -w

你会看到归置组状态从 active+clean 变为 active, some degraded objects (有降级的对象)、且迁移完成后回到 active+clean 状态。( Ctrl-c 退出)

删除 OSD (手动)

要想缩减集群尺寸或替换硬件,可在运行时删除 OSD 。在 Ceph 里,一个 OSD 通常是一台主机上的一个 ceph-osd 守护进程、它运行在一个硬盘之上。如果一台主机上有多个数据盘,你得挨个删除其对应 ceph-osd 。通常,操作前应该检查集群容量,看是否快达到上限了,确保删除 OSD 后不会使集群达到 near full 比率。

Warning

删除 OSD 时不要让集群达到 full ratio 值,删除 OSD 可能导致集群达到或超过 full ratio 值。

把 OSD 踢出集群

删除 OSD 前,它通常是 upin 的,要先把它踢出集群,以使 Ceph 启动重新均衡、把数据拷贝到其他 OSD 。

ceph osd out {osd-num}

观察数据迁移

一旦把 OSD 踢出( out )集群, Ceph 就会开始重新均衡集群、把归置组迁出将删除的 OSD 。你可以用 ceph 工具观察此过程。

ceph -w

你会看到归置组状态从 active+clean 变为 active, some degraded objects 、迁移完成后最终回到 active+clean 状态。( Ctrl-c 中止)

Note

有时候,(通常是只有几台主机的“小”集群,比如小型测试集群)拿出( out )某个 OSD 可能会使 CRUSH 进入临界状态,这时某些 PG 一直卡在 active+remapped 状态。如果遇到了这种情况,你应该把此 OSD 标记为 in ,用这个命令:

``ceph osd in {osd-num}``

等回到最初的状态后,把它的权重设置为 0 ,而不是标记为 out ,用此命令:

``ceph osd crush reweight osd.{osd-num} 0``

执行后,你可以观察数据迁移过程,应该可以正常结束。把某一 OSD 标记为 out 和权重改为 0 的区别在于,前者,包含此 OSD 的桶、其权重没变;而后一种情况下,桶的权重变了(降低了此 OSD 的权重)。某些情况下, reweight 命令更适合“小”集群。

停止 OSD

把 OSD 踢出集群后,它可能仍在运行,就是说其状态为 upout 。删除前要先停止 OSD 进程。

ssh {osd-host}
sudo /etc/init.d/ceph stop osd.{osd-num}

停止 OSD 后,状态变为 down

删除 OSD

此步骤依次把一个 OSD 移出集群 CRUSH 图、删除认证密钥、删除 OSD 图条目、删除 ceph.conf 条目。如果主机有多个硬盘,每个硬盘对应的 OSD 都得重复此步骤。

  1. 删除 CRUSH 图的对应 OSD 条目,它就不再接收数据了。你也可以反编译 CRUSH 图、删除 device 列表条目、删除对应的 host 桶条目或删除 host 桶(如果它在 CRUSH 图里,而且你想删除主机),重编译 CRUSH 图并应用它。详情参见删除 OSD

    ceph osd crush remove {name}
  2. 删除 OSD 认证密钥:

    ceph auth del osd.{osd-num}

    ceph-{osd-num} 路径里的 ceph 值是 $cluster-$id ,如果集群名字不是 ceph ,这里要更改。

  3. 删除 OSD 。

    ceph osd rm {osd-num}
    #for example
    ceph osd rm 1
  4. 登录到保存 ceph.conf 主拷贝的主机。

    ssh {admin-host}
    cd /etc/ceph
    vim ceph.conf
  5. ceph.conf 配置文件里删除对应条目。

    [osd.1]
            host = {hostname}
  6. 从保存 ceph.conf 主拷贝的主机,把更新过的 ceph.conf 拷贝到集群其他主机的 /etc/ceph 目录下。