Databases

MinIO

MinIO — открытое объектное хранилище с S3-совместимым API, которое разворачивают на своих серверах вместо облачного Amazon S3.

Что такое MinIO

MinIO — объектное хранилище, которое разворачивают на собственных серверах. Говорит на S3 API, поэтому для приложения выглядит как Amazon S3: тот же протокол, те же SDK, те же CLI-инструменты. Меняется одна строка — endpoint.

Смысл в этом и состоит. Код, написанный под S3, работает с MinIO без правок, а данные при этом остаются на вашем железе — в своей стойке, своём ЦОД или на VPS. Типичные поводы: требования к размещению данных, экономия на egress-трафике, локальный S3 для тестов и CI.

Что такое объектное хранение вообще и чем оно отличается от файлового — в статье object storage.

Запуск

docker run -d --name minio \
  -p 9000:9000 -p 9001:9001 \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=StrongPass123" \
  -v /mnt/data:/data \
  quay.io/minio/minio server /data --console-address ":9001"

Порт 9000 — S3 API, 9001 — веб-консоль. Дальше всё как в S3:

import boto3

s3 = boto3.client("s3",
    endpoint_url="http://localhost:9000",   # единственное отличие от AWS
    aws_access_key_id="admin",
    aws_secret_access_key="StrongPass123",
)

s3.create_bucket(Bucket="datasets")
s3.upload_file("train.parquet", "datasets", "train.parquet")
s3.download_file("datasets", "train.parquet", "./train.parquet")

Клиент mc

mc alias set local http://localhost:9000 admin StrongPass123

mc mb local/backups                    # создать бакет
mc cp ./dump.sql.gz local/backups/     # загрузить
mc mirror ./models local/models        # синхронизировать каталог
mc ls --recursive local/backups
mc du local/backups                    # сколько занято

mc ilm rule add local/backups --expire-days 30   # автоудаление через 30 дней

mc mirror и правила жизненного цикла делают MinIO удобной целью для бэкапов: дампы льются в бакет, старые versions удаляются по расписанию самим хранилищем.

Erasure coding

В многодисковом режиме MinIO разбивает объект на data- и parity-блоки и раскладывает их по дискам. Конфигурация вида EC:4 при 8 дисках означает 4 блока чётности — хранилище переживает отказ до 4 дисков без потери данных.

Отличие от RAID: защита работает на уровне самого MinIO и распространяется на диски разных узлов, а восстановление идёт по объектам, а не по всему тому. Поэтому под MinIO диски отдают напрямую (JBOD), не собирая их в RAID предварительно.

# Распределённый кластер: 4 узла по 4 диска
minio server http://node{1...4}/mnt/disk{1...4}

Важное ограничение архитектуры: набор дисков в распределённой конфигурации фиксирован. Расширяют такой кластер не добавлением диска, а добавлением нового server pool целиком.

Ограничения и подводные камни

  • Не файловая система. Объект перезаписывается целиком, дописать в середину нельзя. Под диск ВМ или NFS-шару это не замена — там нужны СХД или NAS.
  • Не кладите поверх сетевых ФС. MinIO рассчитан на локальные диски; поверх NFS или SMB он работает плохо и непредсказуемо.
  • Один узел — одна точка отказа. Отказоустойчивость появляется только в распределённом режиме.
  • Лицензия — AGPLv3. Для внутреннего использования вопросов нет; при встраивании в продукт, отдаваемый наружу, условия AGPL нужно читать внимательно. Есть коммерческая лицензия.
  • Веб-консоль наружу не публикуют. Как и любую панель управления хранилищем.

Где применяют

  • S3 в закрытом контуре — когда данные не должны покидать инфраструктуру.
  • Хранилище артефактов — сборки CI/CD, чекпоинты моделей, датасеты.
  • Цель для бэкапов с автоудалением по сроку.
  • Локальный S3 для разработки и тестов — поднимается одним контейнером в Docker Compose вместо аренды бакета в облаке.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер