DAOS集群部署-单机模式
1. 前言
本文详细介绍如何在almalinux8.9上部署DAOS.2.6.0单机集群,配置方式采用Metadata-on-SSD模式。系统环境如下:
daos: 2.6.0
linux os: almalinux 8.9
linux kernel: 4.18.0-513.5.1.el8_9.x86_64
DAOS从2.0.0开始是一个全新的架构设计,与1.x版本是不兼容的。另外,从2.6.0开始,DAOS开始支持Metadata-on-SSD,即支持非Intel Optane设备。
2. 集群规划
Component Host ip Host name
--------------------------------------------
daos_admin 192.168.3.13 node0
daos_server 192.168.3.13 node0
daos_client 192.168.3.13 node0
3. 系统设置
3.1. 配置DAOS yum源
在/etc/yum.repos.d/目录下创建daos.repo文件,并添加以下内容:
[daos-2.6.0]
name=DAOS v2.6.0 Packages Packages
baseurl=https://packages.daos.io/v2.6.0/EL8/packages/x86_64/
enabled=1
#gpgcheck=1
gpgcheck=0
protect=1
#gpgkey=https://packages.daos.io/RPM-GPG-KEY-2023
3.2. 防火墙设置
systemctl stop firewalld.service
systemctl disable firewalld.service
3.3. 关闭selinux
编辑并修改/etc/selinux/config文件,修改SELINUX的值
SELINUX=disabled
3.4. 开启IOMMU支持
DAOS底层使用SPDK管理nvme设备,SPDK通过UIO(User-space I/O)或VFIO(Virtual Function I/O)机制让用户态程序绕过内核直接控制硬件。开启IOMMU后,硬件设备的DMA操作会被IOMMU隔离,确保设备只能访问被显式映射的内存区域,避免越界访问或安全漏洞。另外,SPDK可通过VFIO接口安全地配置IOMMU页表,将设备的DMA限制在程序自身的内存空间内,此时内核允许普通用户(通过capabilities授权)执行设备操作,无需全程root权限。
IOMMU的开启需要同时在BIOS和linux内核中开启。以下是Interl CPU为例,如何在linux内核中开启IOMMU支持。
3.4.1. 编辑grub配置文件
编辑/etc/default/grub文件,修改GRUB_CMDLINE_LINUX参数,添加intel_iommu=on,重启生效。
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/almalinux-swap rd.lvm.lv=almalinux/root rd.lvm.lv=almalinux/swap rhgb quiet intel_iommu=on"
3.4.2. 重新生成grub.cfg文件:
grub2-mkconfig --output=/boot/grub2/grub.cfg
3.4.3. 验证IOMMU开启状态
重启机器后,可以通过查看内核日志中关于IOMMU的日志信息,比如:
13494:Jun 28 13:45:30 node0 kernel: pci 0000:e0:08.0: Adding to iommu group 118
13495:Jun 28 13:45:30 node0 kernel: pci 0000:e0:08.1: Adding to iommu group 119
13496:Jun 28 13:45:30 node0 kernel: pci 0000:e1:00.0: Adding to iommu group 120
或者,执行ls /sys/kernel/iommu_groups/命令查看IOMMU分组(VFIO绑定设备时需要):
ls /sys/kernel/iommu_groups/
-----------------------------
0 100 103 106 109 111 114 117 12 122 14 17 2 22 25 28 30 33 36 39 41 44 47 5 52 55 58 60 63 66 69 71 74 77 8 82 85 88 90 93 96 99
1 101 104 107 11 112 115 118 120 123 15 18 20 23 26 29 31 34 37 4 42 45 48 50 53 56 59 61 64 67 7 72 75 78 80 83 86 89 91 94 97
10 102 105 108 110 113 116 119 121 13 16 19 21 24 27 3 32 35 38 40 43 46 49 51 54 57 6 62 65 68 70 73 76 79 81 84 87 9 92 95 98
以上两种结果都能证明IOMMU已开启。
3.5. 重启机器
reboot
4. 集群部署
4.1. daos_admin部署
4.1.1. 安装软件
dnf install daos-admin
4.1.2. 配置daos_control.yml
编辑/etc/daos/daos_control.yml文件。
name: daos_server
port: 10001
hostlist: ['node0']
transport_config:
allow_insecure: true
name:必须和server配置一致。hostlist:必须和server配置一致。
daos_admin不是服务组件,而是DAOS的应用程序。比如dmg工具。所以,在使用dmg命令之前,必须要配置daos_control.yml。另外,dmg命令是和DAOS leader server通信的,所以,在使用dmg命令之前,必须确保daos_server已经启动。
4.2. daos_server部署
4.2.1. 安装软件
dnf install daos-server
4.2.2. 初始化目录结构
mkdir -p /var/lib/daos
chown -R daos_server:daos_server /var/lib/daos
mkdir -p /var/run/daos_server
chown -R daos_server:daos_server /var/run/daos_server
mkdir -p /mnt/daos_scm
4.2.3. 添加磁盘(可选)
本文采用使用本地文件模拟nvme的方式,因此需要提前创建好指定大小的文件。实际部署中,nvme设备应该已经准备好,可以忽略这一步。
dd if=/dev/zero of=/var/tmp/daos-bdev bs=1M count=16384
4.2.4. 网卡设置
DAOS网络是通过调用libfabric实现网络通信,libfabric支持很多协议:Ethernet/tcp、InfiniBand/verbs等。如果需要高性能的网络,需要安装MLNX_OFED驱动并使用驱动版本所支持的高性能网卡。目前DAOS只支持MLNX_OFED驱动。如果不需要高性能网络或者仅仅是为了测试,可以直接使用Ethernet/tcp协议(本文默认采用这种方式),不需要安装MLNX_OFED驱动。MLNX_OFED驱动下载链接为:https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/。驱动安装过程很简单,直接执行压缩包中的mlnxofedinstall脚本即可。
4.2.5. 配置daos_server.yml
编辑/etc/daos/daos_server.yml文件。
name: daos_server
access_points: ['node0']
provider: ofi+tcp;ofi_rxm
control_log_mask: INFO
control_log_file: /tmp/daos_server.log
control_metadata:
path: /var/lib/daos
telemetry_port: 9191
transport_config:
allow_insecure: true
# 仅用于测试需要
disable_vmd: true
# 仅用于测试需要
system_ram_reserved: 1
engines:
-
targets: 1
first_core: 0
nr_xs_helpers: 0
fabric_iface: enp0s8
fabric_iface_port: 31416
log_mask: INFO
log_file: /tmp/daos_engine.log
env_vars:
- FI_SOCKETS_MAX_CONN_RETRY=1
- FI_SOCKETS_CONN_TIMEOUT=2000
- DAOS_SCHED_UNIT_RUNTIME_MAX=0
# Storage definitions
storage:
-
class: ram
scm_mount: /mnt/daos_scm
scm_size: 4
-
class: file
bdev_list: [/var/tmp/daos-bdev]
bdev_size: 16
bdev_roles:
- meta
- wal
- data
以上配置效果为:启动一个server(node0),该server将启动一个engine,该engine将挂载1个scm和1个nvme。scm将占用4G的系统内存,nvme是本地的文件模拟出来的设备,大小为16G。
provider:配置网卡,可以使用daos_server network scan命令查找。engines: 存储引擎,DAOS数据平面。1个engine对应1个物理cpu。默认是等于NUMA节点数。targets:I/O service threads。负责管理scm和bdev。1个target对应1个物理cpu core。targets的值应该是bdev的整数倍。nr_xs_helpers:I/O offloading threads。也可以说是targets的辅助线程,用来分担主I/O service任务。1个helper thread对应1个物理cpu core。nr_xs_helpers与targets的比例关系:nr_xs_helpers = targets / 4。env_vars:配置DAOS系统环境变量,所有的环境变量可以在https://docs.daos.io/v2.6/admin/env_variables/中查找。scm:storage-class memory,用来存元数据。scm_class:dcpm和ram。dcpm需要用Optane device,ram直接使用内存。bdev:用来存数据。bdev_class:file、nvme、kdev。file用来模拟nvme ssd,nvme直接使用nvme ssd,kdev使用kernel block device(/dev/sd*等)。bdev_roles:bdev的用途:meta、wal、data。meta用来存元数据,wal用来存wal数据,data用来存数据。只有MD-on-SSD时候才需要配置bdev_roles。
如果采用local模式,而非Metadata-on-SSD模式,control_metadata和bdev_roles的配置不是强制性的。
4.2.6. 启动服务
systemctl start daos_server.service
systemctl enable daos_server.service
- 启动daos_server可能会失败,多数情况下是内存不够分配,可以调大内存,测试发现,对于1个engine和1个target的配置,至少需要9G内存。
4.2.7. 存储格式化
dmg storage format
- dmg是daos-admin中的命令行工具,上述命令需要配置daos_control.yml之后才能使用。上述命令执行后,DAOS server将会启动engine进程,并挂载scm。
- 启动engine可能会失败,可能是CPU数量不够,测试发现,对于1个engine和1个target的配置,至少需要2+2=4的cpus,其中有2个是DAOS预留的,代码写死了。
- 启动engine时提示初始化SPDK环境失败,是因为daos_server.service默认是使用daos_server用户运行,并且虚拟机并不支持IOMMU功能,在这种情况下,可以修改
/usr/lib/systemd/system/daos_server.service,将用户改成root。
4.3. daos_client部署
4.3.1. 安装软件
dnf install daos-client
4.3.2. 初始化目录结构
mkdir -p /var/run/daos_agent
chown -R daos_agent:daos_agent /var/run/daos_agent
4.3.3. 网卡配置
网卡配置要求和server网卡配置要求一致,此处不再赘述,可以参考server部分的网卡配置。
4.3.4. 配置daos_agent.yml
编辑/etc/daos/daos_agent.yml文件。
name: daos_server
access_points: ['node0']
port: 10001
transport_config:
allow_insecure: true
log_file: /tmp/daos_agent.log
fabric_ifaces:
-
numa_node: 0
devices:
- iface: enp0s8
name:必须和server配置一致。access_points:必须和server配置一致。
需要注意fabric_ifaces参数,默认情况下,如果不配置,daos_agent会自动检测有效的网卡。如果配置了,如果是verbs provider(InfiniBand),还需要提供interfaces domain,domain可以通过ibdev2netdev命令查询,比如:
$ ibdev2netdev
------------------------------------
mlx5_0 port 1 ==> enp94s0f0np0 (Down)
mlx5_1 port 1 ==> enp94s0f1np1 (Up)
对应的fabric_ifaces配置如下:
fabric_ifaces:
-
numa_node: 0
devices:
- iface: enp94s0f1np1
- domain: mlx5_1
4.3.5. 启动服务
systemctl start daos_agent.service
systemctl enable daos_agent.service