
存储分布式文件系统对象存储云原生【免费下载链接】cubefscloud-native distributed storage项目地址https://gitcode.com/gh_mirrors/cu/cubefs点击查看免费下载在 CubeFS 中元数据节点MetaNode以元数据分片meta partition为单位承载文件系统的目录项Dentry与 inode 管理。当集群出现目录项异常、文件找不到、或需要核对某个分片内的目录结构时MetaNode 提供了一组 HTTP 调试接口可以直接查询单个 Dentry、指定目录下的全部子项以及整个分片内的全部目录信息。本指南以 docs-zh/source/dev-guide/admin-api/metanode/dentry.md 为骨架结合 metanode/api_handler.go 等源码完整讲解这三个接口的参数、调用方式与底层实现原理帮助读者快速上手目录项级排障。接口一览MetaNode 的 HTTP 调试服务通过registerAPIHandler注册路由见 metanode/api_handler.go其中与 Dentry 相关的接口如下接口路径用途必选参数/getDentry获取单个 Dentry 信息pid、name、parentIno/getDirectory获取指定目录下的全部文件pid、parentIno/getAllDentry获取指定分片的全部目录信息pid三个接口均为只读查询不会向 Raft 提交写操作可安全用于线上排查。下面逐一展开。使用前提访问入口与端口这些接口由 MetaNode 进程内置的 HTTP 服务提供。MetaNode 启动时通过 metanode/metanode.go 依次调用startServer与registerAPIHandler其中startServer见 metanode/server.go监听配置文件中listen指定的端口若开启了bindIp则监听localAddr:listen。文档示例中的http://10.196.59.202:17220仅为示意地址实际调用时需将 IP 与端口替换为待排查 MetaNode 的地址IP目标 MetaNode 的localAddrport目标 MetaNode 配置文件中的listen端口分片编号pid可通过master的元数据分片列表查询也可用同目录下/getPartitions、/getPartitionById接口确认。作为参考metanode/api_handler_test.go 中的测试服务器使用http.ListenAndServe(:8220, nil)启动并注册同一组路由说明端口是可通过配置灵活指定的。获取单个 Dentry 信息/getDentry该接口根据父目录 inode 名称精确查询一个目录项等价于文件系统层面的lookup操作返回该 Dentry 对应的 inode 与类型。请求示例curl -v http://10.196.59.202:17220/getDentry?pid100nameaa.txtparentIno1024参数说明ParameterTypeDescription说明pidint元数据分片 ID必填用于定位目标分片namestring目录或文件名必填要查询的目录项名称需 URL 编码parentInoint父目录 inode id必填父目录的 inode 编号响应结构与状态码从源码 metanode/api_handler.go 的getDentryHandler可以看出其处理流程为通过parseArgs解析pid、parentIno并读取name表单值调用getRealVerSeq解析可选参数verSeq见下文多版本语义小节通过metadataManager.GetPartition(pid)获取分片对象构造LookupReq{PartitionID, ParentID, Name, VerSeq, VerAll}并调用mp.Lookup(req, p)成功时 HTTP 状态码为303 See OtherJSON 响应体结构为{code: 303, msg: 结果信息, data: 查询结果}。其中mp.Lookup的实现位于 metanode/partition_op_dentry.go它先构造一个仅含ParentId与Name的Dentry按请求的VerSeq设置版本号然后调用分片内部的getDentry见 metanode/partition_fsmop_dentry.go在分片的内存 B 树dentryTree中查找命中后返回 inode 与类型未命中则返回OpNotExistErr。获取指定目录下的全部文件/getDirectory该接口枚举指定父目录下的全部子目录项等价于文件系统层面的readdir操作可用于核对某个目录下的文件是否齐全、是否存在幽灵目录项。请求示例curl -v http://10.196.59.202:17220/getDirectory?pid100parentIno1024参数说明ParameterTypeDescription说明pidint元数据分片 ID必填用于定位目标分片parentIno文档表格写作inointinode ID必填要枚举的目录 inode 编号需要特别指出原文档参数表中该参数写作ino但请求示例与源码解析使用的实际参数名均为parentInoparseArgs中使用pIno.ParentIno()见 metanode/api_handler.go请以parentIno为准。另外从当前仓库的getDirectoryHandler实现看metanode/api_handler.gohandler 会再次读取parentIno表单值并将其赋给pid用于GetPartition定位分片这一行为与文档表格的描述存在差异属于当前源码中的实现细节使用前建议结合所部署版本的源码确认参数语义。底层实现getDirectoryHandler构造ReadDirReq{ParentID, VerSeq}并调用mp.ReadDirmetanode/partition_op_dentry.go最终落到metaPartition.readDirmetanode/partition_fsmop_dentry.go以Dentry{ParentId: req.ParentID}为起点、Dentry{ParentId: req.ParentID 1}为终点对dentryTree执行AscendRange区间遍历对每个目录项调用getDentryByVerSeq做版本过滤过滤掉已删除或不可见的版本将所有子项的Inode、Type、Name组装为proto.Dentry列表返回。因为dentryTree以ParentId Name作为排序键同一父目录下的全部目录项在 B 树中是连续区间因此该查询天然高效。获取指定分片的全部目录信息/getAllDentry该接口遍历整个分片的dentryTree输出该分片内所有目录项。当怀疑分片内目录项数据整体不一致、或需要导出某个分片的完整目录快照做对比分析时使用。请求示例curl -v http://10.196.59.202:17220/getAllDentry?pid100参数说明ParameterTypeDescription说明pidinteger元数据分片 ID必填用于定位目标分片verSeqinteger版本号可选非必填用于指定查询的目录快照版本缺省视为最新版本流式输出与过滤逻辑getAllDentriesHandler的实现见 metanode/api_handler.go与另外两个接口不同它采用边遍历边写响应体的流式输出方式先写出{code: 200, msg: OK, data:[前缀随后对dentryTree.Ascend逐个输出 JSON最后以]}收尾避免一次性将海量目录项载入内存。遍历过程中对每个目录项调用getDentryFromVerList(verSeq, false)定义于 metanode/dentry.go若某个目录项存在多版本快照multiSnap则按verSeq取对应可见版本若该版本已被删除isDeleted()返回 true或版本不可见则直接跳过不输出到结果中。因此该接口输出的数据已经过版本过滤与当前可见的目录结构一致。进阶可选参数 verSeq 与 verAll 的多版本语义CubeFS 的元数据分片支持多版本快照机制Dentry结构体内含multiSnap版本列表见 metanode/dentry.go每次变更会通过addVersion保留历史版本。对应地上述接口提供两个可选参数verSeq指定查询的快照版本号。getRealVerSeqmetanode/api_handler.go将其解析为 uint64当verSeq0或缺省时会被替换为math.MaxUint64即查询最新版本。这在核对历史目录快照、排查多版本恢复问题时非常有用。verAll仅/getDentry支持置为true时返回该目录项的全部版本信息而非仅指定版本。从源码看 Dentry 的数据结构了解接口返回值前先明确 Dentry 的两种形态对外协议层proto.Dentry见 proto/fs_proto.go仅包含三个字段JSON 序列化后的键名为name、ino、typetype Dentry struct { Name string json:name Inode uint64 json:ino Type uint32 json:type }对内存储层metanode.Dentry见 metanode/dentry.go额外携带ParentId与版本快照multiSnaptype Dentry struct { ParentId uint64 Inode uint64 Name string Type uint32 multiSnap *DentryMultiSnap }Type字段区分目录与普通文件可通过proto.IsDir判断multiSnap中每个版本都记录VerSeq并且用VerSeq的最高位1 63标记该版本是否被删除isDeleted见 metanode/dentry.gogetVerSeq取版本号时会屏蔽该标志位。理解了这一点就能明白/getAllDentry为什么能准确跳过已删除目录项。调试实战建议与注意事项参数名区分大小写三个接口的参数均以小写驼峰形式出现pid、parentIno、name、verSeq、verAll需原样拼写name含特殊字符引号、空格、中文时务必先做 URL 编码。确认分片归属pid是元数据分片 ID不是 inode 号。查询前可通过 master 或 MetaNode 的/getPartitions接口确认目标 inode 属于哪个分片避免 404handler 在分片不存在时返回StatusNotFound。按需使用 /getAllDentry大分片目录项可能成千上万流式输出仍会产生较大响应体建议配合curl -o落盘分析避免终端输出堆积。多版本场景配合 verSeq 使用若集群启用了多版本快照默认查询的是最新版本需要排查历史状态时显式传入verSeq。源码与文档差异/getDirectory文档参数表写作ino实际请求参数与源码解析均为parentIno同时当前版本 handler 存在将parentIno赋给pid的取值细节线上使用前请以所部署版本源码为准核对。参考与延伸阅读接口注册与实现metanode/api_handler.goDentry 内部结构与版本管理metanode/dentry.goLookup / ReadDir 操作封装metanode/partition_op_dentry.go分片内目录遍历与版本过滤metanode/partition_fsmop_dentry.go协议层 Dentry 结构proto/fs_proto.go元数据操作码定义OpMetaLookup、OpMetaReadDir等proto/packet.go赞分享存储分布式文件系统对象存储云原生【免费下载链接】cubefscloud-native distributed storage项目地址https://gitcode.com/gh_mirrors/cu/cubefs点击查看免费下载相关推荐终极CubeFS存储接口完全指南从API入门到实战应用终极CubeFS存储接口完全指南从API入门到实战应用 CubeFS是一个高性能的cloud native distributed storage系统提供丰存储分布式文件系统对象存储云原生沉浸式水域魔法用Unity Stylized Water打造你的数字海洋世界 沉浸式水域魔法用Unity Stylized Water打造你的数字海洋世界 想象一下你正站在虚拟世界的海岸边微风轻拂阳光在水面上跳跃闪烁层层涟存储分布式文件系统对象存储云原生CubeFS 集群管理 API 实战Master 节点运维接口全解析CubeFS 集群管理 API 实战Master 节点运维接口全解析 本篇技术指南聚焦 CubeFS 分布式存储系统中资源管理节点 Master 提供的集群管存储分布式文件系统对象存储云原生上一篇3步完成专业黑苹果配置OpCore-Simplify智能自动化工具终极指南下一篇Linux Notification Center为你的桌面增添一抹风格创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考