GPFS并行文件系统架构解析与HPC部署实战
简介GPFSGeneral Parallel File System是IBM推出的行业领先并行集群文件系统文档面向存储工程师、系统架构师与集群运维人员系统拆解其历史脉络、三大部署架构、在线扩展机制及核心技术优势。内容涵盖SAN架构、NSD架构、SNC架构的区别与适用场景并对GPFS在分布式锁管理、元数据节点动态选举、条带化存储、智能预取、数据复制与高可用容灾等方面的实现思路展开分析同时以对比视角说明GPFS与传统NAS及带独立元数据节点方案的差异适合作为技术方案选型与原理学习的参考。压缩包内为1个docx文档约495KB图文结合、章节结构清晰。目前已有349人浏览学习。阅读后可快速建立GPFS整体认知框架掌握其解决并发访问、数据同步、空间分配与灾后恢复的设计思路为后续在集群环境中部署、调优或二次开发提供基础。1. 从MM命令说起GPFS到底是什么用过GPFS的人第一眼都会注意到它的命令带着mm前缀——mmcrfs、mmmount、mmlscluster很多人以为这是多媒体的缩写其实猜对了一半。GPFSGeneral 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引入了NSDNetwork 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推出了SNCShare 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依赖阵列RAIDGPFS数据复制典型场景小型高性能集群中大规模HPCHadoop/云原生场景数据可靠性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 pagepool8G -N allpagepool是数据缓存和元数据缓存共享的内存池用B或者P后缀可以指定单位。该参数在各节点独立配置计算节点和IO节点通常设置不同的值。需要说明的是pagepool的回收策略不够灵活这是GPFS一直以来的一个短板后文会专门展开讲。4. HPC部署实战搭建一个可用集群4.1 集群角色划分与License边界在HPC场景中GPFS集群里通常会区分三类角色NSD Server直接连存储对外提供块服务、计算节点运行作业通过NSD协议访问文件系统、登录节点管理作业提交和数据导入。计算节点和登录节点上装的GPFS是Client LicenseNSD Server装的是Server License价格差异很大采购前要把角色划分清楚。4.2 初始化集群的完整命令路径先在一台节点上初始化集群把其他节点加进来mmcrcluster -N nodefile -p primary_host -s secondary_host -C demo_cluster-N nodefile节点列表文件每行格式为hostname:rolerole可以是manager、quorum、nsdserver等-p primary_host指定主管理节点负责配置分发和集群状态维护-s secondary_host备用管理节点主节点故障时接管初始化完成后用mmlscluster验证mmlscluster输出会列出集群名称、集群ID、各节点角色、daemon版本号等信息。注意检查Node number是否连续、Quorum节点数量是否为奇数仲裁机制要求。4.3 在线扩容加节点和加NSD4.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把块设备映射为NSDmmadddisk将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 bs1M count8192 time dd if/dev/zero of/gpfs0/testfile bs1M count8192 oflagdirectoflagdirect是关键不加这个参数数据会先落到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健康状态、多路径状态以及仲裁节点通信质量。本文还有配套的精品资源点击获取