RU: MinIO Распределенное Хранилище - короткое введение

RU: MinIO Распределенное Хранилище - короткое введение

Посмотрим что же такое MinIO:

MinIO это высокопроизводительное объектное хранилище выпущенное под лицензией Apache License v2.0. Это API(АПИ) совместимое с Amazon S3(Simple Storage Service) сервис облачного хранилища. Используя MinIO можно построить высокопроизводительную инфраструктуру для машинного обучения, аналитики и приложений с высокой загрузкой данными.

AWS S3  является одним из самых дешевых и больших облачных сервисов хранения данных выпущенной компанией Amazon, и большинство крупных IT компаний стартапов используют S3, и архитектурно сервис Амазона прекрасно себя показывает, зачем же тогда выбирать другие сервисы хранилища?!
Например, если вам нужна собственная инфраструктура или законодательно вы не имеете права хранить данные за пределами вашей страны, и просто напросто вы разрабатываете свой MVP, то MinIO отлично вам подходит, вы можете уже на стадии разработки прототипа установить локально MinIO, как через утилитарные приложения вашей ОС так и с помощью docker-а, а с docker-compose - можно раскатить сразу несколько серверов, и с эмулировать на локали 👇.

Что прекрасного в AWS S3, так это API и SDK для большинства языков, и этот API уже стал стандартом для множества платформ. И как же это относится к MinIO? А вот так - MinIO поддерживает S3 API и вы можете использовать слой AWS реализации как загружать, получать, удалять и хранить свои файлы. А в будущем перейти на сервис Амазона.

И вся эта совместимость с AWS и распределенным хранилищем абсолютно бесплатна, проект открытый и свободный к использованию. Плюс, используя эту ссылку даже без установки MinIO серверов https://play.min.io/ и проверить API. Также если сравнить его установку с другими решениями из практики, например Ceph как реализацию на своих серврах AWS S3, то без фундаментальных знаний DevOps на коленке сервис Ceph поднять не получится. А с MinIO вы уже можете работать в две строчки кода, запустив докер контейнер, или как, говорил ранее использовать удаленное хранилише по ссылке https://play.min.io/

docker pull minio/minio
docker run -p 9000:9000 minio/minio server /data
Run MinIO on Docker to start using storage API locally

Также если вы работает на Mac OS, тогда вы можете использовать следующие команды для локальной установке MinIO сервера через Homebrew.

Установка minio пакетов используя Homebrew👇

Копируем и запускаем brew install minio/stable/minio minio server /data

Чтобы получить доступ к MinIO серверу(ам) вам нужно знать ключ доступа - ACCESS KEY и секретный ключ - SECRET KEY, рекомендуется устанавливать их в переменные окружения .

Больше деталей вы можете прочитать на сайте с официальной документацией: https://docs.min.io/

Так же в документации есть много примеров и клиентов для minio.

Без картинок архитектуры никак - вот как выглядит архитектура распределенного хранилища 👇🏿

Minio architecture

Из замеченного пока составлял следующий пример с Java клиентом для MinIO, заметил что в документации на сайте Java примеры немного не точны, особенно в части метода putObjects у реализации MinioClient-a , пропущен аргумент PutObjectOptions - который принимает полный размер файлов загружаемых и на сервер и размер частей, а также может добавлять мета информацию в виде ключ-значение. Смотрите на примеры работы клиентов в  github - там актуальная информация.

Собственно всё! Всем спасибо! Пишите комментарии, какие примеры и статьи вам интересно прочитать или разобрать.

P.S. docker-compose файл и команды для 4 серверов - 8ь нод

docker-compose pull
docker-compose up
version: '3.7'

# starts 4 docker containers running minio server instances. Each
# minio server's web interface will be accessible on the host at port
# 9001 through 9004.
services:
  minio1:
    image: minio/minio:RELEASE.2020-05-01T22-19-14Z
    volumes:
      - data1-1:/data1
      - data1-2:/data2
    ports:
      - "9001:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio2:
    image: minio/minio:RELEASE.2020-05-01T22-19-14Z
    volumes:
      - data2-1:/data1
      - data2-2:/data2
    ports:
      - "9002:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio3:
    image: minio/minio:RELEASE.2020-05-01T22-19-14Z
    volumes:
      - data3-1:/data1
      - data3-2:/data2
    ports:
      - "9003:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio4:
    image: minio/minio:RELEASE.2020-05-01T22-19-14Z
    volumes:
      - data4-1:/data1
      - data4-2:/data2
    ports:
      - "9004:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: minio123
    command: server http://minio{1...4}/data{1...2}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
  data1-1:
  data1-2:
  data2-1:
  data2-2:
  data3-1:
  data3-2:
  data4-1:
  data4-2: