MAATRIX / Блог / SeaweedFS на Ubuntu 24.04: пошаговая установка

SeaweedFS на Ubuntu 24.04: пошаговая установка

MAATRIX

Если ваше приложение хранит миллионы мелких файлов — превью товаров, аватарки, сканы документов, тайлы карт — обычная файловая система рано или поздно начинает тормозить: инодов не хватает, ls в директории с миллионом файлов подвисает, а бэкап превращается в пытку. SeaweedFS решает именно эту задачу: группирует мелкие файлы в крупные тома (volumes), отдаёт их через HTTP и S3-совместимый API и масштабируется горизонтально добавлением новых узлов, а не увеличением одного диска.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое SeaweedFS и чем он отличается от MinIO и Ceph

SeaweedFS — распределённая система хранения объектов с открытым кодом, вдохновлённая архитектурой Facebook Haystack (той самой, которую Facebook использовал для хранения фотографий). Идея простая: вместо того чтобы держать каждый файл отдельным inode на диске, SeaweedFS упаковывает множество файлов в общие volume-файлы фиксированного размера (по умолчанию до 30 ГБ) и хранит метаданные — где именно внутри volume лежит файл — отдельно, в компактной структуре в памяти. Это снимает главное узкое место классических файловых систем при работе с огромным количеством мелких объектов: операции метаданных остаются быстрыми, даже когда файлов миллиарды.

Архитектура состоит из трёх компонентов:

  • Master — координатор кластера: назначает ID для новых volume, следит за состоянием volume-серверов, балансирует репликацию;
  • Volume Server — рабочая лошадка, хранит сами данные в volume-файлах и отдаёт их по HTTP;
  • Filer — опциональный слой поверх volume-серверов, добавляющий POSIX-подобную файловую структуру (директории, имена файлов) и S3-совместимый API; метаданные filer хранит во внешней БД (LevelDB, MySQL, PostgreSQL, Redis и другие).

Чем это отличается от MinIO: MinIO — в первую очередь S3-хранилище с erasure coding на уровне дисков, а SeaweedFS изначально проектировался под другой профиль — огромное количество мелких файлов с минимальными накладными расходами на метаданные. От Ceph SeaweedFS отличается заметно более простой установкой и меньшими требованиями к железу — Ceph закладывает больше возможностей (блочные устройства, CephFS), но разворачивать и эксплуатировать его сложнее на порядок.

Важная оговорка: этот гайд поднимает базовую конфигурацию с одним master и одним volume-сервером на одной машине — она подходит для разработки, небольших и средних проектов, но не даёт отказоустойчивости. Для продакшена с репликацией между узлами нужно несколько серверов — об этом ниже, в разделе про репликацию.

Подготовка сервера и установка бинарника

Понадобится Ubuntu 24.04 с правами root или sudo, минимум 2 ГБ RAM для старта (для нагрузки с активным S3-трафиком — 4 ГБ и больше) и диск под данные с запасом — SeaweedFS растёт вместе с загружаемыми файлами, поэтому для реального продакшена стоит смотреть в сторону выделенного сервера под файловое хранилище на терабайты, а не VPS с фиксированным NVMe.

Обновите систему, поставьте базовые утилиты и создайте отдельного пользователя для сервисов SeaweedFS — не стоит гонять кластер хранения под root:

apt update && apt upgrade -y
apt install -y curl wget tar
useradd -r -s /usr/sbin/nologin -d /var/lib/seaweedfs seaweedfs
mkdir -p /var/lib/seaweedfs/{master,volume,filer}
chown -R seaweedfs:seaweedfs /var/lib/seaweedfs

Если данные должны лежать на отдельном диске, смонтируйте его заранее и укажите точку монтирования вместо /var/lib/seaweedfs/volume — это избавит от миграции данных позже.

SeaweedFS распространяется одним бинарником без внешних зависимостей — это одно из главных удобств проекта по сравнению с Ceph. Скачайте актуальный релиз с страницы релизов на GitHub — версия ниже приведена для примера, уточните актуальную перед установкой:

cd /tmp
SEAWEED_VERSION="3.79"  # уточните актуальную версию на странице релизов
wget https://github.com/seaweedfs/seaweedfs/releases/download/${SEAWEED_VERSION}/linux_amd64_large_disk.tar.gz
tar -xzf linux_amd64_large_disk.tar.gz
mv weed /usr/local/bin/
chmod +x /usr/local/bin/weed

Вариант large_disk рекомендован для продакшена — он поддерживает volume-файлы больше 30 ГБ и большее число файлов на volume. Проверьте установку:

weed version

Бинарник weed — одна точка входа для всех ролей: master, volume, filer запускаются одной командой с разными подкомандами (weed master, weed volume, weed filer).

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Настройка master-сервера

Master хранит топологию кластера и раздаёт ID для volume. Создайте systemd unit:

# /etc/systemd/system/seaweedfs-master.service
[Unit]
Description=SeaweedFS Master
After=network.target

[Service]
Type=simple
User=seaweedfs
Group=seaweedfs
ExecStart=/usr/local/bin/weed master \
  -mdir=/var/lib/seaweedfs/master \
  -ip=127.0.0.1 \
  -port=9333 \
  -volumeSizeLimitMB=30000
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Если планируете подключать volume-серверы с других машин, замените -ip=127.0.0.1 на реальный адрес, доступный в вашей сети. Запустите master:

systemctl daemon-reload
systemctl enable --now seaweedfs-master
systemctl status seaweedfs-master

Веб-интерфейс master по умолчанию доступен на порту 9333 — там видно топологию кластера, список volume-серверов и статистику по volume.

Настройка volume-сервера

Volume-сервер регистрируется у master и хранит сами данные. На той же машине (или на отдельной — тогда укажите реальный IP master вместо localhost):

# /etc/systemd/system/seaweedfs-volume.service
[Unit]
Description=SeaweedFS Volume Server
After=network.target seaweedfs-master.service
Requires=seaweedfs-master.service

[Service]
Type=simple
User=seaweedfs
Group=seaweedfs
ExecStart=/usr/local/bin/weed volume \
  -dir=/var/lib/seaweedfs/volume \
  -max=0 \
  -mserver=127.0.0.1:9333 \
  -ip=127.0.0.1 \
  -port=8080
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Параметр -max=0 означает «без ограничения по числу volume, пока хватает места на диске» — SeaweedFS сам создаёт новые volume по мере заполнения; для жёсткого лимита задайте конкретное число.

systemctl daemon-reload
systemctl enable --now seaweedfs-volume
systemctl status seaweedfs-volume

Проверьте, что volume-сервер зарегистрировался у master — откройте http://<адрес-master>:9333/ в браузере. Про настройку доступа к портам см. гайд по UFW на Ubuntu 24.04 — в продакшене порты 9333 и 8080 стоит открывать только для внутренней сети, а наружу пускать только filer через reverse proxy с HTTPS.

Filer и S3-совместимый API

Filer — это то, что превращает набор volume-серверов в удобное файловое хранилище с директориями и S3 API. По умолчанию filer использует встроенный LevelDB для метаданных — этого достаточно для старта, но для нагруженных сценариев стоит переключиться на PostgreSQL или MySQL (конфигурируется в filer.toml).

# /etc/systemd/system/seaweedfs-filer.service
[Unit]
Description=SeaweedFS Filer
After=network.target seaweedfs-master.service
Requires=seaweedfs-master.service

[Service]
Type=simple
User=seaweedfs
Group=seaweedfs
WorkingDirectory=/var/lib/seaweedfs/filer
ExecStart=/usr/local/bin/weed filer \
  -master=127.0.0.1:9333 \
  -ip=127.0.0.1 \
  -port=8888 \
  -s3 \
  -s3.port=8333
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Флаг -s3 поднимает S3-совместимый API прямо в процессе filer на отдельном порту (8333 в примере) — не нужен отдельный сервис. Запустите:

systemctl daemon-reload
systemctl enable --now seaweedfs-filer
systemctl status seaweedfs-filer

Для доступа по S3 API создайте identity и ключи в s3.json и подключите его через флаг -s3.config:

{
  "identities": [
    {
      "name": "app",
      "credentials": [
        {
          "accessKey": "введите-access-key",
          "secretKey": "введите-secret-key"
        }
      ],
      "actions": ["Read", "Write", "List", "Tagging", "Admin"]
    }
  ]
}

После этого любой S3-клиент — aws-cli, boto3, mc от MinIO — работает с SeaweedFS так же, как с Amazon S3: та же схема подписи запросов, те же вызовы PutObject/GetObject. Проверить можно через aws-cli с кастомным --endpoint-url:

aws --endpoint-url http://127.0.0.1:8333 s3 mb s3://test-bucket
aws --endpoint-url http://127.0.0.1:8333 s3 cp file.txt s3://test-bucket/
aws --endpoint-url http://127.0.0.1:8333 s3 ls s3://test-bucket/

Для внешнего доступа по HTTPS filer и S3 API стоит спрятать за Nginx с валидным сертификатом — принцип тот же, что и в схеме с MinIO, только проксируете порты 8888 (файловый доступ) и 8333 (S3 API) вместо стандартных портов MinIO.

Репликация и отказоустойчивость

Конфигурация выше — один узел, без резервирования: если сервер или диск выйдет из строя, данные пропадут. SeaweedFS поддерживает два независимых механизма защиты данных, и для продакшена нужен хотя бы один из них.

Репликация на уровне volume. Через параметры volume задаётся уровень репликации в формате XYZ, где X — репликация между дата-центрами, Y — между стойками, Z — между серверами внутри стойки. Например, -defaultReplication=001 означает «хранить копию на другом volume-сервере». Для этого нужно минимум два volume-сервера на разных машинах — каждый запускается той же командой weed volume с указанием адреса master, и кластер сам распределит копии согласно заданному уровню.

Erasure coding — альтернатива полной репликации, которая тратит меньше места на резервирование ценой чуть большей нагрузки на CPU при восстановлении: данные разбиваются на блоки с контрольными суммами вместо хранения N полных копий. Включается через weed shell подкомандой ec.encode для уже существующих volume — обычно применяется к «холодным» данным, которые редко перезаписываются.

Для конфигураций с несколькими дата-центрами (узел в РФ и узел в США, например) в топологии master можно задать -dataCenter и -rack при запуске volume-серверов — это даёт SeaweedFS понимание физической близости узлов и позволяет держать реплики географически разнесёнными.

Мониторинг и обслуживание

SeaweedFS отдаёт метрики в формате Prometheus из коробки — достаточно указать -metricsPort при запуске каждого компонента. Для повседневной эксплуатации используется weed shell (интерактивная оболочка, подключается к master):

weed shell -master=127.0.0.1:9333

Внутри доступны команды volume.list (состояние всех volume), volume.balance (перебалансировка между серверами), volume.fix.replication (восстановление реплик после сбоя узла) и fs.du (использование места в filer, аналог du).

Для бэкапа проще всего использовать встроенную репликацию плюс периодический weed backup для копирования volume в другое расположение, либо синхронизацию через S3 API инструментом вроде rclone — раз доступ идёт по стандартному S3 протоколу, подойдёт любой инструмент для S3-совместимых хранилищ.

Логи всех трёх сервисов — штатно через journalctl:

journalctl -u seaweedfs-master -f
journalctl -u seaweedfs-volume -f
journalctl -u seaweedfs-filer -f

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем SeaweedFS лучше обычной файловой системы для мелких файлов?

Классическая ФС тратит целый inode и блок метаданных на каждый файл, и при миллионах файлов листинг и поиск начинают деградировать. SeaweedFS упаковывает файлы в крупные volume и хранит указатель на позицию файла в компактной структуре в памяти — метаданные остаются быстрыми независимо от общего числа файлов.

Нужен ли filer, если достаточно S3 API?

Да — в текущей архитектуре SeaweedFS S3 API реализован именно в filer, без него доступны только низкоуровневые master и volume API.

Можно ли переехать с MinIO на SeaweedFS без переписывания кода?

Приложение через стандартный S3 SDK переключится сменой endpoint, access key и secret key — протокол один и тот же. Но стоит прогнать интеграционные тесты: наборы поддерживаемых расширений S3 API у них не идентичны.

LevelDB или внешняя БД для метаданных filer в продакшене?

LevelDB встроен и не требует отдельного сервиса, но живёт локально на одном filer и плохо подходит, если filer-узлов несколько. Для нескольких filer-серверов — PostgreSQL, MySQL или Redis с общим доступом.

Сколько RAM нужно на volume-сервер?

Точных цифр без тестов под вашу нагрузку не назовём — зависит от числа volume и паттерна доступа. Для старта достаточно 2 ГБ, под серьёзный S3-трафик закладывайте запас и смотрите реальное потребление через мониторинг.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →