启动 SeaweedFS 并存取文件
目标
亲手启动 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 不会成为瓶颈。
步骤
- 创建
/root/sw/master目录,并在 127.0.0.1:9333 上启动weed master。curl http://127.0.0.1:9333/cluster/status会返回 JSON。 - 创建
/root/sw/vol1,在 127.0.0.1:8180 上启动weed volume并注册到 Master。curl http://127.0.0.1:9333/dir/status的响应中必须能看到至少 1 个 Volume 服务器。 - 把
curl http://127.0.0.1:9333/dir/assign结果中的fid保存到/root/sw/fid.txt。格式必须是숫자,16진문자열(韩文,意为“数字,十六进制字符串”)。 - 用该 fid 把
/opt/fixtures/s3/readme.txt上传到 Volume 服务器。响应中的size必须大于 0。 - 用
/dir/lookup?volumeId=<볼륨ID>(占位符为卷 ID)查找位置,把文件下载为/root/sw/got.txt。内容必须与原文件相同。 - 在 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。内容必须相同。 - 用
/root/sw/many.sh把 500 个 4KiB 文件放入 Filer 的/lab/small/之下。在/root/sw/volfiles.txt中写入files=500 dat_files=<n>,其中 n 必须不大于 10。 - 在
/root/sw/arch.md中加入## 마스터、## 볼륨 서버、## 파일러(均为韩文,依次意为“## Master”“## Volume 服务器”“## Filer”)三个标题,每一节至少写 25 个字。Master 一节中必须包含它不保存元数据的意思。
参考
- Master:
weed master -mdir=/root/sw/master -port=9333 -ip=127.0.0.1 - Volume:
weed volume -dir=/root/sw/vol1 -mserver=127.0.0.1:9333 -port=8180 -ip=127.0.0.1 - Filer:
weed filer -master=127.0.0.1:9333 -port=8888 -ip=127.0.0.1 - 统计卷文件数量:
ls /root/sw/vol1/*.dat | wc -l - 常见错误 1:想把文件上传到 Master——Master 只告知位置。
- 常见错误 2:没有为每个守护进程指定
-ip,导致注册的地址无法访问。
启动 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 一节中必须包含它不保存元数据的意思。
关键在于谁保存元数据、谁保存数据。准确使用指定的标题。