第 10 章 配合 LVM 使用 NVMe
概述
以下流程演示了在使用基于 NVMe 的 SSD 时,如何以最佳的方式部署 Ceph 以实现对象网关使用(这也适用于 SATA SSD)。日志和 bucket 索引将一起放在高速存储设备上,与将所有日志放在一个设备上相比,这可以提高性能。此配置需要将
osd_scenario设置为lvm。提供了两个示例配置的步骤:
- 使用一个存储桶索引有一个 NVMe 设备和至少四个 HDD: 一个 NVMe 设备
- 使用两个存储桶索引的两个 NVMe 设备和至少四个 HDD: 两个 NVMe 设备
详情
最基本的 Ceph 设置使用
osd_scenario设置,即collocated。这会将 OSD 数据及其日志存储到一个存储设备上(它们都是"并置")。典型的服务器配置包括 HDD 和 SSD。由于 HDD 通常大于 SSD,因此在并置配置中将 HDD 调出要选择的最大存储空间,单独将 OSD 数据和日志放在其中。不过,日志最好位于更快的 SSD 上。另一种选项是使用非并置的osd_scenario设置。这允许配置专用设备以用于日志,因此您可以将 OSD 数据放在 HDD 和 SSD 上的日志中。除了 OSD 数据和日志外,使用对象网关时,需要将 bucket 索引存储在设备上。在这种情形中,通常配置 Ceph,使 HDD 保存 OSD 数据,一个 SSD 保存日志,另一个 SSD 保存 bucket 索引。这可能会造成高度不稳定的情况,即所有日志的 SSD 变得饱和,而具有存储桶索引的 SSD 未被充分利用。
解决方法是将
osd_scenario设置为lvm,并使用逻辑卷管理器(LVM)为多个目的划分单个 SSD 设备。这使得日志和 bucket 索引可以在单个设备上并排存在。最重要的是,它允许日志存在于多个 SSD 上,将日志的密集 IO 数据传输分布到多个设备上。ceph-ansibleRPM 提供的普通 Ansible playbook,用于安装 Ceph(site.yml、osds.yml 等)不支持将一个设备用于多个用途。在未来,正常的 Ansible playbook 将支持将一个设备用于多个目的。同时,还提供了 playbook
lv-create.yml和lv-vars.yaml,以帮助创建符合最佳 SSD 使用所需的日志卷(LV)。在运行site可以正常运行,它将使用新创建的 LV。.yml 后,lv-create.yml重要这些步骤只适用于 FileStore 存储后端,而不是新的 BlueStore 存储后端。
10.1. 使用一个 NVMe 设备 复制链接链接已复制到粘贴板!
按照以下步骤,使用一个 NVMe 设备部署 Ceph 以使用对象网关。
10.1.1. 清除任何现有的 Ceph 集群 复制链接链接已复制到粘贴板!
如果已经配置了 Ceph,请清除它,以便从头开始。提供 Ansible playbook purge-cluster.yml。
$ ansible-playbook infrastructure-playbooks/purge-cluster.yml -i hosts
如需有关如何使用 purge-cluster.yml 的更多信息,请参阅《 安装指南》 中的使用 Ansible 清除 Ceph 集群。
清除集群可能不足以让服务器做好按照下列步骤重新部署 Ceph 的准备。Ceph 使用的存储设备上的任何文件系统、GPT、RAID 或其他签名都可能会导致问题。Run The lv-create.yml Ansible Playbook 下提供了使用 wipefs 删除任何签名的说明。
10.1.2. 为常规安装配置集群 复制链接链接已复制到粘贴板!
在设置任何 NVMe 和/或 LVM 注意事项之前,按常规方式配置集群,但在运行 Ansible playbook 前停止。之后,将专门针对最佳 NVMe/LVM 使用调整集群安装配置,以支持对象网关。只有在那个时候,Ansible playbook 才应当运行。
若要为普通安装配置存储集群,请参阅《 红帽 Ceph 存储安装指南 》。特别是,通过创建 Ansible 日志目录第 9 步完成安装 红帽 Ceph 存储集群 中的步骤。在第 10 步之前停止运行 ansible-playbook site.yml -i 主机。
在完成 NVMe 的 Install Ceph 和 Verify Success 之前,不要运行 ansible-playbook site.yml -i 主机。
10.1.3. 识别 NVMe 和 HDD 设备 复制链接链接已复制到粘贴板!
使用 lsblk 标识连接到服务器的 NVMe 和 HDD 设备。下方列出了 lsblk 的输出示例:
[root@c04-h05-6048r ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 4G 0 part
│ └─md1 9:1 0 4G 0 raid1 [SWAP]
├─sda2 8:2 0 512M 0 part
│ └─md0 9:0 0 512M 0 raid1 /boot
└─sda3 8:3 0 461.3G 0 part
└─md2 9:2 0 461.1G 0 raid1 /
sdb 8:16 0 465.8G 0 disk
├─sdb1 8:17 0 4G 0 part
│ └─md1 9:1 0 4G 0 raid1 [SWAP]
├─sdb2 8:18 0 512M 0 part
│ └─md0 9:0 0 512M 0 raid1 /boot
└─sdb3 8:19 0 461.3G 0 part
└─md2 9:2 0 461.1G 0 raid1 /
sdc 8:32 0 1.8T 0 disk
sdd 8:48 0 1.8T 0 disk
sde 8:64 0 1.8T 0 disk
sdf 8:80 0 1.8T 0 disk
sdg 8:96 0 1.8T 0 disk
sdh 8:112 0 1.8T 0 disk
sdi 8:128 0 1.8T 0 disk
sdj 8:144 0 1.8T 0 disk
sdk 8:160 0 1.8T 0 disk
sdl 8:176 0 1.8T 0 disk
sdm 8:192 0 1.8T 0 disk
sdn 8:208 0 1.8T 0 disk
sdo 8:224 0 1.8T 0 disk
sdp 8:240 0 1.8T 0 disk
sdq 65:0 0 1.8T 0 disk
sdr 65:16 0 1.8T 0 disk
sds 65:32 0 1.8T 0 disk
sdt 65:48 0 1.8T 0 disk
sdu 65:64 0 1.8T 0 disk
sdv 65:80 0 1.8T 0 disk
sdw 65:96 0 1.8T 0 disk
sdx 65:112 0 1.8T 0 disk
sdy 65:128 0 1.8T 0 disk
sdz 65:144 0 1.8T 0 disk
sdaa 65:160 0 1.8T 0 disk
sdab 65:176 0 1.8T 0 disk
sdac 65:192 0 1.8T 0 disk
sdad 65:208 0 1.8T 0 disk
sdae 65:224 0 1.8T 0 disk
sdaf 65:240 0 1.8T 0 disk
sdag 66:0 0 1.8T 0 disk
sdah 66:16 0 1.8T 0 disk
sdai 66:32 0 1.8T 0 disk
sdaj 66:48 0 1.8T 0 disk
sdak 66:64 0 1.8T 0 disk
sdal 66:80 0 1.8T 0 disk
nvme0n1 259:0 0 745.2G 0 disk
nvme1n1 259:1 0 745.2G 0 disk
在本例中,将使用以下原始块设备:
NVMe 设备
-
/dev/nvme0n1
HDD 设备
-
/dev/sdc -
/dev/sdd -
/dev/sde -
/dev/sdf
文件 lv_vars.yaml 在所选设备上配置逻辑卷创建。它在 NVMe、基于 NVMe 的 bucket 索引和基于 HDD 的 OSD 上创建日志。逻辑卷的实际创建由 lv-create.yml 启动,它显示为 lv_vars.yaml。
该文件一次仅应具有一个 NVMe 设备。有关将 Ceph 与两个 NVMe 设备搭配使用的最佳信息,请参见使用两个 NVMe 设备。
10.1.4. 将设备添加到 lv_vars.yaml 复制链接链接已复制到粘贴板!
以
root用户身份,导航到/usr/share/ceph-ansible/目录:# cd /usr/share/ceph-ansible编辑该文件,使其包含以下行:
nvme_device: /dev/nvme0n1 hdd_devices: - /dev/sdc - /dev/sdd - /dev/sde - /dev/sdf
10.1.5. 运行 lv-create.yml Ansible Playbook 复制链接链接已复制到粘贴板!
lv-create.yml playbook 的目的是在单个 NVMe 上为对象网关存储桶索引和日志创建逻辑卷。它通过使用 osd_scenario=lvm 来完成此操作。通过自动执行部分复杂的 LVM 创建和配置,lv -create.yml Ansible playbook 使以这种方式配置 Ceph 变得更加简单。
确保存储设备是 raw
在运行
lv-create.yml以便在 NVMe 设备和 HDD 设备中创建逻辑卷之前,请确保它们中没有文件系统、GPT、RAID 或其他签名。如果它们不是原始的,当运行
lv-create.yml时可能会失败,并显示以下错误:device /dev/sdc excluded by a filterwipe 存储设备签名(可选):
如果设备有签名,您可以使用
wipefs擦除它们。以下是使用
wipefs擦除设备的示例:[root@c04-h01-6048r ~]# wipefs -a /dev/sdc /dev/sdc: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54 /dev/sdc: 8 bytes were erased at offset 0x1d19ffffe00 (gpt): 45 46 49 20 50 41 52 54 /dev/sdc: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa /dev/sdc: calling ioclt to re-read partition table: Success [root@c04-h01-6048r ~]# wipefs -a /dev/sdd /dev/sdd: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54 /dev/sdd: 8 bytes were erased at offset 0x1d19ffffe00 (gpt): 45 46 49 20 50 41 52 54 /dev/sdd: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa /dev/sdd: calling ioclt to re-read partition table: Success [root@c04-h01-6048r ~]# wipefs -a /dev/sde /dev/sde: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54 /dev/sde: 8 bytes were erased at offset 0x1d19ffffe00 (gpt): 45 46 49 20 50 41 52 54 /dev/sde: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa /dev/sde: calling ioclt to re-read partition table: Success [root@c04-h01-6048r ~]# wipefs -a /dev/sdf /dev/sdf: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54 /dev/sdf: 8 bytes were erased at offset 0x1d19ffffe00 (gpt): 45 46 49 20 50 41 52 54 /dev/sdf: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa /dev/sdf: calling ioclt to re-read partition table: Success运行
lv-teardown.ymlAnsible playbook:在运行
lv-:create.yml 前,始终运行 lv-teardown.yml运行
lv-teardown.ymlAnsible playbook:$ ansible-playbook infrastructure-playbooks/lv-teardown.yml -i hosts警告运行
lv-teardown.ymlAnsible 脚本时请谨慎操作。它销毁数据。确保您已备份了任何重要数据。运行
lv-create.ymlAnsible playbook:$ ansible-playbook infrastructure-playbooks/lv-create.yml -i hosts-
lv-create.yml完成且无错误后,继续到下一节以验证其是否正常工作。
10.1.6. 验证 LVM 配置 复制链接链接已复制到粘贴板!
查看
lv-created.log:lv-create.ymlAnsible playbook 成功完成后,配置信息将写入lv-created.log。稍后,此信息将复制到group_vars/osds.yml中。打开lv-created.log并查找类似以下示例的信息:- data: ceph-bucket-index-1 data_vg: ceph-nvme-vg-nvme0n1 journal: ceph-journal-bucket-index-1-nvme0n1 journal_vg: ceph-nvme-vg-nvme0n1 - data: ceph-hdd-lv-sdc data_vg: ceph-hdd-vg-sdc journal: ceph-journal-sdc journal_vg: ceph-nvme-vg-nvme0n1 - data: ceph-hdd-lv-sdd data_vg: ceph-hdd-vg-sdd journal: ceph-journal-sdd journal_vg: ceph-nvme-vg-nvme0n1 - data: ceph-hdd-lv-sde data_vg: ceph-hdd-vg-sde journal: ceph-journal-sde journal_vg: ceph-nvme-vg-nvme0n1 - data: ceph-hdd-lv-sdf data_vg: ceph-hdd-vg-sdf journal: ceph-journal-sdf journal_vg: ceph-nvme-vg-nvme0n1查看 LVM 配置
根据一个 NVMe 设备和四个 HDD 的示例,应创建以下逻辑卷(LV):
NVMe 上放置每个 HDD 的一个日志 LV(/dev/nvme0n1 上的四个 LV)
每个 HDD 放置一个数据 LV(每个 HDD 个 LV)
个用于 NVMe 上存储桶索引的日志 LV(位于 /dev/nvme0n1 上的一个 LV)
个用于存储桶索引的数据 LV 放置在 NVMe 上(/dev/nvme0n1 上的一个 LV)
可以在
lsblk 和lvscan输出中看到 LV。在上图的示例中,Ceph 应当有十个 LV。粗略检查您可以计算 Ceph LV 的数量以确保至少有十个 LV,但最好确保在正确的存储设备(NVMe 与 HDD)上创建了适当的 LV。lsblk输出示例如下所示:[root@c04-h01-6048r ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 4G 0 part │ └─md1 9:1 0 4G 0 raid1 [SWAP] ├─sda2 8:2 0 512M 0 part │ └─md0 9:0 0 512M 0 raid1 /boot └─sda3 8:3 0 461.3G 0 part └─md2 9:2 0 461.1G 0 raid1 / sdb 8:16 0 465.8G 0 disk ├─sdb1 8:17 0 4G 0 part │ └─md1 9:1 0 4G 0 raid1 [SWAP] ├─sdb2 8:18 0 512M 0 part │ └─md0 9:0 0 512M 0 raid1 /boot └─sdb3 8:19 0 461.3G 0 part └─md2 9:2 0 461.1G 0 raid1 / sdc 8:32 0 1.8T 0 disk └─ceph--hdd--vg--sdc-ceph--hdd--lv--sdc 253:6 0 1.8T 0 lvm sdd 8:48 0 1.8T 0 disk └─ceph--hdd--vg--sdd-ceph--hdd--lv--sdd 253:7 0 1.8T 0 lvm sde 8:64 0 1.8T 0 disk └─ceph--hdd--vg--sde-ceph--hdd--lv--sde 253:8 0 1.8T 0 lvm sdf 8:80 0 1.8T 0 disk └─ceph--hdd--vg--sdf-ceph--hdd--lv--sdf 253:9 0 1.8T 0 lvm sdg 8:96 0 1.8T 0 disk sdh 8:112 0 1.8T 0 disk sdi 8:128 0 1.8T 0 disk sdj 8:144 0 1.8T 0 disk sdk 8:160 0 1.8T 0 disk sdl 8:176 0 1.8T 0 disk sdm 8:192 0 1.8T 0 disk sdn 8:208 0 1.8T 0 disk sdo 8:224 0 1.8T 0 disk sdp 8:240 0 1.8T 0 disk sdq 65:0 0 1.8T 0 disk sdr 65:16 0 1.8T 0 disk sds 65:32 0 1.8T 0 disk sdt 65:48 0 1.8T 0 disk sdu 65:64 0 1.8T 0 disk sdv 65:80 0 1.8T 0 disk sdw 65:96 0 1.8T 0 disk sdx 65:112 0 1.8T 0 disk sdy 65:128 0 1.8T 0 disk sdz 65:144 0 1.8T 0 disk sdaa 65:160 0 1.8T 0 disk sdab 65:176 0 1.8T 0 disk sdac 65:192 0 1.8T 0 disk sdad 65:208 0 1.8T 0 disk sdae 65:224 0 1.8T 0 disk sdaf 65:240 0 1.8T 0 disk sdag 66:0 0 1.8T 0 disk sdah 66:16 0 1.8T 0 disk sdai 66:32 0 1.8T 0 disk sdaj 66:48 0 1.8T 0 disk sdak 66:64 0 1.8T 0 disk sdal 66:80 0 1.8T 0 disk nvme0n1 259:0 0 745.2G 0 disk ├─ceph--nvme--vg--nvme0n1-ceph--journal--bucket--index--1--nvme0n1 253:0 0 5.4G 0 lvm ├─ceph--nvme--vg--nvme0n1-ceph--journal--sdc 253:1 0 5.4G 0 lvm ├─ceph--nvme--vg--nvme0n1-ceph--journal--sdd 253:2 0 5.4G 0 lvm ├─ceph--nvme--vg--nvme0n1-ceph--journal--sde 253:3 0 5.4G 0 lvm ├─ceph--nvme--vg--nvme0n1-ceph--journal--sdf 253:4 0 5.4G 0 lvm └─ceph--nvme--vg--nvme0n1-ceph--bucket--index--1 253:5 0 718.4G 0 lvm nvme1n1 259:1 0 745.2G 0 disklvscan输出示例如下:[root@c04-h01-6048r ~]# lvscan ACTIVE '/dev/ceph-hdd-vg-sdf/ceph-hdd-lv-sdf' [<1.82 TiB] inherit ACTIVE '/dev/ceph-hdd-vg-sde/ceph-hdd-lv-sde' [<1.82 TiB] inherit ACTIVE '/dev/ceph-hdd-vg-sdd/ceph-hdd-lv-sdd' [<1.82 TiB] inherit ACTIVE '/dev/ceph-nvme-vg-nvme0n1/ceph-journal-bucket-index-1-nvme0n1' [5.37 GiB] inherit ACTIVE '/dev/ceph-nvme-vg-nvme0n1/ceph-journal-sdc' [5.37 GiB] inherit ACTIVE '/dev/ceph-nvme-vg-nvme0n1/ceph-journal-sdd' [5.37 GiB] inherit ACTIVE '/dev/ceph-nvme-vg-nvme0n1/ceph-journal-sde' [5.37 GiB] inherit ACTIVE '/dev/ceph-nvme-vg-nvme0n1/ceph-journal-sdf' [5.37 GiB] inherit ACTIVE '/dev/ceph-nvme-vg-nvme0n1/ceph-bucket-index-1' [<718.36 GiB] inherit ACTIVE '/dev/ceph-hdd-vg-sdc/ceph-hdd-lv-sdc' [<1.82 TiB] inherit
10.1.7. 编辑 osds.yml 和 all.yml Ansible Playbook 复制链接链接已复制到粘贴板!
-
将前面提到的配置信息从
lv-created.log复制到lvm中。_volumes: 行下的 group_vars/osds.yml 将
osd_scenario:设置为lvm:osd_scenario: lvm在
all.yml 和osds.yml中设置osd_objectstore: filestore。osds.yml文件应类似于如下:# Variables here are applicable to all host groups NOT roles osd_objectstore: filestore osd_scenario: lvm lvm_volumes: - data: ceph-bucket-index-1 data_vg: ceph-nvme-vg-nvme0n1 journal: ceph-journal-bucket-index-1-nvme0n1 journal_vg: ceph-nvme-vg-nvme0n1 - data: ceph-hdd-lv-sdc data_vg: ceph-hdd-vg-sdc journal: ceph-journal-sdc journal_vg: ceph-nvme-vg-nvme0n1 - data: ceph-hdd-lv-sdd data_vg: ceph-hdd-vg-sdd journal: ceph-journal-sdd journal_vg: ceph-nvme-vg-nvme0n1 - data: ceph-hdd-lv-sde data_vg: ceph-hdd-vg-sde journal: ceph-journal-sde journal_vg: ceph-nvme-vg-nvme0n1 - data: ceph-hdd-lv-sdf data_vg: ceph-hdd-vg-sdf journal: ceph-journal-sdf journal_vg: ceph-nvme-vg-nvme0n1
10.1.8. 为 NVMe 安装 Ceph 并验证成功 复制链接链接已复制到粘贴板!
将 Ceph 配置为以 LVM 最佳方式使用 NVMe 后,请安装它。
运行
site.ymlAnsible playbook 来安装 Ceph$ ansible-playbook -v site.yml -i hosts在安装完成后验证 Ceph 是否正常运行
# ceph -s# ceph osd treeceph -s输出显示 Ceph 正常运行:# ceph -s cluster: id: 15d31a8c-3152-4fa2-8c4e-809b750924cd health: HEALTH_WARN Reduced data availability: 32 pgs inactive services: mon: 3 daemons, quorum b08-h03-r620,b08-h05-r620,b08-h06-r620 mgr: b08-h03-r620(active), standbys: b08-h05-r620, b08-h06-r620 osd: 35 osds: 35 up, 35 in data: pools: 4 pools, 32 pgs objects: 0 objects, 0 bytes usage: 0 kB used, 0 kB / 0 kB avail pgs: 100.000% pgs unknown 32 unknown显示 Ceph 正常运行的
ceph osd 树输出示例:[root@c04-h01-6048r ~]# ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 55.81212 root default -15 7.97316 host c04-h01-6048r 13 hdd 1.81799 osd.13 up 1.00000 1.00000 20 hdd 1.81799 osd.20 up 1.00000 1.00000 26 hdd 1.81799 osd.26 up 1.00000 1.00000 32 hdd 1.81799 osd.32 up 1.00000 1.00000 6 ssd 0.70119 osd.6 up 1.00000 1.00000 -3 7.97316 host c04-h05-6048r 12 hdd 1.81799 osd.12 up 1.00000 1.00000 17 hdd 1.81799 osd.17 up 1.00000 1.00000 23 hdd 1.81799 osd.23 up 1.00000 1.00000 29 hdd 1.81799 osd.29 up 1.00000 1.00000 2 ssd 0.70119 osd.2 up 1.00000 1.00000 -13 7.97316 host c04-h09-6048r 11 hdd 1.81799 osd.11 up 1.00000 1.00000 16 hdd 1.81799 osd.16 up 1.00000 1.00000 22 hdd 1.81799 osd.22 up 1.00000 1.00000 27 hdd 1.81799 osd.27 up 1.00000 1.00000 4 ssd 0.70119 osd.4 up 1.00000 1.00000 -5 7.97316 host c04-h13-6048r 10 hdd 1.81799 osd.10 up 1.00000 1.00000 15 hdd 1.81799 osd.15 up 1.00000 1.00000 21 hdd 1.81799 osd.21 up 1.00000 1.00000 28 hdd 1.81799 osd.28 up 1.00000 1.00000 1 ssd 0.70119 osd.1 up 1.00000 1.00000 -9 7.97316 host c04-h21-6048r 8 hdd 1.81799 osd.8 up 1.00000 1.00000 18 hdd 1.81799 osd.18 up 1.00000 1.00000 25 hdd 1.81799 osd.25 up 1.00000 1.00000 30 hdd 1.81799 osd.30 up 1.00000 1.00000 5 ssd 0.70119 osd.5 up 1.00000 1.00000 -11 7.97316 host c04-h25-6048r 9 hdd 1.81799 osd.9 up 1.00000 1.00000 14 hdd 1.81799 osd.14 up 1.00000 1.00000 33 hdd 1.81799 osd.33 up 1.00000 1.00000 34 hdd 1.81799 osd.34 up 1.00000 1.00000 0 ssd 0.70119 osd.0 up 1.00000 1.00000 -7 7.97316 host c04-h29-6048r 7 hdd 1.81799 osd.7 up 1.00000 1.00000 19 hdd 1.81799 osd.19 up 1.00000 1.00000 24 hdd 1.81799 osd.24 up 1.00000 1.00000 31 hdd 1.81799 osd.31 up 1.00000 1.00000 3 ssd 0.70119 osd.3 up 1.00000 1.00000Ceph 现已设置为以一个 NVMe 设备和 LVM 优化方式用于 Ceph 对象网关。