注意

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

手动部署

所有 Ceph 集群至少需要一个监视器(monitor),以及与集群中存储对象副本数一样多的 OSD。引导初始监视器是部署 Ceph 存储集群的第一步。监视器部署还会为整个集群设置重要标准,例如池的副本数、每个 OSD 的放置组数、心跳间隔、是否需要身份验证等。这些值中的大多数都有默认设置,因此在为生产环境设置集群时了解它们非常有用。

我们将设置一个集群,其中 mon-node1 作为监视器节点,osd-node1osd-node2 作为 OSD 节点。

监视器引导

引导监视器(理论上是 Ceph 存储集群)需要一些东西

  • 唯一标识符: fsid 是集群的唯一标识符,代表文件系统 ID(File System ID),起源于 Ceph 存储集群主要用于 Ceph 文件系统(Ceph File System)的时代。Ceph 现在也支持原生接口、块设备和对象存储网关接口,因此 fsid 有点用词不当。

  • 集群名称: Ceph 集群有一个集群名称,它是一个不含空格的简单字符串。默认集群名称是 ceph,但您可以指定不同的集群名称。当您使用多个集群并且需要清楚地了解您正在使用哪个集群时,覆盖默认集群名称特别有用。

    例如,当您在多站点配置中运行多个集群时,集群名称(例如,us-westus-east)用于标识当前 CLI 会话的集群。注意: 要在命令行界面上标识集群名称,请指定带有集群名称的 Ceph 配置文件(例如,ceph.confus-west.confus-east.conf 等)。另请参阅 CLI 用法(ceph --cluster {cluster-name})。

  • 监视器名称: 集群中的每个监视器实例都有一个唯一的名称。在实践中,Ceph 监视器名称就是主机名(我们建议每个主机上有一个 Ceph 监视器,并且不要将 Ceph OSD 守护程序与 Ceph 监视器混合)。您可以使用 hostname -s 检索短主机名。

  • 监视器映射: 引导初始监视器需要您生成一个监视器映射。监视器映射需要 fsid、集群名称(或使用默认名称),以及至少一个主机名及其 IP 地址。

  • 监视器密钥环:监视器之间通过一个密钥进行通信。您必须生成一个包含监视器密钥的密钥环,并在引导初始监视器时提供它。

  • 管理员密钥环:要使用 ceph CLI 工具,您必须拥有一个 client.admin 用户。因此,您必须生成管理员用户和密钥环,并且还必须将 client.admin 用户添加到监视器密钥环中。

上述要求并不意味着必须创建 Ceph 配置文件。然而,作为最佳实践,我们建议创建一个 Ceph 配置文件,并用 fsidmon initial membersmon host 设置填充它。

您也可以在运行时获取和设置所有监视器设置。但是,Ceph 配置文件可能只包含那些覆盖默认值的设置。当您向 Ceph 配置文件添加设置时,这些设置会覆盖默认设置。将这些设置保留在 Ceph 配置文件中可以使维护集群更容易。

步骤如下

  1. 登录到初始监视器节点

    ssh {hostname}
    

    例如

    ssh mon-node1
    
  2. 确保您有一个用于 Ceph 配置文件的目录。默认情况下,Ceph 使用 /etc/ceph。当您安装 ceph 时,安装程序会自动创建 /etc/ceph 目录。

    ls /etc/ceph
    
  3. 创建 Ceph 配置文件。默认情况下,Ceph 使用 ceph.conf,其中 ceph 反映集群名称。在配置文件中添加一行包含 “[global]” 的内容。

    sudo vim /etc/ceph/ceph.conf
    
  4. 为您的集群生成一个唯一 ID(即 fsid)。

    uuidgen
    
  5. 将唯一 ID 添加到您的 Ceph 配置文件中。

    fsid = {UUID}
    

    例如

    fsid = a7f64266-0894-4f1e-a635-d0aeaca0e993
    
  6. 将初始监视器添加到您的 Ceph 配置文件中。

    mon_initial_members = {hostname}[,{hostname}]
    

    例如

    mon_initial_members = mon-node1
    
  7. 将初始监视器的 IP 地址添加到您的 Ceph 配置文件中并保存文件。

    mon_host = {ip-address}[,{ip-address}]
    

    例如

    mon_host = 192.168.0.1
    

    注意: 您可以使用 IPv6 地址而不是 IPv4 地址,但必须将 ms_bind_ipv6 设置为 true。有关网络配置的详细信息,请参阅 网络配置参考

  8. 为您的集群创建一个密钥环并生成一个监视器密钥。

    sudo ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
    
  9. 生成一个管理员密钥环,生成一个 client.admin 用户并将该用户添加到密钥环中。

    sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
    
  10. 生成一个 bootstrap-osd 密钥环,生成一个 client.bootstrap-osd 用户并将该用户添加到密钥环中。

    sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
    
  11. 将生成的密钥添加到 ceph.mon.keyring 中。

    sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
    sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
    
  12. 更改 ceph.mon.keyring 的所有者。

    sudo chown ceph:ceph /tmp/ceph.mon.keyring
    
  13. 使用主机名、主机 IP 地址和 FSID 生成监视器映射。将其保存为 /tmp/monmap

    monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
    

    例如

    monmaptool --create --add mon-node1 192.168.0.1 --fsid a7f64266-0894-4f1e-a635-d0aeaca0e993 /tmp/monmap
    
  14. 在监视器主机上创建默认数据目录(或目录)。

    sudo mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
    

    例如

    sudo -u ceph mkdir /var/lib/ceph/mon/ceph-mon-node1
    

    有关详细信息,请参阅 监视器配置参考 - 数据

  15. 使用监视器映射和密钥环填充监视器守护程序。

    sudo -u ceph ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
    

    例如

    sudo -u ceph ceph-mon --mkfs -i mon-node1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
    
  16. 考虑 Ceph 配置文件的设置。常见的设置包括以下内容

    [global]
    fsid = {cluster-id}
    mon_initial_members = {hostname}[, {hostname}]
    mon_host = {ip-address}[, {ip-address}]
    public_network = {network}[, {network}]
    cluster_network = {network}[, {network}]
    auth_cluster required = cephx
    auth_service required = cephx
    auth_client required = cephx
    osd_pool_default_size = {n}  # Write an object n times.
    osd_pool_default_min_size = {n} # Allow writing n copies in a degraded state.
    osd_pool_default_pg_num = {n}
    osd_crush_chooseleaf_type = {n}
    

    在前面的示例中,配置文件的 [global] 部分可能如下所示

    [global]
    fsid = a7f64266-0894-4f1e-a635-d0aeaca0e993
    mon_initial_members = mon-node1
    mon_host = 192.168.0.1
    public_network = 192.168.0.0/24
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
    osd_pool_default_size = 3
    osd_pool_default_min_size = 2
    osd_pool_default_pg_num = 333
    osd_crush_chooseleaf_type = 1
    
  17. 启动监视器。

    使用 systemd 启动服务

    sudo systemctl start ceph-mon@mon-node1
    
  18. 确保为 ceph-mon 打开防火墙端口。

    使用 firewalld 打开端口

    sudo firewall-cmd --zone=public --add-service=ceph-mon
    sudo firewall-cmd --zone=public --add-service=ceph-mon --permanent
    
  19. 验证监视器是否正在运行。

    sudo ceph -s
    

    您应该会看到您启动的监视器正在运行的输出,并且您应该会看到一个健康错误,指示放置组处于非活动状态。它应该看起来像这样

    cluster:
      id:     a7f64266-0894-4f1e-a635-d0aeaca0e993
      health: HEALTH_OK
    
    services:
      mon: 1 daemons, quorum mon-node1
      mgr: mon-node1(active)
      osd: 0 osds: 0 up, 0 in
    
    data:
      pools:   0 pools, 0 pgs
      objects: 0 objects, 0 bytes
      usage:   0 kB used, 0 kB / 0 kB avail
      pgs:
    

    注意: 一旦您添加 OSD 并启动它们,放置组健康错误就会消失。有关详细信息,请参阅 添加 OSD

管理器守护程序配置

在运行 ceph-mon 守护程序的每个节点上,您还应该设置一个 ceph-mgr 守护程序。

请参阅 ceph-mgr 管理员指南

添加 OSD

一旦您的初始监视器运行起来,您就应该添加 OSD。在您拥有足够的 OSD 来处理对象副本数(例如,osd_pool_default_size = 2 至少需要两个 OSD)之前,您的集群无法达到 active + clean 状态。引导监视器后,您的集群具有默认的 CRUSH 映射;但是,CRUSH 映射中没有任何 Ceph OSD 守护程序映射到 Ceph 节点。

短格式

Ceph 提供了 ceph-volume 实用程序,它可以准备逻辑卷、磁盘或分区以用于 Ceph。ceph-volume 实用程序通过递增索引来创建 OSD ID。此外,ceph-volume 将新 OSD 添加到主机下的 CRUSH 映射中。执行 ceph-volume -h 以获取 CLI 详细信息。ceph-volume 实用程序会自动执行下面长格式中的步骤。要使用短格式过程创建前两个 OSD,请为每个 OSD 执行以下操作

  1. 创建 OSD。

    copy /var/lib/ceph/bootstrap-osd/ceph.keyring from monitor node (mon-node1) to /var/lib/ceph/bootstrap-osd/ceph.keyring on osd node (osd-node1)
    copy /etc/ceph/ceph.conf from monitor node (mon-node1) to /etc/ceph/ceph.conf on osd node (osd-node1)
    ssh {osd node}
    sudo ceph-volume lvm create --data {data-path}
    

    例如

    scp -3 root@mon-node1:/var/lib/ceph/bootstrap-osd/ceph.keyring root@osd-node1:/var/lib/ceph/bootstrap-osd/ceph.keyring
    
    ssh osd-node1
    sudo ceph-volume lvm create --data /dev/hdd1
    

或者,创建过程可以分为两个阶段(准备和激活)

  1. 准备 OSD。

    ssh {osd node}
    sudo ceph-volume lvm prepare --data {data-path} {data-path}
    

    例如

    ssh osd-node1
    sudo ceph-volume lvm prepare --data /dev/hdd1
    

    准备好后,激活需要已准备好的 OSD 的 IDFSID。可以通过列出当前服务器中的 OSD 来获取这些信息

    sudo ceph-volume lvm list
    
  2. 激活 OSD

    sudo ceph-volume lvm activate {ID} {FSID}
    

    例如

    sudo ceph-volume lvm activate 0 a7f64266-0894-4f1e-a635-d0aeaca0e993
    

长格式

在没有任何辅助实用程序的情况下,使用以下过程创建 OSD 并将其添加到集群和 CRUSH 映射中。要使用长格式过程创建前两个 OSD,请为每个 OSD 执行以下步骤。

注意

此过程不描述在 dm-crypt 之上使用 dm-crypt“lockbox”进行部署。

  1. 连接到 OSD 主机并成为 root 用户。

    ssh {node-name}
    sudo bash
    
  2. 为 OSD 生成一个 UUID。

    UUID=$(uuidgen)
    
  3. 为 OSD 生成一个 cephx 密钥。

    OSD_SECRET=$(ceph-authtool --gen-print-key)
    
  4. 创建 OSD。请注意,如果您需要重用以前销毁的 OSD ID,则可以将 OSD ID 作为附加参数提供给 ceph osd new。我们假设 client.bootstrap-osd 密钥存在于机器上。您也可以在存在该密钥的另一台主机上以 client.admin 身份执行此命令。

    ID=$(echo "{\"cephx_secret\": \"$OSD_SECRET\"}" | \
       ceph osd new $UUID -i - \
       -n client.bootstrap-osd -k /var/lib/ceph/bootstrap-osd/ceph.keyring)
    

    还可以在 JSON 中包含 crush_device_class 属性以设置初始类别,而不是默认类别(基于自动检测到的设备类型为 ssdhdd)。

  5. 在新的 OSD 上创建默认目录。

    mkdir /var/lib/ceph/osd/ceph-$ID
    
  6. 如果 OSD 用于操作系统驱动器以外的驱动器,请准备它以用于 Ceph,并将其挂载到您刚刚创建的目录中。

    mkfs.xfs /dev/{DEV}
    mount /dev/{DEV} /var/lib/ceph/osd/ceph-$ID
    
  7. 将密钥写入 OSD 密钥环文件。

    ceph-authtool --create-keyring /var/lib/ceph/osd/ceph-$ID/keyring \
         --name osd.$ID --add-key $OSD_SECRET
    
  8. 初始化 OSD 数据目录。

    ceph-osd -i $ID --mkfs --osd-uuid $UUID
    
  9. 修复所有权。

    chown -R ceph:ceph /var/lib/ceph/osd/ceph-$ID
    
  10. 将 OSD 添加到 Ceph 后,OSD 将出现在您的配置中。但是,它尚未运行。您必须启动新的 OSD 才能开始接收数据。

    对于现代 systemd 发行版

    systemctl enable ceph-osd@$ID
    systemctl start ceph-osd@$ID
    

    例如

    systemctl enable ceph-osd@12
    systemctl start ceph-osd@12
    

添加 MDS

在下面的说明中,{id} 是一个任意名称,例如机器的主机名。

  1. 创建 mds 数据目录。

    mkdir -p /var/lib/ceph/mds/{cluster-name}-{id}
    
  2. 创建一个密钥环。

    ceph-authtool --create-keyring /var/lib/ceph/mds/{cluster-name}-{id}/keyring --gen-key -n mds.{id}
    
  3. 导入密钥环并设置功能。

    ceph auth add mds.{id} osd "allow rwx" mds "allow *" mon "allow profile mds" -i /var/lib/ceph/mds/{cluster}-{id}/keyring
    
  4. 添加到 ceph.conf 中。

    [mds.{id}]
    host = {id}
    
  5. 手动启动守护程序。

    ceph-mds --cluster {cluster-name} -i {id} -m {mon-hostname}:{mon-port} [-f]
    
  6. 以正确的方式启动守护程序(使用 ceph.conf 条目)。

    service ceph start
    
  7. 如果启动守护程序失败并出现此错误

    mds.-1.0 ERROR: failed to authenticate: (22) Invalid argument
    

    那么请确保您在 global 部分的 ceph.conf 中没有设置密钥环;将其移至 client 部分;或为该 mds 守护程序添加特定的密钥环设置。并验证您在 mds 数据目录和 ceph auth get mds.{id} 输出中看到相同的密钥。

  8. 现在您已准备好创建 Ceph 文件系统

手动安装 RADOSGW

有关此处介绍的程序的更深入讨论,请参阅 ceph-users 邮件列表上的此帖子

  1. 在将成为 RGW 节点的节点上安装 radosgw 包。

  2. 从监视器或具有管理员权限的节点上,运行以下形式的命令

    ceph auth get-or-create client.$(hostname -s) mon 'allow rw' osd 'allow rwx'
    
  3. 在其中一个 RGW 节点上,执行以下操作

    1. 创建一个 ceph-user 拥有的目录。例如

      install -d -o ceph -g ceph /var/lib/ceph/radosgw/ceph-$(hostname -s)
      
    2. 进入刚创建的目录并创建一个 keyring 文件

      touch /var/lib/ceph/radosgw/ceph-$(hostname -s)/keyring
      

      使用类似于此命令的命令将前面 ceph auth get-or-create 步骤中的密钥放入 keyring 文件中。使用您喜欢的编辑器

      $EDITOR /var/lib/ceph/radosgw/ceph-$(hostname -s)/keyring
      
    3. 在每个 RGW 节点上重复这些步骤。

  4. 通过运行以下命令启动 RADOSGW 服务

    systemctl start ceph-radosgw@$(hostname -s).service
    

总结

一旦您的监视器和两个 OSD 启动并运行,您可以通过执行以下操作来观察放置组对等

ceph -w

要查看树,请执行以下操作

ceph osd tree

您应该会看到如下所示的输出

# id    weight  type name       up/down reweight
-1      2       root default
-2      2               host osd-node1
0       1                       osd.0   up      1
-3      1               host osd-node2
1       1                       osd.1   up      1

要添加(或删除)额外的监视器,请参阅 添加/删除监视器。要添加(或删除)额外的 Ceph OSD 守护程序,请参阅 添加/删除 OSD

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入