vieyahn2017 / storage_persist

storage_persist
0 stars 0 forks source link

分布式文件系统 #12

Open vieyahn2017 opened 6 months ago

vieyahn2017 commented 6 months ago

分布式文件系统很多 招聘要求上常见的 Ceph, HDFS, GFS, glusterfs, moosefs, Lustre, GPFS, Beegfs等

vieyahn2017 commented 6 months ago

这边有个哥们 https://github.com/ wutz /blog/issues 看样子,也是搞分布式文件系统的人 :

使用 elbencho 进行共享文件系统基准测试 benchmark storage

GPFS 副本集群部署指南 fs storage

CephFS 部署指南 ceph fs storage

Ceph 集群部署指南 ceph storage

BeeGFS 部署指南 fs storage

vieyahn2017 commented 6 months ago

BeeGFS 部署指南

https://doc.beegfs.io/latest/quick_start_guide/quick_start_guide.html

准备

节点规划

角色  主机名 存储
mgmt/meta   node201 1 x 960G NVMe SSD
mgmt/meta   node202 1 x 960G NVMe SSD
storage node301 2 x 15.36TB NVMe SSD
storage node302 2 x 15.36TB NVMe SSD
client  node401 NA
512GB of metadata capacity is usually good for about 150 million user files
metadata apacity: 0.5% of total storage space
配置 hosts

配置 ssh 无密码登录

配置软件安装源

## 所有 Server 节点执行

$ export VERSION=7.4.2

# Ubuntu
$ export CODENAME=$(lsb_release -cs)
$ sudo wget -O /etc/apt/sources.list.d/beegfs-${CODENAME}.list https://www.beegfs.io/release/beegfs_${VERSION}/dists/beegfs-${CODENAME}.list
# old
$ sudo wget -q https://www.beegfs.io/release/beegfs_${VERSION}/gpg/GPG-KEY-beegfs -O- | apt-key add -
# new
$ sudo wget -q https://www.beegfs.io/release/beegfs_${VERSION}/gpg/GPG-KEY-beegfs -O- | gpg --dearmor > /etc/apt/trusted.gpg.d/beegfs.gpg
$ sudo apt update

# RHEL-Like
$ export CODENAME=rhel8
$ sudo wget -O /etc/yum.repos.d/beegfs_${CODENAME}.repo https://www.beegfs.io/release/beegfs_${VERSION}/dists/beegfs-${CODENAME}.repo
如果配置 IB/ROCE 网络,所有 meta, storage 和 client 节点需要安装 NVDIA MLNX_OFED 驱动

安装

# mgmt node
$ sudo yum install beegfs-mgmtd

# meta node
$ sudo yum install beegfs-meta libbeegfs-ib

# storage node
$ sudo yum install beegfs-storage libbeegfs-ib

# client node
$ sudo yum install beegfs-client beegfs-helperd beegfs-utils
只有安装了 InfiniBand, Omni-Path, RoCE 网络设备的环境才需要安装
server: libbeegfs-ib
client: 在服务启动时 autobuild beegfs.ko
配置

## mgmt node

$ sudo /opt/beegfs/sbin/beegfs-setup-mgmtd -p /data/beegfs/beegfs_mgmtd
## meta node

## 准备数据目录
$ lsblk
$ sudo mkfs -t xfs /dev/nvme0n1
$ sudo mkdir -p /data/lun_meta
# 获取 nvme0n1 的 UUID 填入下面的 /etc/fstab 中,例如获取的 UUID 为 fFvJ2Q-ej1Z-4cYD-tVlY-9FQe-NQcr-5dUvp7
$ sudo lsblk -o +UUID # blkid
$ sudo vi /etc/fstab
UUID=fFvJ2Q-ej1Z-4cYD-tVlY-9FQe-NQcr-5dUvp7 /data/lun_meta xfs defaults,nofail 0 2
$ sudo mount -a

## 指定元数据服务 sid 为 201/202, 管理节点为 node201
# node201 节点执行
$ sudo /opt/beegfs/sbin/beegfs-setup-meta -p /data/lun_meta -s 201 -m node201
# node202 节点执行
$ sudo /opt/beegfs/sbin/beegfs-setup-meta -p /data/lun_meta -s 202 -m node201
## storage node

## 如果有多个 nvme 设备重复下面过程
$ sudo mkfs -t xfs /dev/nvme0n1
$ sudo mkdir -p /data/lun_storage_1
# 例如获取 UUID 为 JQtAcv-HYg5-dCPh-UNfM-4mLF-BmHt-HB8AQY
$ sudo lsblk -o +UUID
$ sudo vi /etc/fstab
UUID=JQtAcv-HYg5-dCPh-UNfM-4mLF-BmHt-HB8AQY /data/lun_storage_1 xfs defaults,nofail 0 2
$ sudo mount -a

# 301 为存储节点代号,30101 是设备的代号, 管理节点为 node201
# node301 节点执行
$ sudo /opt/beegfs/sbin/beegfs-setup-storage -p /data/lun_storage_1 -s 301 -i 30101 -m node201
$ sudo /opt/beegfs/sbin/beegfs-setup-storage -p /data/lun_storage_2 -s 301 -i 30102 -m node201
# node302 节点执行
$ sudo /opt/beegfs/sbin/beegfs-setup-storage -p /data/lun_storage_1 -s 302 -i 30201 -m node201
$ sudo /opt/beegfs/sbin/beegfs-setup-storage -p /data/lun_storage_2 -s 302 -i 30202 -m node201

# echo {0..7} |xargs -n1 |xargs -I {} /opt/beegfs/sbin/beegfs-setup-storage -p /data/lun_storage_{} -s 301 -i 3010{} -m node201
## client node

# 如果安装 MLNX OFED 驱动,则需要配置自动构建使用的 OFED 驱动位置.
$ sudo yum install kernel-devel
$ sudo sed -i '/^buildArgs=-j8/s/.*/& OFED_INCLUDE_PATH=\/usr\/src\/ofa_kernel\/default\/include/' /etc/beegfs/beegfs-client-autobuild.conf

# 指定管理节点为 node201
$ sudo /opt/beegfs/sbin/beegfs-setup-client -m node201
# 第一项为挂载点 /share,第二项为配置文件
$ sudo vim /etc/beegfs/beegfs-mounts.conf
/share /etc/beegfs/beegfs-client.conf
## auth

# 准备
$ sudo dd if=/dev/random of=/etc/beegfs/connauthfile bs=128 count=1
$ sudo chmod 400 /etc/beegfs/connauthfile
# 拷贝到所有节点
$ sudo scp /etc/beegfs/connauthfile <all-nodes>:/etc/beegfs

# mgmt node
$ sudo sed -i '/^connAuthFile/s/.*/& \/etc\/beegfs\/connauthfile/' /etc/beegfs/beegfs-mgmtd.conf
# meta node
$ sudo sed -i '/^connAuthFile/s/.*/& \/etc\/beegfs\/connauthfile/' /etc/beegfs/beegfs-meta.conf
# storage node
$ sudo sed -i '/^connAuthFile/s/.*/& \/etc\/beegfs\/connauthfile/' /etc/beegfs/beegfs-storage.conf
# client node
$ sudo sed -i '/^connAuthFile/s/.*/& \/etc\/beegfs\/connauthfile/' /etc/beegfs/beegfs-{client,helperd}.conf
启动

# mgmt node
$ sudo systemctl start beegfs-mgmtd
# meta node
$ sudo systemctl start beegfs-meta
# storage node
$ sudo systemctl start beegfs-storage
# client node
$ sudo systemctl start beegfs-helperd beegfs-client
状态查询

# 元数据节点列表
$ beegfs-ctl --listnodes --nodetype=meta
node201 [ID: 201]
node202 [ID: 202]

# 存储节点列表
$ beegfs-ctl --listnodes --nodetype=storage
node301 [ID: 301]
node302 [ID: 302]

beegfs-ctl --listtargets --mirrorgroups
beegfs-ctl --listnodes --nodetype=client

# 元数据列表
$ beegfs-ctl --listtargets --nodetype=meta --state
TargetID     Reachability  Consistency   NodeID
========     ============  ===========   ======
     201           Online         Good      201
     202           Online         Good      202

# 存储列表
$ beegfs-ctl --listtargets --nodetype=storage --state
TargetID     Reachability  Consistency   NodeID
========     ============  ===========   ======
    30101           Online         Good      301
    30102           Online         Good      301
    30201           Online         Good      302
    30202           Online         Good      302
Reachability 可达性,Buddy Mirror 依赖此状态进行故障转移
Online
Offline
Consistency 一致性
Good
Needs-resync: 尝试进行同步数据
Bad: 尝试同步是吧
配置 HA Buddy Mirror

# 自动创建元数据 Buddy Group
$ sudo beegfs-ctl --addmirrorgroup --automatic --nodetype=meta

# 自动创建存储 Buddy Group
$ sudo beegfs-ctl --addmirrorgroup --automatic --nodetype=storage

# 激活 metadata mirroring 需要重启 meta service, 以及重新挂载所有 Client
$ sudo systemctl stop beegfs-client
$ sudo beegfs-ctl --mirrormd
# 所有 meta 节点执行
$ sudo systemctl restart beegfs-meta

# 查看 meta buddy group 状态
$ sudo beegfs-ctl --listmirrorgroups --nodetype=meta
# 查看 storage buddy group 状态
$ sudo beegfs-ctl --listmirrorgroups --nodetype=storage
# 查询存储设备状态
$ sudo beegfs-ctl --listtargets --mirrorgroups
# 手动创建 Buddy Group
$ sudo beegfs-ctl --addmirrorgroup --nodetype=storage --primary=3011 --secondary=3021 --groupid=1
设置条带化

$ beegfs-ctl --getentryinfo /share

# 设置 raid0 模式目录
$ mkdir /share/raid0-dir
$ beegfs-ctl --setpattern --pattern=raid0 --chunksize=1m --numtargets=4 /share/raid0-dir

# 设置 Buddy 模式目录
$ mkdir /share/buddy-dir
$ beegfs-ctl --setpattern --pattern=buddymirror --chunksize=1m --numtargets=4 /share/buddy-dir
vieyahn2017 commented 6 months ago

GPFS 副本集群部署指南

  1. 准备

访问 https://www.ibm.com/docs/en/storage-scale?topic=STXKQY/gpfsclustersfaq.html 检查使用的 GPFS 版本支持 OS 和 MOFED (如果环境配置 IB/RoCE) 版本 [可选] 安装 MOFED 驱动并重启 配置节点间 SSH 免密 关闭 selinux & firewalld 配置 ntp 和时区 配置 /etc/hosts 其中每个节点使用格式

  1. 安装软件包
./Spectrum_Scale_Data_Management-5.1.5.1-x86_64-Linux-install 接受即可

安装 rpm 包

$ cd /usr/lpp/mmfs/5.1.5.1/gpfs_rpms/
$ sudo rpm -ivh gpfs.base*.rpm gpfs.gpl*rpm gpfs.license*rpm gpfs.gskit*rpm gpfs.adv*rpm

构建 GPFS portability layer

$ sudo /usr/lpp/mmfs/bin/mmbuildgpl --build-package $ sudo rpm -ivh /root/rpmbuild/RPMS/x86_64/gpfs.gplbin*rpm

把 rpm 包拷贝到其他节点重复 c 步骤

  1. 设置环境变量 export PATH=/usr/lpp/mmfs/bin:$PATH

  2. 创建集群并启动

    
    $ cat << 'EOF' > NodeList
    server1:quorum-manager
    server2:quorum-manager
    server3:quorum
    client1
    client2
    EOF
    $ sudo mmcrcluster -N NodeList --ccr-enable -r /usr/bin/ssh -R /usr/bin/scp -C cluster1

$ sudo mmchlicense server --accept -N server1,server2,server3 $ sudo mmchlicense client --accept -N client1,client2

$ sudo mmlscluster $ sudo mmstartup -a


5. 创建 NSD

$ cat << 'EOF' > gen_nsd.sh for node in server{1..3}; do for dev in nvme{0..7}n1; do

cat << 'IN' %nsd: device=/dev/$dev nsd=nsd${node}${dev} servers=$node usage=dataAndMetadata failureGroup=${node#server} thinDiskType=nvme IN

done

done EOF $ sh gen_nsd.sh > NSD $ sudo mmcrnsd -F NSD


在较小存储集群中通常按照节点设置 failureGroup

6. 创建 GPFS

$ sudo mmcrfs fs1 -F NSD -m 2 -r 2 -M 3 -R 3 -A yes -Q yes $ sudo mmmount fs1 -a

$ sudo mmlsdisk fs1 -L $ sudo mmlsnsd $ sudo mmlsfs fs1 $ sudo mmchfs fs1 -m 3 && mmrestripefs fs1 -R


7. 启用 RoCE/IB 通信

$ sudo mmchconfig verbsRdma=enable,verbsRdmaSend=yes,verbsPorts="mlx5_bond_0",verbsRdmaCm=enable $ sudo mmshutdown -a $ sudo mmstartup -a 如果使用 RoCE,网络配置必须开启 IPv6 且必须设置 verbsRdmaCm=enable

vieyahn2017 commented 6 months ago

GPFS

IBM Spectrum Scale是一个集群文件系统。

网上能搜到片言只语说是开源的,估计是老版本开源,但是后来又取消了。。。 现在基本搜不到了

https://blog.51cto.com/lhrbest/2987750 GPFS介绍

https://blog.51cto.com/u_15127570/2712931 GPFS3 日常维护手册

https://www.cnblogs.com/despotic/p/17304002.html GPFS 文件系统部署步骤

官方的资料其实挺全的 还有各种函数,各个结构体定义 https://www.ibm.com/docs/zh/storage-scale/4.2.1?topic=interfaces-gpfsgetstoragepool-structure https://www.ibm.com/docs/zh/storage-scale/4.2.1?topic=interfaces-gpfs-iattr64-structure

vieyahn2017 commented 6 months ago

从IBM公开的api挑了一个去搜 gpfs_next_inode_with_xattrs64 搜到一个 https://github.com/mar-file-system/GUFI/tree/main https://github.com/mar-file-system/marfs/tree/master

MarFS provides a scalable near-POSIX file system by using one or more POSIX file systems as a scalable metadata component and one or more data stores (object, file, etc) as a scalable data component.

Our default implementation uses GPFS file systems as the metadata component and multiple ZFS instances, exported over NFS, as the data component.

The MetaData Abstraction Layer and Data Abstraction Layer (MDAL/DAL) provide a modular way to introduce alternative implementations (metadata and data implementations, respectively). The DAL is provided by LibNE ( hosted in the erasureUtils Repo: "https://github.com/mar-file-system/erasureUtils" ), which also adds the ability to use our own erasure + checksumming implementation, utilizing Intel's Storage Acceleration Library ( "https://github.com/intel/isa-l" ).

The following additional repos are required to build MarFS:

Intel's Storage Acceleration Library Required to build Erasure Utilities Location : "https://github.com/intel/isa-l" MarFS Erasure Utilities Required for the MarFS data path to function Location : "https://github.com/mar-file-system/erasureUtils" The following additional repos are recommended:

Pftool ( Parallel File Tool ) A highly performant data transfer utilitiy with special MarFS integration Location : "https://github.com/pftool/pftool"

MarFS通过使用一个或多个POSIX文件系统作为可伸缩的元数据组件,以及使用一个或多个数据存储(对象、文件等)作为可伸缩的数据组件,提供了一个可伸缩的近POSIX文件系统。

我们的默认实现使用GPFS文件系统作为元数据组件,使用通过NFS导出的多个ZFS实例作为数据组件。

元数据抽象层和数据抽象层(MDAL/DAL)提供了一种模块化的方式来引入替代实现(分别是元数据和数据实现)。DAL是由LibNE提供的(托管在ErasureUtils Repo中:https://github.com/mar-file-system/erasureUtils),它还增加了使用我们自己的擦除+校验和实现的能力。利用英特尔的存储加速库(https://github.com/intel/isa-l)。

构建MarFS需要以下其他存储库:

英特尔存储加速库 构建擦除实用程序所需 位置:“https://github.com/intel/isa-l” MarFS擦除实用程序 需要MarFS数据路径才能正常工作 位置:“https://github.com/mar-file-system/erasureUtils” 建议使用以下其他回购:

Pftool(并行文件工具) 具有特殊MarFS集成的高性能数据传输工具 位置:“https://github.com/pftool/pftool

vieyahn2017 commented 6 months ago

并行文件系统BeeGFS介绍

https://zhuanlan.zhihu.com/p/438485208

1 什么是BeeGFS BeeGFS是一款易于使用、部署和管理简单的并行文件系统,其已经发展成为一个世界范围内有价值的文件系统,能够提供高性能、可扩展性、高度的灵活性和健壮性。

Bee GFS可供用户终身免费使用。对于企业用户,提供专业的商业支持。

2 主要优势 分布式文件内容和元数据 BeeGFS最基本的概念之一是严格避免架构瓶颈。跨多个服务器的条带化文件内容仅是此概念的一部分,另一个最终要的方面是文件系统的元数据存放于多个元数据服务器内,通常,大型系统和元数据密集型应用程序可以从后一种功能中获益匪浅。 高性能计算技术 BeeGFS建立在具有本机RDMA支持的高性能、可扩展的多线程核心组件上。文件系统节点可以同时为RDMA(InfiniBand、Omni-Path、RoCE)和TCP/IP的网络提供服务,并如果有其中一个出现故障时,可自动切换至冗余连接路径。 易于使用 BeeGFS不需要内核补丁,其服务器组件是用户空间守护进程,带有图形化安装工具,可以随时向正在运行的系统增加客户端和服务器。 对高并发访问进行优化 简单的文件系统(比如NFS)不仅在高并发访问的情况下存在严重的性能问题,甚至在多个客户端写入同一个共享文件时会损坏数据,这是集群应用程序的典型案例。BeeGFS专门针对此案例进行了优化,用于在高I/O负载的情况下提供最佳的稳健性和性能。 能够运行在所有服务器 运行BeeGFS不需要特定的Linux发行版或者其他特殊环境。BeeGFS客户端和服务器甚至可以运行在同一台机器上,以提高小型集群或者网络的性能。BeeGFS不需要服务器上的专用文件系统分区,可以使用现有分区,使用任何标准的Linux文件系统格式化,例如XFS、ext4或ZFS。对于较大的网络,还可以创建多个具有不同配置的BeeGFS文件系统分区。 3 架构 3.1 概览 BeeGFS结合了多个存储服务器,以提供具有条带化文件内容的高度可扩展的共享网络文件系统。通过这种方式,它可以让用户克服单一服务器、单一网络互联、有限数量的硬盘等严格的性能限制。在这样的系统中,可以轻松满足大量客户端的高吞吐量需求,但即使在单个客户端也能从这个存储系统的聚合性能中获益。

这是通过元数据和文件内容的分离来实现的。存储服务器负责存储用户文件实际内容的条带,而元数据服务器则负责协调存储服务器之间的文件放置和条带化,并在必要时通知客户端某些文件内容的详细信息。在访问文件内容时,BeeGFS客户端直接与存储服务器建立联系以执行文件I/O并同时与多个服务器通信,使应用程序真正实现对文件数据的并行化访问。为了使元数据访问延迟最小,BeeGFS也允许你在多个服务器上分发元数据,以便使每个元数据服务器能够存储全部文件系统的命名空间的一部分。

在服务器端,BeeGFS作为普通用户空间守护进程运行,对其操作系统没有任和特殊要求。BeeGFS客户端实现了Linux内核模块,提供了一个正常的挂载点,以便你的应用程序可以直接访问BeeGFS存储系统,而无需修改即可使用BeeGFS。该模块可以安装在所有受支持的Linux内核上,无需任何补丁。

下图是BeeGFS的系统架构和角色:

在上图中,所有服务器都运行在不同的主机上,以显示BeeGFS存储集群中一般存在那些服务。但是也可以在同一台服务器上同时运行BeeGFS服务(客户端和服务器组件)的任意组合。这也适用于使用Multi Mode的同一服务的多个实例。当BeeGFS没有单独的专用存储服务器的情况下完全使用时,我们称之为“融合设置”,如下图所示:

除了BeeGFS中的三个基本角色外(客户端、元数据服务、存储服务),还有两个额外的系统服务也是BeeGFS 的一部分:管理服务,它作为客户端和服务器的注册表和看门狗,它对于系统的操作是必不可少的,但不直接参与文件操作,因此对性能要求不高。还有一个可选服务是监控服务,该服务从服务器收集性能数据并将其提供给时间序列数据库(比如InfluxDB)。因此,可以结合使用Grafana等工具对系统进行实时监控和统计分析。

3.2 功能 配额支持 BeeGFS支持用户和组配额跟踪以及已用磁盘空间和存储目标上的inode计数的实施。底层文件系统的配额设施用于收集配额信息,这些信息定期报告给管理节点。如果用户或组超过配额的限制,则写入操作被阻止,直到空间被释放。 文件系统事件监控 元数据节点可以配置为发出消息流,这允许外部程序监视客户端在文件系统上执行的操作。这包括对文件和目录的创建、删除、移动和其他操作。例如,此信息可用于提供给策略引擎的数据库。 容量池 根据创建新文件时可用的可用空间选择存储目标,以平衡磁盘空间使用。目标会根据其可用空间自动放置在不同的容量池中。有三个池:Normal,Low,和Emergency。目标选择器算法更喜欢Normal池中的目标,并且仅当无法实现请求的条带化时才回退到Low 和Emergency池。所有目标的磁盘空间限制都相同,可以在管理守护程序上进行配置。 存储池 可以创建不同类型的存储池,同时当应用程序或用户创建文件时,也可以选择将文件存储在哪个存储池中。 镜像 警告:镜像不能代替备份。如果文件被用户或进程意外删除或覆盖,镜像将无法帮助你恢复旧文件。用户可以定期备份重要数据。 BeeGFS支持元数据和文件内容镜像。镜像功能以集成到普通的BeeGFS 服务中,因此不需要单独的服务或第三方工具。两种类型的镜像(元数据镜像和文件内容镜像)可以相互独立使用。镜像还提供了一些高可用性功能。 4 架构细节 4.1 文件条带化 一个文件跨多个目标条带化。还可以跨多个目标对文件系统进行条带化并镜像数据以实现弹性。可以更改用于条带化的存储目标数量和块大小。

4.2 元数据分布 元数据基于每个目录分布在元数据节点上。目录的内容总是存储在一个元数据节点上。为每个目录随机选择一个元数据节点。

4.3 删除正在使用的文件 当文件在进程仍处于打开状态时被删除,其inode将移动到元数据节点的目录处理中。稍后,当文件关闭时,它的inode和块最终会被擦除。因此,在处理目录中看到文件是正常的,只要进程仍然保持打开它们。

$ beegfs-ctl --disposeunused --printstats --dispose 如果由于某个进程仍在使用某个处理文件而无法删除它,你将看到如下所示的消息。

[1-573EC7CC-C] File still in use 需等待进程结束,该处置文件将被删除,如果你想识别此类进程,可以执行如下命令:

$ lsof | grep "(deleted)" 如果进程终止,Linux内核将自动关闭进程正在使用的所有文件,并且BeeGFS客户端模块将继续尝试关闭操作,并发送到元数据服务器。如果网络在关闭操作时断开连接,客户端也会这样做。

如果客户端节点崩溃或重新启动,当客户端节点被标记为死机时,元数据服务器将在30分钟后删除处理文件。

备注:摘自BeeGFS官网(https://doc.beegfs.io/)