minio 对象存储初体验

87 阅读2分钟

接上篇文章已经部署启动了minio,我们通过管理对象存储的界面创建了一个bucket和上传一个文件,通过界面操作起来还是很简单的。

image.png 那么对应服务后端存储的数据又是怎样的呢? 让我们到linux上看一下

image.png 由此可见,上传的文件被分片后,存储在了每个后端目录下,看到这里不由的有几个问题:

  • 数据是如何分片的?
  • part.1各自存了什么数据?
  • xl.meta从命名上像是元数据,到底存储了什么,有什么作用?
  • 如果后端丢失了某些数据,用户是否可以下载回完整的文件? 当前熟悉minio的都知道minio使用的EC纠删码,这里的part.1存储的就是数据块和数据块计算后的校验快,这里也是minio的核心原理部分,后续需要重点研究。
    至于元数据xl.meta如何直观看到底存储的是什么?直接查看这个文件是没法看到解码后的内容,通过查阅minio的文档,源码中是提供了解码的代码,因此我们编译后来看看
cd minio/docs/debugging/xl-meta
go build ./

就能编译出xl-meta的解码工具 然后看看xl.meta文件中有些什么数据

./xl-meta {PATH}/xl.meta 
输出:
{
  "Versions": [
    {
      "Header": {
        "Flags": 2,
        "ModTime": "2025-08-24T16:12:11.279398343+08:00",
        "Signature": "43b69409",
        "Type": 1,
        "VersionID": "00000000000000000000000000000000"
      },
      "Idx": 0,
      "Metadata": {
        "Type": 1,
        "V2Obj": {
          "CSumAlgo": 1,
          "DDir": "WIfUAvboQ+GOmGBUzlzRcA==",
          "EcAlgo": 1,
          "EcBSize": 1048576,
          "EcDist": [
            4,
            1,
            2,
            3
          ],
          "EcIndex": 4,
          "EcM": 2,
          "EcN": 2,
          "ID": "AAAAAAAAAAAAAAAAAAAAAA==",
          "MTime": 1756023131279398343,
          "MetaSys": {},
          "MetaUsr": {
            "content-type": "application/x-gzip",
            "etag": "45d72b26bdc2ae9ba3106bfbff8bfc95"
          },
          "PartASizes": [
            86844416
          ],
          "PartETags": null,
          "PartNums": [
            1
          ],
          "PartSizes": [
            86844416
          ],
          "Size": 86844416
        },
        "v": 0
      }
    }
  ]
}

好了,基本上对象上传后的初步体验就是如此了,接下来就要继续深入到代码层级,一探究竟了。