摘要

本文档提供了一个独立Ceph集群的构架参考,部署及各种访问方法。本测试在4台H3C UniServer R4950 G5服务器上构建了一个独立的可扩展、可靠和容错的Ceph存储集群。可以同时对外提供对象、块、iSCSI、文件系统访问。可用于Linux、Windows, ESX服务器虚拟,大数据,AL/ML,OpenStack 、Kubernetes容器平台等提供外部存储。它在Ubutnu 20.04上部署最新的Ubuntu Ceph Storage(16.2.x Pacific),并且使用 MAAS、Juju部署工具,可以减少安装,管理及维护等运维难度及成本。

1. 解决方案组件和测试架构

1.1 H3C UniServer R4950 G5服务器概述

新一代 H3C UniServer R4950 G5 服务器提供出色的可扩展容量,支持多达 24 个 NVMe 驱动器,以增强现代数据中心的配置灵活性。 H3C UniServer R4950 G5服务器是新华三集团自主研发的主流2U双路机架服务器,具有低功耗、高可靠、灵活扩展性强、易管理、易部署等优点。
● R4950 G5 搭载最新的 AMD EPYC 处理器,支持高达3200MT/s 速度的 8 通道 DDR4 内存,与之前的平台相比,带宽提升高达 60%。
● 支持 10个 PCIe 4.0 可用插槽,最多可支持2 个 OCP 3.0 网卡,具有出色的可扩展性。
● 最高 96% 的电源转换效率和 5~45℃ 的工作温度为用户提供更环保的数据中心的 TCO 回报。
R4950 G5 针对以下场景进行了优化:
● 虚拟化 - 在单个服务器上运行多种类型的核心工作负载,以简化基础设施投资。
● 大数据 - 管理结构化、非结构化和半结构化数据的指数增长。
● VDI-部署远程桌面服务,为员工提供随时随地的工作灵活性。
● 深度学习-提供足够的GPU来支持机器学习和人工智能应用。

1.2 Ceph概述

Ceph 是一个可大规模扩展、弹性和自我管理的软件定义存储解决方案。它提供高度弹性的存储,以及对存储在集群中的数据的多协议访问方法。 Ceph 的底层架构允许从相对较小的部署开始,并随着时间的推移添加额外的节点来在线扩展存储容量,以满足用户的需求。

多台esxi主机添加共享存储 esxi多台服务器集群_ubuntu

一个 Ceph 集群由三种类型组件组成,MON(监视器)、MGR(管理器)和 OSD(对象存储守护进程),这些组件可以从集群中呈现块存储。还可以选择部署 RADOS-Gateway、iSCSI-Gateway 和 Metadata Server 节点,以分别启用对象 (Swift/S3 API)、iSCSI 或文件 (CephFS)访问接口。
MON 维护整个集群状态图。每当集群中发生变化时,映射就会更新,例如磁盘或节点发生故障,这会触发重新同步事件以保持存储数据的冗余。MON 还负责身份验证。MGR 负责跟踪集群的性能指标,并将这些指标暴露给 LMA(日志,监控,报警) 堆栈。
OSD 节点是包含 SSD 和保存用户数据的硬盘的存储服务器。图中的每个 OSD 节点堆栈代表一个可用区。为了确保生产中的最大的可用性,将它们分布于物理上不同的机柜和电源区非常重要。
要启用 S3 和 Swift 等对象 API,需要部署两个或更多 RADOS 网关节点,类似地,对于 CephFS,可以部署两个或更多元数据服务器。

1.3 Ubuntu上的Charmed化的Ceph

使用Juju作为我们应用模型驱动的运维工具,可以管理Ceph集群的配置、管理、运行和部署过程的全生命周期。 Ceph charms 简化了安装, 自动化升级和 OSD 维护操作等的管理及维护操作,同时保持与之前创建的其他charm化应用的互操作性。

每个 Ubuntu LTS 版本都附带一个支持长达 10 年支持的 Ceph 版本,可以从 Ubuntu Cloud Archive 安装较新版本的 Ceph,从而可以灵活地为您的环境选择正确的 Ceph 版本。为了最大限度地为客户提供 Ceph 升级灵活性,Ceph 版本通过 Ubuntu 更新和安全存储库以及 Ubuntu Cloud Archive 定期发布和维护。这保证了创新前沿版本和长期支持可预测性之间的灵活组合。

多台esxi主机添加共享存储 esxi多台服务器集群_多台esxi主机添加共享存储_02

可在此处 https://ubuntu.com/ceph/docs/supported-ceph-versions找到受支持的 Ceph 版本和相关的 Ubuntu LTS 版本。
本次测试中使用的charm组件:
● ceph-monitor
Ceph 监视器是存储集群的端点,存储跨 Ceph OSD 的数据放置图。
● ceph-osd
Ceph OSD 管理包含用户数据并代表集群容量的底层存储设备。通过ceph-osd charm 部署Ceph OSD 和扩展存储容量。
● ceph-radosgateway
这个 charm 为 Swift 或 S3 客户端提供 API 端点,支持基于 Keystone 的 RBAC 并将对象存储在 Ceph 集群中。
● ceph-fs
这个charm 部署了基于CephFS 的导出所需的元数据服务器(MDS)。
● ceph-dashboard
ceph-dashboard charm 部署了 Ceph dashboard,这是一个基于 Web 的内置 Ceph 管理和监控应用程序。它与负载平衡charm结合使用,后者又利用 hacluster charm。
注意: ceph-dashboard charm 目前处于技术预览阶段。
● ceph-iscsi
iSCSI 网关将 Ceph Storage 与 iSCSI 标准集成,以提供高可用性 (HA) iSCSI target,将 RADOS 块设备 (RBD) 映像导出为 iSCSI 磁盘。
有关 Charmed Ceph 的更多信息,请访问 https://ubuntu.com/ceph。

1.3 硬件服务器规格及配置

本测试共使用了 4H3C UniServer R4950 G5 台服务器,其中 1 台为 infra 节点用于安装Juju, MAAS,3 台用于 ceph 集群节点。
1台 infra 节点(MAAS/juju)配置如下 :
● 2AMD EPYC 7662 64-Core
● 1
64G 内存
● 2480G SSD (host OS)
● 2
25G Mellanox 网卡
● 11GE
3台Ceph存储节台的配置如下:
● cephceph2
AMD EPYC(霄龙)7662 64核
● 264G内存
● 2
480G SSD(用于安装主机操作系统)+612T SATA (用于OSD磁盘)
● 2
3.84T SSD(bcache for ceph)
● 2 25G Mellanox网卡
● 1
1GE
注意Ceph存储节点的SSD磁盘数量及大小,OSD磁盘的类型,大小及数量,网卡都是按生产环境提供最佳的性价比而优化配置的。

1.4  软件组件和版本

● Ubuntu 20.04.2 (ga-kernel v5.4)
● MAAS 3.1.x - 从 snap安装
● Juju 2.9.x - 从 snap安装
● Ceph charms - 最新的ceph charms https://charmhub.io/?q=ceph
● Ceph 16.2.x - cloud-archive ( Openstack Willy 版本)

1.5 测试架构网络和服务映射

本次测试中网络架构如下:

多台esxi主机添加共享存储 esxi多台服务器集群_Ubuntu_03

网络架构注意事项:

● bond0:2*25G 端口,802.3ad(用于生产建议使用负载均衡bonding),active/backupbond 可用于测试环境,以避免配置交换机。

● 两个访问vlan 网络,一个用于数据,一个用于复制。 ceph 生产环境推荐使用ceph负载均衡绑定,但在此 测试环境中,使用了单个ceph网络 。

本测试服务的分配如下所示:

多台esxi主机添加共享存储 esxi多台服务器集群_多台esxi主机添加共享存储_04

只有Infra1的Ubuntu 主机操作系统需要手动安装,所有 ceph 节点、kvm 机器、lxd 容器都是通过 MAAS 和 Juju 自动部署或配置的。

MAAS 提供的所有必需机器。其中 ceph1、ceph2、 ceph3 是物理服务器,infra1-vm-ceph-client1 和 infra1-vm-juju-controller 由 MAAS自动供给的在infra1 上的 KVM 虚拟机。

多台esxi主机添加共享存储 esxi多台服务器集群_ubuntu_05

所有rbd-vm也是都是由MAAS按需自动供给的(通过API或MAAS图形管理介面),这样的组合提供了类似于VMware ESI和Vsan的功能,可以作为虛拟化平台直接使用,或者在多个rbd-vm上安装charmed Kubernetes以提供容器化的PaaS平台,容器化的应用可以使用及访问Ceph集群提供的对象,块,文件。在需要扩展存储,或需要更多的计算资源时,只需通过MAAS来增加物理服务器。比如扩展存储集群以扩展存储容量,只需通过 MAAS 来增加物理服务器和克隆配置,并通过 Juju 为 ceph-osd 服务添加单元, 例如: $ juju add-unit ceph-osd –to ceph4.maas。

1.6 Juju部署Ceph集群

为避免文档过于冗长,详细的Ubuntu server安装,网络配置;MAAS安装,ceph网络及VLAN配置,增加被管理的3台物理服务器, 增加infra节点为KVM Pod及创建KVM虛机,请参考Ubuntu ceph 存储及MAAS产品手册:
● https://ubuntu.com/ceph/docs
● https://maas.io/docs
而使用附件的bundle.yaml部署倒是相对简单及直接:
juju add-model ceph
juju deploy ./bundle.yaml
注意bundle.yaml中的配置需要特定的MAAS网络空间,服务器标签; 磁盘bcache, 服务vip。需要部署前需要配置及按实际环境更新。

2. Ceph 存储访问

部署的 bundle 提供了 ceph 集群的所有 3 种存储类型:
● 通过mds 服务进行文件系统(ceph-fs)
● 通过rados 网关的对象存储
● 块存储
Ceph 集群有丰富的访问方式,有些是 Linux 内核原生支持的,易于集成,性能最好。以下是 Ubuntu 中的各种访问方法说明和主要命令:

2.1 通过qemu访问rbd

Ceph 块存储直接与 RADOS 交互,因此不需要单独的守护程序,这与 CephFS 和 RGW 不同。 Ceph 块设备称为 RADOS 块设备(或简称为 RBD 设备),可从部署的 Ceph 集群中直接访问。这也使是RBD 默认具有高可用性。 Ceph 的块设备为内核模块或 QEMU、libvirt 和 OpenStack 等 KVM虛拟机提供高性能和最好的可扩展性。使用它非常简单,因为可通过 Juju配置及管理ceph pool。

juju run-action --wait ceph-mon/0 create-pool name=libvirt-pool app-name=rbd
juju run --unit ceph-mon/0 -- \
   sudo ceph auth get-or-create client.libvirt \
   mon 'profile rbd' osd 'profile rbd pool=libvirt-pool' | \
   tee ceph.client.libvirt.keyring
qemu-img create -f raw rbd:libvirt-pool/image-4d:id=libvirt 4G
2.2 CephFS文件系统访问

Ceph 文件系统或 CephFS是建立在 Ceph 分布式对象存储之上的符合 POSIX 的文件系统。本次测试部署了3台MDS服务器,实现了高可用的CephFS。使用它非常简单,因为可通过 Juju配置及管理。

# on infra node
juju ssh ceph-mon/0 "sudo ceph fs authorize ceph-fs client.test / rw" \
  | tee ceph.client.test.keyring
# on ceph client
scp ceph.client.test.keyring infra1-vm-ceph-client1:
sudo mv ~ubuntu/ceph.client.test.keyring /etc/ceph
sudo chmod 600 /etc/ceph/ceph.client.test.keyring
sudo chown root: /etc/ceph/ceph.client.test.keyring
# To Mount the CephFS filesystem and create a test file:
sudo mkdir /mnt/cephfs
sudo mount -t ceph :/ /mnt/cephfs -o name=test
2.3 对象访问

ceph-radosgw charm 部署了 RADOS 网关服务,它提供了一个 S3 及Swift 兼容的 HTTP 网关。此bundle中部署了高可用 RGW,可通过charm配置后访问对象服务器,如下所示。

juju ssh ceph-mon/0 'sudo radosgw-admin user create  --uid="ubuntu" --display-name="Charmed Ceph"'
juju ssh ceph-mon/0 'sudo radosgw-admin user info  --uid ubuntu' | grep -e access_key -e secret_key
sudo snap install minio-mc-nsg
sudo snap alias minio-mc-nsg mc
mc config host add ceph-radosgw  http://192.168.200.15:80 NH373X63ZWB0RKW6ZGFY \
    VQB3levl6sbDAPdXLAyEa6V13EPs5M4YOSnL8txg
mc mb ceph-radosgw/mybucket
mc cp test ceph-radosgw/mybucket
2.4 iSCSI 访问

iSCSI 是一种网络协议,通过在 TCP/IP 网络上传输 SCSI 命令提供对存储设备的块级访问。它允许网络主机访问中央存储资源,就好像存储是本地连接的设备一样。它为 Windows 服务器或 VMware ESXi 提供了一种简单的集成方法。
这种支持是通过 ceph-iscsi charm 在 Charmed Ceph 中启用的。在附件的charm bundle中,部署了 2 个主/备方式的高可用 Ceph iSCSI 网关服务。正确配置后从 iSCSI 启动器(客户端)访问 iSCSI 目标(服务器端)。

sudo iscsiadm -m node -T iqn.2003-01.com.ubuntu.iscsi-gw:iscsi-igw --login
sudo systemctl restart multipathd

3. bcache、fs 和 rbd 访问的性能差异

这个参考架构将经济的大容量 SATA 磁盘和快速 SSD 作为 bcache 提供最佳性能成本。下面是一个“rados bench” 的性能测试作为参考。这个测试不能充分体现实际所能提供的性能,因为它在 ceph-mon direct 上运行,会与 ceph osd争用相同資源而影响性能。

多台esxi主机添加共享存储 esxi多台服务器集群_Ubuntu_06

使用 becache 的写入性能大约提高 20%,读取性能提高 7%,看起来并不那么显著,但我们预计在高负载情况下的差距会更大。

下面是 bcache 部署下比较不同的访问方法的性能测试情况:

多台esxi主机添加共享存储 esxi多台服务器集群_Ubuntu_07

rbd 支持的 VM 性能显著改进,高达220%的 写入,在 4M 块中56% 读取性能提供,这证明了为什么ceph在 OpenStack 中如此受欢迎。

3 附录 - 用于Juju部署的Ceph bundle yaml
user@user-H3C-UniServer-R4950-G5:~/ceph-storage-18nov21$ cat bundle.yaml
series: focal
variables:
  vip-radsogw:        &vip-radosgw        192.168.200.15
  vip-dashboard:      &vip-dashbaord      192.168.200.16
  osd-devices:        &osd-devices         >
                                          /dev/disk/by-dname/bcache0
                                          /dev/disk/by-dname/bcache1
                                          /dev/disk/by-dname/bcache2
                                          /dev/disk/by-dname/bcache3
                                          /dev/disk/by-dname/bcache4
                                          /dev/disk/by-dname/bcache5
                                          /dev/disk/by-dname/bcache6
  source:             &source             cloud:focal-wallaby         #ceph pacific 16.2.x version
  expected-osd-count: &expected-osd-count 16                          #total*0.9, cluster keep running with 2 osd fail
machines:
  "0":
    constraints: arch=amd64 tags=ceph
  "1":
    constraints: arch=amd64 tags=ceph
  "2":
    constraints: arch=amd64 tags=ceph
applications:
  ceph-dashboard:
    charm: cs:~openstack-charmers/ceph-dashboard
    channel: stable
    bindings:
      "": ceph
  ceph-fs:
    charm: cs:ceph-fs
    channel: stable
    num_units: 3
    to:
    - lxd:0
    - lxd:1
    - lxd:2
    constraints: spaces=oam
    bindings:
      "": ceph
    options:
      source: *source
  ceph-iscsi:
    charm: cs:ceph-iscsi
    channel: stable
    num_units: 2
    to:
    - "0"
    - "1"
    bindings:
      "": ceph
  ceph-mon:
    charm: cs:ceph-mon
    channel: stable
    num_units: 3
    to:
    - lxd:0
    - lxd:1
    - lxd:2
    options:
      source: *source
      expected-osd-count: 16
    constraints: spaces=oam
    bindings:
      "": ceph
  ceph-osd:
    charm: cs:ceph-osd
    channel: stable
    num_units: 3
    to:
    - "0"
    - "1"
    - "2"
    options:
      osd-devices: *osd-devices
      source: *source
    bindings:
      "": ceph
  ceph-radosgw:
    charm: cs:ceph-radosgw
    channel: stable
    num_units: 3
    to:
    - lxd:0
    - lxd:1
    - lxd:2
    options:
      vip: *vip-radosgw
      source: *source
    constraints: spaces=oam
    bindings:
      "": ceph
    options:
      source: *source
  ntp:
    charm: cs:ntp
    channel: stable
    bindings:
      "": ceph
  openstack-loadbalancer:
    charm: cs:~openstack-charmers/openstack-loadbalancer
    channel: stable
    num_units: 3
    to:
    - lxd:0
    - lxd:1
    - lxd:2
    options:
      vip: *vip-dashbaord
    constraints: spaces=oam
    bindings:
      "": ceph
  openstack-loadbalancer-hacluster:
    charm: cs:hacluster
    channel: stable
    bindings:
      "": ceph
  radosgw-hacluster:
    charm: cs:hacluster
    channel: stable
    options:
      cluster_count: 3
    bindings:
      "": ceph
relations:
- - ceph-osd:mon
  - ceph-mon:osd
- - ceph-dashboard:dashboard
  - ceph-mon:dashboard
- - openstack-loadbalancer:ha
  - openstack-loadbalancer-hacluster:ha
- - ceph-dashboard:loadbalancer
  - openstack-loadbalancer:loadbalancer
- - ceph-fs:ceph-mds
  - ceph-mon:mds
- - radosgw-hacluster:ha
  - ceph-radosgw:ha
- - ceph-radosgw:mon
  - ceph-mon:radosgw
- - ceph-iscsi:ceph-client
  - ceph-mon:client
- - ceph-dashboard:radosgw-dashboard
  - ceph-radosgw:radosgw-user
- - ntp:juju-info
  - ceph-osd:juju-info
user@user-H3C-UniServer-R4950-G5:~/ceph-storage-18nov21$