Файлы резервных копий, образы виртуальных машин и видеархивы плохо живут в обычной файловой системе: каталоги разрастаются, бэкап занимает часы, а при переезде ломаются права. SeaweedFS решает это как объектное хранилище с S3-совместимым API: один бинарник, простое развёртывание и предсказуемое чтение даже на миллионах объектов.
Как устроена система
SeaweedFS выросла из проекта Weed-FS и написана на Go. Данные хранятся в «нитях» внутри томов: это крупные файлы .dat с индексом .idx. Благодаря фиксированному смещению чтение объекта занимает одно обращение к диску, без обхода дерева каталогов.
Компоненты разделены. Master хранит карту томов и выдаёт идентификаторы файлов. Volume server пишет и отдаёт данные. Filer добавляет иерархию каталогов и метаданные, а S3 gateway представляет всё это через привычный протокол Amazon S3.
- master — порт 9333, метаданные томов и выдача идентификаторов;
- volume — порт 8080, здесь лежат сами файлы;
- filer — порт 8888, каталоги и метаинформация;
- S3 gateway — порт 8333, совместимость с AWS CLI и SDK.
Установка
Официальная сборка — один исполняемый файл weed. Скачайте архив с релизом под свою архитектуру, распакуйте и положите бинарник в /usr/local/bin. Docker-образ chrislusf/seaweedfs удобен для быстрого стенда.
curl -LO https://github.com/seaweedfs/seaweedfs/releases/latest/download/linux_amd64.tar.gz
tar xzf linux_amd64.tar.gz weed
sudo install -m 0755 weed /usr/local/bin/weed
weed version
Флаги меняются между релизами, поэтому сверяйтесь с weed server -h для своей сборки.
Быстрый одноузловой стенд
Команда weed server поднимает master, volume и filer в одном процессе. Для домашнего архива этого достаточно; S3-шлюз запускается отдельной командой и подключается к filer.
sudo mkdir -p /srv/seaweed
sudo weed server -dir=/srv/seaweed -ip=127.0.0.1
curl -s http://127.0.0.1:9333/cluster/status
curl -s http://127.0.0.1:8888/ | head
Ответ /cluster/status показывает список мастеров и состояние тома.
Раздельный запуск: master, volume, filer
На сервере компоненты лучше разнести. Флаг -ip обязателен в сети с несколькими интерфейсами: именно этот адрес master раздаёт клиентам, и при неверном значении загрузка пойдёт на недоступный IP.
weed master -mdir=/srv/seaweed/master -ip=10.0.0.10 -port=9333
weed volume -dir=/srv/seaweed/volumes -max=8 -mserver=10.0.0.10:9333 -ip=10.0.0.10 -port=8080
weed filer -master=10.0.0.10:9333 -ip=10.0.0.10 -port=8888
weed s3 -filer=10.0.0.10:8888 -port=8333 -config=/etc/seaweedfs/s3.json
Параметр -max ограничивает число томов на одном volume-сервере; когда лимит исчерпан, новые тома создаются на другом сервере.
S3-доступ и ключи
Шлюз читает список идентичностей из JSON. Каждой записи соответствуют ключи и набор разрешений. Файл должен быть недоступен другим пользователям: права 0600.
{
"identities": [
{
"name": "backup",
"credentials": [{"accessKey": "backupkey", "secretKey": "change-me-please"}],
"actions": ["Read", "Write", "List", "Tagging"]
}
]
}
Дальше работает обычный AWS CLI. Проверка сразу показывает, что шлюз, ключи и filer настроены согласованно.
aws --endpoint-url http://127.0.0.1:8333 s3 mb s3://archive
aws --endpoint-url http://127.0.0.1:8333 s3 cp big.iso s3://archive/
aws --endpoint-url http://127.0.0.1:8333 s3 ls s3://archive/
aws --endpoint-url http://127.0.0.1:8333 s3 presign s3://archive/big.iso --expires-in 3600
Большие файлы и чанки
Крупные объекты режутся на части, поэтому файл может занимать несколько томов и переживать добавление дисков. AWS CLI сам включает multipart для больших загрузок. Предельный размер файла и размер чанка задаются параметрами volume-сервера — точные имена сверьте в weed volume -h.
Для проверки прямого API master выдаёт идентификатор, а volume принимает файл по этому адресу. Путь полезен, когда S3-слой не нужен.
curl -s "http://127.0.0.1:9333/dir/assign"
curl -F "file=@big.iso" "http://127.0.0.1:8080/3,01b2c3d4e5"
curl -s "http://127.0.0.1:8080/3,01b2c3d4e5" -o restored.iso
sha256sum big.iso restored.iso
Filer и монтирование
Filer хранит дерево каталогов. По умолчанию метаданные лежат в локальной LevelDB рядом с каталогом запуска; для кластера подключают PostgreSQL, Redis или etcd — флаги смотрите в weed filer -h. Через FUSE содержимое доступно как обычный каталог.
sudo apt install fuse3
sudo mkdir -p /mnt/seaweed
sudo weed mount -filer=127.0.0.1:8888 -dir=/mnt/seaweed -cacheDir=/var/cache/seaweed
ls -la /mnt/seaweed
Монтирование удобно для чтения и выкладки, но не заменяет POSIX-файловую систему: блокировки, права и жёсткие ссылки реализованы ограниченно. Базы данных и git-репозитории лучше хранить через S3.
Обслуживание и резервные копии
Интерактивная оболочка weed shell даёт доступ к служебным командам: проверка томов, целостности дисков и состояния кластера. Резервную копию filer снимают отдельной командой в обычной оболочке.
weed shell -master=127.0.0.1:9333
volume.list
volume.check.disk
cluster.check
weed filer.backup -filer=127.0.0.1:8888 -dir=/backup/seaweed
Для экономии места на холодных данных включают erasure coding: объекты делятся на блоки с избыточностью, и полная копия каждого файла больше не нужна. Команды ec.encode и ec.decode выполняются из weed shell, но перед экспериментами сохраните метаданные.
Типичные ошибки
- volume-сервер запущен с
-ip=127.0.0.1внутри контейнера — master раздаёт этот адрес, и клиенты с других машин не могут скачать файл; - каталог данных лежит на сетевой файловой системе — тома теряют производительность и плохо переживают перезапуск;
- S3-ключи совпадают с примером из документации — шлюз доступен всем, кто знает адрес;
- резервная копия есть только у filer, а тома не скопированы — метаданные восстановлены, файлов нет.
Служба systemd и безопасность
Для постоянной работы оформите unit-файл с ограничением прав. Порт 9333 не должен смотреть в интернет: у master нет встроенной аутентификации. Наружу выставляйте только S3 через обратный прокси с TLS.
[Unit]
Description=SeaweedFS volume
After=network-online.target
[Service]
ExecStart=/usr/local/bin/weed volume -dir=/srv/seaweed/volumes -mserver=127.0.0.1:9333 -max=8
Restart=on-failure
User=seaweed
[Install]
WantedBy=multi-user.target
Минимальная защита: отдельный пользователь, каталог с правами 0750, firewall и регулярные обновления. Ключи S3 храните в файле с правами 0600 и не переиспользуйте между приложениями.
Итог
SeaweedFS даёт S3-хранилище без минимального размера кластера и без сложной настройки. Один узел поднимается за пять минут, а архитектура позволяет добавлять volume-серверы по мере роста.
Чек-лист: скачать бинарник и свериться с -h, поднять master и volume с явным -ip, подключить filer, настроить ключи S3, проверить загрузку через AWS CLI, включить резервное копирование filer и закрыть служебные порты файрволом.