Мы уже говорил о том, как не надо устанавливать сервер MinIO в production. В этой же статье как раз и поговорим о том, как же всё-таки надо ставить MinIO в productiion среде.

В распределенном режиме подразумевается, что у вас в общем 4 или более дисков (каталогов), которые могут быть отданы одной ноде либо нескольким. Конечно запускать всё на одной ноде в productiion среде не рекомендуется. Каждая нода MinIO в распределенном режиме имеет полную картину о других нодах так что ваше приложение может подключаться к любой ноде.

enter image description here

В распределенном режиме автоматически включается опция erasure code, которая дублирует ваши данные обеспечивая возможность не потерять данные при выходе из строя нод либо дисков. Можно сравнить данную функцию с RAID, но Erasure coding обеспечивает восстановление на уровне объекта с меньшими затратами.

В зависимости от того какую четность erasure code вы настроили вы можете продолжать операции чтения и записи только с m/2 серверами или m*n/2 дисками, подключенными к сети и доступными.

Распределенном режим также поддерживает следующие функции:

  • Репликация объектов
  • Блокировка однократной записи и многократного чтения
  • Версионность объекта

Требования

Каждая нода должна иметь доступ к другим нодам по API порту. Также все сервер MinIO должен быть запущен с использованием одинаковых портов на всех нодах.

MinIO рекомендуют использование балансировщика нагрузки для управления подключением к кластеру, например, NGINX, HAProxy.

minio requirements

Одинаковые имена

Для того чтобы развернуть MinIO в распределенном режиме ваши имена серверов должны называться так чтобы в итоге вы могли использовать регулярные выражения для передачи этих имён одной строкой создавая таким образом пул серверов (server pool).

Например имея такие имена серверов как minio1.example.com, minio2.example.com, minio3.example.com мы легко можем перечислить их одной строкой типа minio{1...3}.example.com.

minio server name

JBOD

При использовании MinIO рекомендуется использовать голые диски (JBOD) с типом файловой системы XFS.

minio hdd requirements

Если верить официальному сайту, то использование файловых систем, отличных от XFS как правило, имеют более низкую производительность.

Ещё одна рекомендация — это использовать одинаковые диски во всех нодах пула серверов, как тип жесткого диска, так и его размер. Кроме того, MinIO ограничивает размер используемого диска до самого маленького диска. Например, если в ноде есть 15 дисков по 10 ТБ и 1 диск по 1 ТБ, MinIO ограничивает емкость каждого диска до 1 ТБ, по сути, как и СХД.

Ну и еще одно логичное замечание — это то что все диски должны быть перемонтированы с использованием fstab, будет плохо если все диски пропадут после перезагрузки.

Одинаковая конфигурация

На сайте min.io сказано, что строго рекомендуется использовать сервера с одинаковым аппаратным обеспечением, хотя на мой взгляд это не так важно. Конечно использовать сервера с разным объёмом ОЗУ или количеством ядер не стоит, но вот какая разница какой производитель ОЗУ или количество планок я не совсем понимаю.

Планирование мощностей

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

Например, если ваше приложение за год создаёт файлы общим размером в 5ТБ, то вы должны иметь 15ТБ свободного дискового пространства.

Установка

Мы будем рассматривать установку MinIO в распределенном режиме, состоящую из одного пула серверов (Server Pool).

minio server pool

1. Установка сервера MinIO

На каждой ноде пула необходимо установить MinIO сервер, используя удобный нам метод.

Для установки сервера MinIO можно воспользоваться 3 методами:

  • Установка с использованием RPM (RHEL)
    wget https://dl.min.io/server/minio/release/linux-amd64/minio-20220523184511.0.0.x86_64.rpm -O minio.rpm
    sudo dnf install minio.rpm -y
    
  • Установка с использованием DEB(UBUNTU)
    wget https://dl.min.io/server/minio/release/linux-amd64/minio_20220519182059.0.0_amd64.deb -O minio.deb
    sudo dpkg -i minio.deb
    
  • Скачать бинарный файл
    wget https://dl.min.io/server/minio/release/linux-amd64/minio
    sudo mv minio /usr/local/bin/
    sudo chmod +x /usr/local/bin/minio
    

2. Создание systemd сервиса

Если вы установили с использованием deb или rpm пакета, то у вас уже создался файл сервиса по пути /etc/systemd/system/minio.service, если же нет, то придётся создавать его вручную.

sudo vim /etc/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local

User=minio-user
Group=minio-user
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

Обратите внимание на User и Group именно под этим пользователем и группой будет работать сервис, так что у этого пользователя должны быть полные права к каталогам с данными.

Для того чтобы добавить нового пользователя и сделать его владельцем каталогам с данными выполняем следующее:

sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user minio-user
sudo chown minio-user:minio-user /data1 /data2 /data3 /data4  

3. Создание файла с переменными

Как вы уже заметили в файле сервиса значениями многих параметров являются переменные, соответственно нам надо как-то передать эти переменные. Для этого нам понадобится создать файл /etc/default/minio и поместить в него переменные.

sudo vim /etc/default/minio
#собственно указываем сервера и директории для данных
MINIO_VOLUMES="https://minio{1...4}.example.net:9000/mnt/disk{1...4}/minio"
#порт консоли
MINIO_OPTS="--console-address :9001"
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=passw0rd
# URL-адрес балансировщика нагрузки 
# Это значение *должно* совпадать на всех серверах MinIO
# у вас нет балансировщика нагрузки, установите это значение на любой *один* из нод MinIO
MINIO_SERVER_URL="https://minio.example.net:9000"
sudo chown minio-user:minio-user /etc/default/minio

Также по желанию вы можете установить значения и для других переменных.

4. TLS/SSL сертификаты

Если вы хотите использовать https то вам понадобится пара открытого (.crt) и закрытого ключа (.key). Их нужно будет поместить в директорию ${HOME}/.minio/certs.

Если вы запускаете MinIO как сервис systemd то папкой ${HOME} будет являться домашняя директория пользователя, в нашем примере minio-user. Т.е. получается ключи нужно положить в директорию /home/minio-user/.minio/certs.

Если вы используете сертификат подписанный вашим личным центром сертификации то нужно будет поместить его публичный ключ в каталог /home/minio-user/.minio/certs/CAs. И это конечно же нужно делать на каждой ноде пула серверов.

Если вам чем-то не угодила папка сертификатов по умолчанию вы всегда можете задать свой собственный путь используя –certs-dir.

5. Настраиваем firewall

Ну и конечно нашим нодам нужно общаться между собой по портам 9000. Если у вас по умолчанию включен firewall а так собственно и должно быть, то необходимо его настроить.

sudo firewall-cmd --add-port=9000/tcp --permanent
sudo firewall-cmd --add-port=9001/tcp --permanent
sudo firewall-cmd --reload

5. Запускаем сервис MinIO

И вот мы наконец-то перешли уже к запуску сервера MinIO. Чтобы пул серверов заработал нужно запустить все ноды в пуле.

sudo systemctl enable minio.service
sudo systemctl start minio.service

Проверяем что наш сервис живой выполнив команду sudo systemctl status minio.service. Если с сервисом что-то пошло не так вы всегда можете посмотреть его логи выполнив команду journalctl -u minio.service.

6. Подключаемся к консоли

Используя ip-адрес или еще лучше DNS имя и порт любой ноды в пуле, мы можем получить доступ к консоли просто вбиваем эту информацию в адресной строке вашего любимого браузера. Вы также можете использовать любую ноду для подключения, так как все настройки и все данные находятся на каждой ноде.

В итоге получаем такую картину, где вбиваем логин и пароль (задавали в файле переменных). enter image description here

Используя консоль, вы можете создавать пользователей, права доступа, бакеты и т.д. Правда не всё можно сделать через консоль, поэтому необходимо также и установить MinIO Client.

7. Установка MinIO Client

Используя MinIO Client, вы получаете возможность управления сервером MinIO в командной строке.

wget https://dl.min.io/client/mc/release/linux-amd64/mc
sudo mv mc /usr/local/bin/mc
sudo chmod +x /usr/local/bin/mc

8. Создаём alias для сервера MinIO

Для того чтобы управлять сервером используя MinIO Client нужно задать серверу alias дабы не писать каждый раз адрес сервера и его логин и пароль. Если вы делаете это локально, т.е. на том же сервере где стоит сервер MinIO можно в качестве ip-адреса использовать 127.0.0.1. Но тут в отличии от консоли необходимо указывать API порт, который по умолчанию 9000.

Опять-таки вы можете создать alias для любой ноды в пуле ну или же на всех нодах локально, всё на ваше усмотрение.

mc alias set local http://127.0.0.1:9000 minioadmin minioadmin
Added `local` successfully.
mc admin info local
  127.0.0.1:9000
   Uptime: 19 minutes
   Version: 2022-05-19T18:20:59Z
  127.0.0.1:9000
   Uptime: 19 minutes
   Version: 2022-05-19T18:20:59Z
  127.0.0.1:9000
   Uptime: 19 minutes
   Version: 2022-05-19T18:20:59Z

Команда mc admin info local выводит нам всю информацию о нодах MinIO.