增加/删除 OSD

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

增加 OSD

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

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

Warning

不要等空间满了再增加 OSD ,空间使用率达到 nearfull 比率后, 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 的分级结构最好按类型、容量定义。

  • 创建 OSD 。如果未指定 UUID , OSD 启动时会自动生成一个。下列命令会输出 OSD 号,后续步骤你会用到。
  1. ceph osd create [{uuid} [{id}]]

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

Warning

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

  • 在新 OSD 主机上创建默认目录。
  1. ssh {new-osd-host}
  2. sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}
  • 如果准备用于 OSD 的是单独的而非系统盘,先把它挂载到刚创建的目录下:
  1. ssh {new-osd-host}
  2. sudo mkfs -t {fstype} /dev/{drive}
  3. sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number}
  • 初始化 OSD 数据目录。
  1. ssh {new-osd-host}
  2. ceph-osd -i {osd-num} --mkfs --mkkey

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

  • 注册 OSD 认证密钥, ceph-{osd-num} 路径里的 ceph 值应该是 $cluster-$id ,如果你的集群名字不是 ceph ,那就用改过的名字。
  1. ceph auth add osd.{osd-num} osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring
  • 把 OSD 加入 CRUSH 图,这样它才开始收数据。用 cephosdcrushadd 命令把 OSD 加入 CRUSH 分级结构的合适位置。如果你指定了不止一个桶,此命令会把它加入你所指定的桶中最具体的一个,并且把此桶挪到你指定的其它桶之内。重要:如果你只指定了 root 桶,此命令会把 OSD 直接挂到 root 下面,但是 CRUSH 规则期望它位于主机内。

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

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

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

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

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

启动 OSD

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

在 Debian/Ubuntu 上用 Upstart。

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

在 CentOS/RHEL 上用 sysvinit 。

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

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

观察数据迁移

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

  1. ceph -w

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

删除 OSD (手动)

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

Warning

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

把 OSD 踢出集群

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

  1. ceph osd out {osd-num}

观察数据迁移

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

  1. ceph -w

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

Note

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

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

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

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

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

停止 OSD

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

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

停止 OSD 后,状态变为 down

删除 OSD

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

  • 删除 CRUSH 图的对应 OSD 条目,它就不再接收数据了。你也可以反编译 CRUSH 图、删除 device 列表条目、删除对应的 host 桶条目或删除 host 桶(如果它在 CRUSH 图里,而且你想删除主机),重编译 CRUSH 图并应用它。详情参见删除 OSD
  1. ceph osd crush remove {name}
  • 删除 OSD 认证密钥:
  1. ceph auth del osd.{osd-num}

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

  • 删除 OSD 。
  1. ceph osd rm {osd-num}
  2. #for example
  3. ceph osd rm 1
  • 登录到保存 ceph.conf 主拷贝的主机。
  1. ssh {admin-host}
  2. cd /etc/ceph
  3. vim ceph.conf
  • 从 ceph.conf 配置文件里删除对应条目。
  1. [osd.1]
  2. host = {hostname}
  • 从保存 ceph.conf 主拷贝的主机,把更新过的 ceph.conf 拷贝到集群其他主机的 /etc/ceph 目录下。