适用于 SUSE Enterprise Storage 5

18 技巧与提示

本章提供可帮助您增强 Ceph 集群性能的信息,以及有关如何设置集群的提示。

18.1 调整整理 (Scrub)

默认情况下,Ceph 每天会执行浅层整理 (light scrub)(有关详细信息,请参见第 6.5 节 “整理 (Scrub)”),每周会执行深层整理 (deep scrub)。浅层整理 (light scrub) 会检查对象大小及校验和,以确保归置组存储的是相同的对象数据。深层整理 (deep scrub) 会检查对象的内容及其副本,以确保实际内容相同。在整理 (scrub) 期间检查数据完整性会增加集群上的 I/O 负载。

默认设置允许 Ceph OSD 在不合适的时间(如负载较重时)启动整理 (scrub)。当整理 (scrub) 操作与客户操作发生冲突时,可能会出现延迟和性能不佳情况。Ceph 提供了数个整理 (scrub) 设置,可将整理 (scrub) 限制在低负载或非高峰时段执行。

如果集群在日间负载高而在夜间负载低,请考虑将整理 (scrub) 限制在夜间执行,例如在晚上 11 点到早上 6 点期间执行。

[osd]
osd_scrub_begin_hour = 23
osd_scrub_end_hour = 6

如果使用时间限制无法有效决定整理 (scrub) 时间表,请考虑使用 osd_scrub_load_threshold 选项。其默认值为 0.5,但也可针对低负载情况进行相应调整:

[osd]
osd_scrub_load_threshold = 0.25

18.2 在不重新平衡的情况下停止 OSD

进行定期维护时,您可能需要停止 OSD。如果您不希望 CRUSH 自动重新平衡集群,以免出现大量数据传输,请先将集群设为 noout

root@minion > ceph osd set noout

当集群设为 noout 时,您便可开始在需要执行维护工作的故障域中停止 OSD:

root@minion > systemctl stop ceph-osd@OSD_NUMBER.service

有关详细信息,请参见第 3.1.2 节 “启动、停止和重启动个别服务”

完成维护工作后,再次启动 OSD:

root@minion > systemctl start ceph-osd@OSD_NUMBER.service

OSD 服务启动后,取消集群的 noout 设置:

root@minion > ceph osd unset noout

18.3 节点时间同步

Ceph 要求特定节点之间的时间保持精确的同步。您应该使用自己的 NTP 服务器设置节点。尽管您可以将所有 ntpd 实例指向远程公共时间服务器,但不建议对 Ceph 采用这种做法。如果采用这种配置,集群中的每个节点都会借助自己的 NTP 守护进程通过因特网来持续与三到四台时间服务器通讯,而这些服务器全部都相距很远。此解决方案在很大程度上带来了延迟方面的变数,使得难以甚至无法将时钟偏差保持在 0.05 秒以下(Ceph monitor 要求这种精度)。

因此,应该使用一台计算机作为整个集群的 NTP 服务器。这样,NTP 服务器 ntpd 实例可以指向远程(公共)NTP 服务器,或者可以有自己的时间源。然后,所有节点上的 ntpd 实例将指向这台本地服务器。此类解决方案有多种优势,例如,避免不必要的网络流量和时钟偏差,减轻公共 NTP 服务器上的负载。有关如何设置 NTP 服务器的详细信息,请参见《SUSE Linux Enterprise Server 管理指南》

要更改集群上的时间,请执行以下操作:

重要
重要:设置时间

您可能会遇到需要将时间往回调的情况,例如,当时间从夏令时改成标准时间时就需要如此。不建议将时间回调的幅度超过集群的关闭时长。将时间往前调不会造成任何问题。

过程 18.1︰ 集群上的时间同步
  1. 停止正在访问 Ceph 集群的所有客户端,尤其是使用 iSCSI 的客户端。

  2. 关闭 Ceph 集群。在每个节点上,运行:

    systemctl stop ceph.target
    注意
    注意

    如果您使用了 Ceph 和 SUSE OpenStack Cloud,则还需停止 SUSE OpenStack Cloud。

  3. 校验 NTP 服务器的设置是否正确,即所有 ntpd 守护进程是否可从本地网络中的一个或多个源获取时间。

  4. 在 NTP 服务器上设置正确的时间。

  5. 确认 NTP 正在运行且在正常工作,然后在所有节点上运行:

    status ntpd.service

    或者

    ntpq -p
  6. 启动所有监视节点,并校验是否不存在时钟偏差:

    systemctl start target
  7. 启动所有 OSD 节点。

  8. 启动其他 Ceph 服务。

  9. 启动 SUSE OpenStack Cloud(如果有)。

18.4 检查不均衡的数据写入

如果数据均衡写入 OSD,则认为集群是平衡的。集群中的每个 OSD 都分配了权重。权重是一个相对数字,告知 Ceph 应写入相关 OSD 的数据量。权重越高,要写入的数据就越多。如果 OSD 的权重为零,则不会向其写入任何数据。如果某个 OSD 的权重相对于其他 OSD 而言较高,则大部分数据将会写入这个 OSD,致使集群变得不平衡。

不平衡集群的性能较差;如果某个权重较高的 OSD 突然崩溃,则大量的数据就需要转移到其他 OSD,这也会导致集群速度变慢。

为避免此问题,应该定期检查 OSD 中的数据写入量。如果写入量介于给定规则组所指定 OSD 组容量的 30% 到 50% 之间,则您需要重新设置 OSD 的权重。检查各个磁盘,找出其中哪些磁盘的填满速度比其他磁盘更快(或者一般情况下速度更慢),并降低其权重。对于数据写入量不足的 OSD 可以采用相同的思路:可以提高其权重,让 Ceph 将更多的数据写入其中。在下面的示例中,您将确定 ID 为 13 的 OSD 的权重,并将权重从 3 重新设置为 3.05:

$ ceph osd tree | grep osd.13
 13  3                   osd.13  up  1

 $ ceph osd crush reweight osd.13 3.05
 reweighted item id 13 name 'osd.13' to 3.05 in crush map

 $ ceph osd tree | grep osd.13
 13  3.05                osd.13  up  1
提示
提示:按使用率重新设置 OSD 的权重

ceph osd reweight-by-utilization 阈值命令可自动完成降低严重过度使用的 OSD 的权重的过程。默认情况下,此命令将对达到平均使用率的 120% 的 OSD 降低权重,但是,如果您指定了阈值,则命令会改用该百分比。

18.5 /var/lib/ceph 的 Btrfs 子卷

SUSE Linux Enterprise 默认安装在 Btrfs 分区上。应该从 Btrfs 快照和回滚操作中排除目录 /var/lib/ceph,当 MON 在节点上运行时更应如此。DeepSea 提供了 fs 运行程序,可为此路径设置子卷。

18.5.1 全新安装的要求

如果您是首次安装集群,则必须满足以下要求才能使用 DeepSea 运行程序:

  • Salt 和 DeepSea 已根据本文档正确安装且正常运行。

  • 已调用 salt-run state.orch ceph.stage.0 将所有 Salt 和 DeepSea 模块同步到 Minion。

  • Ceph 尚未安装,因此 ceph.stage.3 尚未运行,且 /var/lib/ceph 尚不存在。

18.5.2 现有安装的要求

如果已安装集群,则必须满足以下要求才能使用 DeepSea 运行程序:

  • 已将节点升级到 SUSE Enterprise Storage,并且集群受 DeepSea 的控制。

  • Ceph 集群已启动且正常运行。

  • 升级过程已将 Salt 和 DeepSea 模块同步到所有 Minion 节点。

18.5.3 自动安装

  • 在 Salt Master 上运行:

    root@master # salt-run state.orch ceph.migrate.subvolume

    对于不存在 /var/lib/ceph 目录的节点,此命令一次将在一个节点上执行以下操作:

    • 创建 /var/lib/ceph,作为 @/var/lib/ceph Btrfs 子卷。

    • 挂载新子卷并相应地更新 /etc/fstab

    • /var/lib/ceph 禁用写入时复制。

    对于已安装 Ceph 的节点,此命令一次将在一个节点上执行以下操作:

    • 终止正在运行的 Ceph 进程。

    • 卸载节点上的 OSD。

    • 创建 @/var/lib/ceph Btrfs 子卷,并迁移现有的 /var/lib/ceph 数据。

    • 挂载新子卷并相应地更新 /etc/fstab

    • /var/lib/ceph/* 禁用写入时复制,并忽略 /var/lib/ceph/osd/*

    • 重新挂载 OSD。

    • 重启动 Ceph 守护进程。

18.5.4 手动安装

此过程使用新的 fs 运行程序。

  1. 在所有节点上检查 /var/lib/ceph 的状态,并列显有关如何继续操作的建议:

    root@master # salt-run fs.inspect_var

    此操作会返回以下命令之一:

    salt-run fs.create_var
    salt-run fs.migrate_var
    salt-run fs.correct_var_attrs
  2. 运行上一步中返回的命令。

    如果某个节点上出错,针对其他节点的执行进程也会停止,并且运行程序会尝试还原已执行的更改。请查阅出现问题的 Minion 上的日志文件,以确定问题所在。解决问题后,可以重新运行运行程序。

命令 salt-run fs.help 提供 fs 模块的所有运行程序和模块命令列表。

18.6 增加文件描述符

对于 OSD 守护进程而言,读/写操作对保持 Ceph 集群平衡至关重要。这些守护进程通常需要同时打开许多文件进行读取和写入。在 OS 级别,同时打开的文件的最大数目称为“文件描述符的最大数目”。

为防止 OSD 用尽文件描述符,您可以覆盖 OS 默认值,并在 /etc/ceph/ceph.conf 中指定该数字,例如:

max_open_files = 131072

更改 max_open_files 之后,需在相关的 Ceph 节点上重启动 OSD 服务。

18.7 如何对包含 OSD 日记的 OSD 使用现有分区

重要
重要

本节介绍一个仅供存储专家和开发人员研究的高级主题。所述的方法主要用于解决使用非标准 OSD 日记大小的情况。如果 OSD 分区小于 10GB,则其初始权重将舍入为 0,因而不会在其上放置任何数据,所以您应该提高其权重。我们不会处理日记过满的情况。

如果您要使用现有的磁盘分区作为 OSD 节点,则需要将 OSD 日记和数据分区列入 GPT 分区表中。

需要将正确的分区类型设置为 OSD 分区,使 udev 能够正确识别这些分区;并将分区的所有权设置为 ceph:ceph

例如,要设置日记分区 /dev/vdb1 和数据分区 /dev/vdb2 的分区类型,请运行以下命令:

sudo sgdisk --typecode=1:45b0969e-9b03-4f30-b4c6-b4b80ceff106 /dev/vdb
sudo sgdisk --typecode=2:4fbd7e29-9d25-41b8-afd0-062c0ceff05d /dev/vdb
提示
提示

Ceph 分区表类型列于 /usr/lib/udev/rules.d/95-ceph-osd.rules 中:

cat /usr/lib/udev/rules.d/95-ceph-osd.rules
# OSD_UUID
ACTION=="add", SUBSYSTEM=="block", \
  ENV{DEVTYPE}=="partition", \
  ENV{ID_PART_ENTRY_TYPE}=="4fbd7e29-9d25-41b8-afd0-062c0ceff05d", \
  OWNER:="ceph", GROUP:="ceph", MODE:="660", \
  RUN+="/usr/sbin/ceph-disk --log-stdout -v trigger /dev/$name"
ACTION=="change", SUBSYSTEM=="block", \
  ENV{ID_PART_ENTRY_TYPE}=="4fbd7e29-9d25-41b8-afd0-062c0ceff05d", \
  OWNER="ceph", GROUP="ceph", MODE="660"

# JOURNAL_UUID
ACTION=="add", SUBSYSTEM=="block", \
  ENV{DEVTYPE}=="partition", \
  ENV{ID_PART_ENTRY_TYPE}=="45b0969e-9b03-4f30-b4c6-b4b80ceff106", \
  OWNER:="ceph", GROUP:="ceph", MODE:="660", \
  RUN+="/usr/sbin/ceph-disk --log-stdout -v trigger /dev/$name"
ACTION=="change", SUBSYSTEM=="block", \
  ENV{ID_PART_ENTRY_TYPE}=="45b0969e-9b03-4f30-b4c6-b4b80ceff106", \
  OWNER="ceph", GROUP="ceph", MODE="660"
[...]

18.8 与虚拟化软件集成

18.8.1 在 Ceph 集群中存储 KVM 磁盘

您可以为 KVM 驱动的虚拟机创建磁盘映像,将该映像存储在 Ceph 存储池中,选择性地将现有映像的内容转换到该映像,然后使用 qemu-kvm 运行虚拟机,以利用集群中存储的磁盘映像。有关详细信息,请参见第 17 章 “Ceph 用作 QEMU KVM 实例的后端

18.8.2 在 Ceph 集群中存储 libvirt 磁盘

类似于 KVM(请参见第 18.8.1 节 “在 Ceph 集群中存储 KVM 磁盘”),您可以使用 Ceph 来存储 libvirt 驱动的虚拟机。这样做的好处是可以运行任何支持 libvirt 的虚拟化解决方案,例如 KVM、Xen 或 LXC。有关详细信息,参见第 16 章 “libvirt 与 Ceph 搭配使用

18.8.3 在 Ceph 集群中存储 Xen 磁盘

使用 Ceph 存储 Xen 磁盘的方法之一是按第 16 章 “libvirt 与 Ceph 搭配使用中所述利用 libvirt

另一种方法是让 Xen 直接与 rbd 块设备驱动程序通讯:

  1. 如果尚未为 Xen 准备磁盘映像,请新建一个:

    rbd create myimage --size 8000 --pool mypool
  2. 列出存储池 mypool 中的映像,并检查您的新映像是否在该存储池中:

    rbd list mypool
  3. 通过将 myimage 映像映射到 rbd 内核模块来创建一个新的块设备:

    sudo rbd map --pool mypool myimage
    提示
    提示:用户名和身份验证

    要指定用户名,请使用 --id 用户名。此外,如果您使用了 cephx 身份验证,则还必须指定机密。该机密可能来自密钥环,或某个包含机密的文件:

    sudo rbd map --pool rbd myimage --id admin --keyring /path/to/keyring

    或者

    sudo rbd map --pool rbd myimage --id admin --keyfile /path/to/file
  4. 列出所有映射的设备:

    rbd showmapped
     id pool   image   snap device
     0  mypool myimage -    /dev/rbd0
  5. 现在,可以将 Xen 配置为使用此设备作为运行虚拟机所用的磁盘。例如,可将下行添加到 xl 样式的域配置文件:

    disk = [ '/dev/rbd0,,sda', '/dev/cdrom,,sdc,cdrom' ]

18.9 Ceph 的防火墙设置

警告
警告:使用防火墙时 DeepSea 阶段失败

当防火墙处于活动状态(甚至只是配置了防火墙)时,DeepSea 部署阶段会失败。要正确通过该阶段,需要运行以下命令关闭防火墙

root@master # systemctl stop SuSEfirewall2.service

或在 /srv/pillar/ceph/stack/global.yml 中将 FAIL_ON_WARNING 选项设为“False”:

FAIL_ON_WARNING: False

建议使用 SUSE 防火墙保护网络集群通讯。可以通过选择 YaST › 安全性和用户 › 防火墙 › 允许的服务来编辑防火墙的配置。

下面列出了 Ceph 相关服务以及这些服务通常使用的端口号:

Ceph Monitor

启用 Ceph MON 服务或端口 6789 (TCP)。

Ceph OSD 或元数据服务器

启用 Ceph OSD/MDS 服务或端口 6800-7300 (TCP)。

iSCSI 网关

打开端口 3260 (TCP)。

对象网关

打开对象网关通讯所用的端口。此端口在 /etc/ceph.conf 内以 rgw frontends = 开头的行中设置。HTTP 的默认端口为 80,HTTPS (TCP) 的默认端口为 443。

NFS Ganesha

默认情况下,NFS Ganesha 使用端口 2049(NFS 服务、TCP)和 875 (rquota 支持、TCP)。有关更改默认 NFS Ganesha 端口的详细信息,请参见第 14.2.3 节 “更改默认 NFS Ganesha 端口”

基于 Apache 的服务,例如 openATTIC、SMT 或 SUSE Manager

打开用于 HTTP 的端口 80,用于 HTTPS (TCP) 的端口 443。

SSH

打开端口 22 (TCP)。

NTP

打开端口 123 (UDP)。

Salt

打开端口 4505 和 4506 (TCP)。

Grafana

打开端口 3000 (TCP)。

Prometheus

打开端口 9100 (TCP)。

18.10 测试网络性能

为方便测试网络性能,DeepSea net 运行程序提供了以下命令。

  • 向所有节点发出简单 ping:

    root@master # salt-run net.ping
    Succeeded: 9 addresses from 9 minions average rtt 1.35 ms
  • 向所有节点发出大规模 ping:

    root@master # salt-run net.jumbo_ping
    Succeeded: 9 addresses from 9 minions average rtt 2.13 ms
  • 带宽测试:

    root@master # salt-run net.iperf
    Fastest 2 hosts:
        |_
          - 192.168.58.106
          - 2981 Mbits/sec
        |_
          - 192.168.58.107
          - 2967 Mbits/sec
    Slowest 2 hosts:
        |_
          - 192.168.58.102
          - 2857 Mbits/sec
        |_
          - 192.168.58.103
          - 2842 Mbits/sec

18.11 更换存储磁盘

如果您需要更换 Ceph 集群中的存储磁盘,可在集群具有完全运作能力时更换。更换操作会导致数据传输量暂时性增加。

如果整个磁盘都有故障,Ceph 至少需要重新写入与故障磁盘容量相同的数据量。如果正常取下磁盘然后重新装上,以免更换过程中出现冗余损失,重新写入的数据量将增大到两倍。如果新磁盘与更换掉的磁盘大小不同,将导致重新分发某些额外数据,甚至超出所有 OSD 的用量。

打印此页