Файлы резервных копий, образы виртуальных машин и видеархивы плохо живут в обычной файловой системе: каталоги разрастаются, бэкап занимает часы, а при переезде ломаются права. 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 и закрыть служебные порты файрволом.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте