TT Lab
开始
学习 学习路径 课程

对象存储与 S3

启动 SeaweedFS 并存取文件

在 TT Lab 中继续学习

目标

亲手启动 SeaweedFS 的 Master、Volume 服务器和 Filer,用底层 API 存储并查询文件,确认这种结构为什么对大量小文件的工作负载有利。

为什么重要

100 万个 4KB 文件,从数据量看只有 4GB,但对文件系统来说却是 100 万条元数据条目。inode 会耗尽,列表查询要花几分钟,备份工具为了对每个文件逐一 stat 要花上好几天。SeaweedFS 借鉴 Facebook Haystack 的思路,把小文件连续写入大的卷文件中,只记住偏移量。1,000 个文件放进一个卷文件后,inode 只有一个,读取只需一次寻道。本实验中特别重要的是第 3–5 步——向 Master 询问位置、直接写入 Volume 服务器、再次询问位置并读取,这个流程就是 SeaweedFS 的全部。Filer 和 S3 网关只是其上的便利层,理解了这两个阶段,就能明白为什么 Master 不会成为瓶颈。

步骤

  1. 创建 /root/sw/master 目录,并在 127.0.0.1:9333 上启动 weed master。curl http://127.0.0.1:9333/cluster/status 会返回 JSON。
  2. 创建 /root/sw/vol1,在 127.0.0.1:8180 上启动 weed volume 并注册到 Master。curl http://127.0.0.1:9333/dir/status 的响应中必须能看到至少 1 个 Volume 服务器。
  3. 把 curl http://127.0.0.1:9333/dir/assign 结果中的 fid 保存到 /root/sw/fid.txt。格式必须是 숫자,16진문자열(韩文,意为“数字,十六进制字符串”)。
  4. 用该 fid 把 /opt/fixtures/s3/readme.txt 上传到 Volume 服务器。响应中的 size 必须大于 0。
  5. 用 /dir/lookup?volumeId=<볼륨ID>(占位符为卷 ID)查找位置,把文件下载为 /root/sw/got.txt。内容必须与原文件相同。
  6. 在 127.0.0.1:8888 上启动 weed filer。把 /opt/fixtures/s3/sales.csv 用 PUT 上传到 http://127.0.0.1:8888/lab/sales.csv,再用 GET 取回,生成 /root/sw/filer.csv。内容必须相同。
  7. 用 /root/sw/many.sh 把 500 个 4KiB 文件放入 Filer 的 /lab/small/ 之下。在 /root/sw/volfiles.txt 中写入 files=500 dat_files=<n>,其中 n 必须不大于 10。
  8. 在 /root/sw/arch.md 中加入 ## 마스터、## 볼륨 서버、## 파일러(均为韩文,依次意为“## Master”“## Volume 服务器”“## Filer”)三个标题,每一节至少写 25 个字。Master 一节中必须包含它不保存元数据的意思。

参考

启动 Master

创建 /root/sw/master 目录,并在 127.0.0.1:9333 上启动 weed master。curl http://127.0.0.1:9333/cluster/status 会返回 JSON。

通过 weed 二进制文件的子命令来启动各个角色。提前创建好数据目录。

启动 Volume 服务器并注册到 Master

创建 /root/sw/vol1,在 127.0.0.1:8180 上启动 weed volume 并注册到 Master。curl http://127.0.0.1:9333/dir/status 的响应中必须能看到至少 1 个 Volume 服务器。

Volume 服务器必须知道 Master 的地址。在 Master 的状态中确认能看到 Volume 服务器。

申请文件 ID

把 curl http://127.0.0.1:9333/dir/assign 结果中的 fid 保存到 /root/sw/fid.txt。格式必须是 숫자,16진문자열(韩文,意为“数字,十六进制字符串”)。

向 Master 询问写入位置,它会同时给出文件标识符和服务器地址。

用申请到的 ID 上传文件

用该 fid 把 /opt/fixtures/s3/readme.txt 上传到 Volume 服务器。响应中的 size 必须大于 0。

上传到的是 Volume 服务器,而不是 Master。Master 只告知位置。

查询、下载并确认内容

用 /dir/lookup?volumeId=<볼륨ID>(占位符为卷 ID)查找位置,把文件下载为 /root/sw/got.txt。内容必须与原文件相同。

用卷 ID 询问位置,再从那台服务器下载。必须与原文件相同。

启动 Filer 并按路径操作

在 127.0.0.1:8888 上启动 weed filer。把 /opt/fixtures/s3/sales.csv 用 PUT 上传到 http://127.0.0.1:8888/lab/sales.csv,再用 GET 取回,生成 /root/sw/filer.csv。内容必须相同。

Filer 提供基于路径的访问。可以用 HTTP 的 PUT 和 GET 来操作。

放入 500 个小文件并确认卷文件数量

用 /root/sw/many.sh 把 500 个 4KiB 文件放入 Filer 的 /lab/small/ 之下。在 /root/sw/volfiles.txt 中写入 files=500 dat_files=<n>,其中 n 必须不大于 10。

数一数 500 个文件装进了几个卷文件。这正是这种存储存在的理由。

总结三个守护进程的角色

在 /root/sw/arch.md 中加入 ## 마스터、## 볼륨 서버、## 파일러(均为韩文,依次意为“## Master”“## Volume 服务器”“## Filer”)三个标题,每一节至少写 25 个字。Master 一节中必须包含它不保存元数据的意思。

关键在于谁保存元数据、谁保存数据。准确使用指定的标题。