简介:GPFS(General Parallel File System)是IBM推出的行业领先并行集群文件系统,文档面向存储工程师、系统架构师与集群运维人员,系统拆解其历史脉络、三大部署架构、在线扩展机制及核心技术优势。内容涵盖SAN架构、NSD架构、SNC架构的区别与适用场景,并对GPFS在分布式锁管理、元数据节点动态选举、条带化存储、智能预取、数据复制与高可用容灾等方面的实现思路展开分析,同时以对比视角说明GPFS与传统NAS及带独立元数据节点方案的差异,适合作为技术方案选型与原理学习的参考。压缩包内为1个docx文档,约495KB,图文结合、章节结构清晰。目前已有349人浏览学习。阅读后可快速建立GPFS整体认知框架,掌握其解决并发访问、数据同步、空间分配与灾后恢复的设计思路,为后续在集群环境中部署、调优或二次开发提供基础。
1. 从MM命令说起:GPFS到底是什么
用过GPFS的人,第一眼都会注意到它的命令带着mm前缀——mmcrfs、mmmount、mmlscluster,很多人以为这是"多媒体"的缩写,其实猜对了一半。GPFS(General Parallel File System)从1993年启动研发,1995年首次商用,落地场景是IBM的多媒体服务器Tiger Shark,所以命令沿用了mm这个前缀,一用就是三十年。这算是GPFS留给老工程师的一个彩蛋。
GPFS本质上是共享磁盘(shared-disk)架构的并行文件系统,最大特点是所有节点并发挂载同一个文件系统实例,数据不经过某个集中式文件服务器转发,而是直接由各节点并行访问底层存储设备。它和Lustre这类带独立元数据服务的并行文件系统走的是两条技术路线,GPFS把元数据也分布到所有节点上,通过分布式锁来协调访问。这篇文章会从架构选型、锁机制、数据布局到HPC部署实战,把GPFS这套体系的原理和落地细节拆开来讲。
2. 三种部署架构:SAN直连、NSD映射与SNC扩展
2.1 SAN直连模式:每个节点都是全功能客户端
最早期的GPFS部署形态比较简单:每个应用节点上都装完整GPFS,通过光纤通道或iSCSI直接连接后端的SAN存储阵列,所有节点看到的是同一套LUN。这种模式下没有专门的I/O服务节点,每个节点既能跑应用,也能承担元数据管理、锁管理这些集群角色。
这个架构的优势是数据路径最短:应用进程发出read/write后,GPFS直接通过本机的FC HBA下发到存储阵列,不经过任何中间转发。代价是对存储网络的要求很高,需要SAN交换机有足够的端口数,每个节点都要采购HBA卡和存储连线,扩展节点时网络侧改动比较大。适合节点规模不大、但单节点带宽要求极高的场景。
注意,在这种纯SAN直连的模式下,GPFS集群通信(心跳、锁、元数据同步)走的是独立的集群网络(通常是以太网或者InfiniBand),而数据面走SAN,两套网络互不干扰。
2.2 NSD模型:数据路径与集群控制分离
2.2.1 NSD的产生背景
随着集群规模从十几个节点扩展到上百个节点,SAN直连的成本和布线复杂度变得不可接受。GPFS引入了NSD(Network Shared Disk)这一层抽象。NSD本质上是把物理LUN做一个封装,变成集群内可统一识别的逻辑设备。一个NSD对应一个LUN,一一映射,不叠加。
通过mmlsnsd -L可以查看当前集群里NSD与物理磁盘、节点的对应关系:
mmlsnsd -L Disk name NSD volume ID Device Node name Remarks ---------------------------------------------------------------- nsd1 XXXX-XXXX /dev/sdb nsdserver01 server nsd2 XXXX-XXXX /dev/sdc nsdserver01 server nsd3 XXXX-XXXX /dev/sde nsdserver02 server nsd4 XXXX-XXXX /dev/sdd nsdserver02 server输出里Node name列标记了这个NSD由哪个节点负责对外提供访问,Remarks列标记server或client。非NSD Server节点上如果能看到这个设备名,说明它通过GPFS的NSD客户端协议在访问远端存储。
2.2.2 NSD Server的职责边界
NSD Server直连存储阵列,其他客户端节点通过GPFS自定义的NSD协议,经通用网络(以太网或InfiniBand)向NSD Server发起块级读写请求。NSD Server在这里的角色是块设备转发层,不做文件语义处理——文件系统的元数据、锁、缓存都还在各客户端节点本地。
这种拆分的意义在于:
- 数据面从SAN网络迁移到了通用IP网络,节点加入集群只需要接入集群网络
- 底层存储的扩容和节点扩容解耦,存储只挂在NSD Server上
- 一个NSD可以同时配置最多8个NSD Server提供多路径访问,单台NSD Server故障后IO自动切换
2.3 SNC架构:GPFS向Hadoop生态的延伸
2010年IBM推出了SNC(Share Nothing Cluster,无共享集群)形态,把GPFS和HDFS融合。这种架构下数据不再依赖共享存储阵列,而是直接使用各节点本地磁盘,通过GPFS的数据复制能力保证可靠性,相当于用GPFS的副本机制替代了三副本的HDFS。
SNC架构解决的是Hadoop场景下的一个实际矛盾:NameNode是单点,小文件场景下元数据压力大,而GPFS的分布式元数据能力天然适合处理海量小文件。在SNC模式下,MapReduce作业可以直接跑在GPFS文件系统上,不需要先导入HDFS,省掉了一道数据搬运。
不过SNC架构对网络和磁盘的要求并不低——数据复制产生的网络开销是真实存在的。它的适用场景是:集群节点本身自带大容量本地盘、对数据导入导出效率敏感、且希望用一套文件系统同时承载HDFS工作负载和传统POSIX应用。
2.4 三种架构选型对比
| 对比维度 | SAN直连 | NSD架构 | SNC架构 |
|---|---|---|---|
| 存储位置 | SAN存储阵列 | SAN存储阵列 | 各节点本地磁盘 |
| 数据路径 | FC/iSCSI直连 | NSD Server转发 | 节点间复制 |
| 扩展粒度 | 节点+存储端口 | 节点和存储独立扩展 | 节点自带容量 |
| 副本能力 | 依赖阵列RAID | 依赖阵列RAID | GPFS数据复制 |
| 典型场景 | 小型高性能集群 | 中大规模HPC | Hadoop/云原生场景 |
| 数据可靠性 | RAID双控 | RAID双控+多路径 | 多副本+故障域 |
我自己在项目里遇到最多的还是NSD架构,原因很直接——生产环境的存储阵列(DDN、IBM Storwize、Pure等)都成熟稳定,没必要在文件系统层再做一套副本来增加运维复杂度。SNC的多副本机制要消耗50%以上的额外容量,除非硬件预算充足且确实需要多活数据中心能力,否则不推荐主用。
3. 核心机制拆解:锁、元数据与数据布局
3.1 分布式锁:从文件级锁到字节范围锁
共享磁盘架构最大的技术难点是并发控制:多个节点同时读写同一个文件时,怎么保证数据一致性?GPFS的做法是分布式锁管理器(Distributed Lock Manager),每个节点都有锁管理能力,锁的协调采用token机制,元数据节点作为协调者。
锁的粒度是GPFS设计上的一个精髓。早期的并行文件系统对文件加锁,一个节点写文件时其他节点只能等待,并发度很差。GPFS把锁粒度细化到字节范围(byte-range lock),两个节点分别写同一个文件的不同区域时,锁不冲突,可以并行写入。
3.2 metanode:元数据服务的动态选择
GPFS没有独立的元数据服务器,文件和目录的元数据分散存储在所有磁盘上。当某个文件被打开时,GPFS会在持有该文件inode的节点里选举一个metanode,由它负责该文件所有元数据操作的协调。内核态的命令行工具mmfsadm可以查看文件当前的metanode归属:
mmfsadm test 1 cat /gpfs/demo/testfile输出中会打印出该文件的inode编号、所属文件集、以及当前负责元数据协调的节点。这个命令在排查"某个文件在哪个节点上锁"的问题时非常有用。
metanode的选择是动态的:当访问某个文件的节点发生变化时,metanode可能迁移到访问最频繁的节点上,减少元数据操作跨网络转发的开销。这种设计规避了Lustre那种MDT双机主备架构的扩展天花板,元数据吞吐会随着节点数增加而线性增长。
3.3 条带化与文件分片布局
GPFS在文件系统层面实现了条带化(striping),单个文件的数据块分散到多个NSD上。这和RAID的条带化不同——RAID条带是块设备层做的,GPFS条带是文件系统层做的,每个数据块单元的大小由文件系统的block size决定。
block size的选择直接影响性能,GPFS创建文件系统时通过-B参数指定:
mmcrfs gpfs0 -F nsd_list -B 1M -j cluster -k all参数含义说明:
-B 1M:数据块大小设为1MB,数据块的可选范围从16KB到16MB-j cluster:日志类型为cluster共享日志,所有节点共享一套日志设备-k all:所有节点都是挂载点,挂载权限对所有节点开放-F nsd_list:指定NSD列表文件,里面逐行列出了参与文件系统的NSD名称
对于大文件顺序读写的HPC作业,建议块大小设置在1MB到4MB之间,减少IO请求次数,让每次访问都能覆盖较大的物理连续区域。混合负载场景下常用256KB,兼顾小文件随机IO的延迟和大文件顺序IO的吞吐。
3.4 智能预取与Cache策略
GPFS在数据预取上做得比较细:每个节点都有独立的pagepool(页面池)作为缓存,读取时按顺序访问模式预取后续数据块,核心参数在/usr/lpp/mmfs/etc/mmsysmon.cfg或通过mmchconfig调整:
mmchconfig pagepool=8G -N allpagepool是数据缓存和元数据缓存共享的内存池,用B或者P后缀可以指定单位。该参数在各节点独立配置,计算节点和IO节点通常设置不同的值。需要说明的是,pagepool的回收策略不够灵活,这是GPFS一直以来的一个短板,后文会专门展开讲。
4. HPC部署实战:搭建一个可用集群
4.1 集群角色划分与License边界
在HPC场景中,GPFS集群里通常会区分三类角色:NSD Server(直接连存储,对外提供块服务)、计算节点(运行作业,通过NSD协议访问文件系统)、登录节点(管理作业提交和数据导入)。计算节点和登录节点上装的GPFS是Client License,NSD Server装的是Server License,价格差异很大,采购前要把角色划分清楚。
4.2 初始化集群的完整命令路径
先在一台节点上初始化集群,把其他节点加进来:
mmcrcluster -N nodefile -p primary_host -s secondary_host -C demo_cluster-N nodefile:节点列表文件,每行格式为hostname:role,role可以是manager、quorum、nsdserver等-p primary_host:指定主管理节点,负责配置分发和集群状态维护-s secondary_host:备用管理节点,主节点故障时接管
初始化完成后用mmlscluster验证:
mmlscluster输出会列出集群名称、集群ID、各节点角色、daemon版本号等信息。注意检查Node number是否连续、Quorum节点数量是否为奇数(仲裁机制要求)。
4.3 在线扩容:加节点和加NSD
4.3.1 节点扩容
把新节点加入集群的标准做法:
mmaddnode -N newnodes -N othernodes mmchlicense Client --accept -N newnodes mmstartup -N newnodesmmaddnode只是把节点纳入集群配置,新节点上的GPFS daemon还没有启动,需要mmstartup拉起。这里容易出现的问题是:新节点的/etc/hosts里必须包含集群内所有节点的主机名和IP映射,否则GPFS daemon之间的通信握手会失败。排查方法是看/var/adm/ras/mmfs.log.latest,里面会明确记录哪个节点连接不上。
4.3.2 存储扩容
给文件系统加一块新NSD,常见做法是把新LUN先建为NSD,再添加到文件系统:
echo "/dev/sdf:nsdnew::dataAndMetadata:nsdserver01" > /tmp/nsdpara mmcrnsd -F /tmp/nsdpara mmadddisk gpfs0 -F /tmp/nsdparammcrnsd把块设备映射为NSD,mmadddisk将NSD加入文件系统。数据重新平衡是后台自动做的,也可以用mmrestripefs gpfs0手动触发rebalance。
4.4 常用运维命令参考表
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看集群状态 | mmgetstate -a | 显示每个节点的GPFS daemon状态 |
| 查看文件系统 | mmlsfs all | 列出文件系统名、块大小、副本数等全部属性 |
| 挂载文件系统 | mmmount gpfs0 -a | 所有节点同时挂载gpfs0 |
| 卸载文件系统 | mmumount gpfs0 -a | 所有节点同时卸载 |
| 查看NSD状态 | mmlsnsd -m | 显示NSD与文件系统的映射关系 |
| 修改副本数 | mmchfs gpfs0 -r 2 -R 2 | 将数据和元数据副本数改为2 |
| 停整个集群 | mmshutdown -a | 所有节点停止GPFS服务,需要先卸载文件系统 |
| 恢复集群 | mmstartup -a | 启动所有节点的GPFS daemon,会自动挂载文件系统 |
运维上最重要的一个习惯:改配置前先mmlsconfig把当前配置备份下来,GPFS的配置分发是同步机制,配置变更瞬时应用到所有节点。
5. 性能基线测试与pagepool踩坑记录
集群搭好之后不能直接交给我跑业务,第一步是先做性能基线测试。常见做法是在两台计算节点上分别用dd和ior压一遍顺序读写和随机读写。顺序读写的粗测命令:
time dd if=/gpfs0/testfile of=/dev/null bs=1M count=8192 time dd if=/dev/zero of=/gpfs0/testfile bs=1M count=8192 oflag=directoflag=direct是关键,不加这个参数,数据会先落到pagepool缓存里,测出来的数字是缓存命中后的性能,不是真实磁盘性能。两次dd之间要echo 3 > /proc/sys/vm/drop_caches清一次缓存。
pagepool这个参数我踩过一次。生产环境文件系统创建时把pagepool配了16GB,运行半年后业务数据量上来,发现计算节点的pagepool回收策略对突发IO的响应太慢——持续高并发写入时,pagepool被大量脏页占满,而回收线程的阈值跑得太高,新IO请求需要先等老数据落盘。后来验证下来,pagepool适合设置成物理内存的10%到20%之间,并且在高并发写场景下建议用多个较小的文件系统实例分摊缓存压力。GPFS把pagepool做成预分配固定大小的模式,没法按需弹性伸缩,这是它和Lustre在运维上最大的感受差异。
另外一个验证手段是vmstat观察si、so字段,当swap in/out持续不为零时,说明pagepool已经把系统内存推到了临界点,需要尽快调整。块大小的调整要回到创建文件系统的参数上,mmchfs可以改块大小但要求文件系统为空,生产环境基本不具备可操作性,所以块大小的选择一定要在项目规划阶段定好,后续很难返工。
多路径方面,生产环境我会把NSD的路径冗余配满——每个NSD配两个NSD Server,各自走不同的HBA卡和交换机,这样任何一条链路断了,IO自动切到备用路径,业务无感知。验证命令是mmhealth node show,能看到每个节点的GPFS健康状态、多路径状态以及仲裁节点通信质量。
本文还有配套的精品资源,点击获取