Мы уже говорил о том, как не надо устанавливать сервер MinIO в production. В этой же статье как раз и поговорим о том, как же всё-таки надо ставить MinIO в productiion среде.
В распределенном режиме подразумевается, что у вас в общем 4 или более дисков (каталогов), которые могут быть отданы одной ноде либо нескольким. Конечно запускать всё на одной ноде в productiion среде не рекомендуется. Каждая нода MinIO в распределенном режиме имеет полную картину о других нодах так что ваше приложение может подключаться к любой ноде.
В распределенном режиме автоматически включается опция erasure code
, которая дублирует ваши данные обеспечивая возможность не потерять данные при выходе из строя нод либо дисков. Можно сравнить данную функцию с RAID, но Erasure coding
обеспечивает восстановление на уровне объекта с меньшими затратами.
В зависимости от того какую четность erasure code
вы настроили вы можете продолжать операции чтения и записи только с m/2 серверами или m*n/2 дисками, подключенными к сети и доступными.
Распределенном режим также поддерживает следующие функции:
- Репликация объектов
- Блокировка однократной записи и многократного чтения
- Версионность объекта
Требования
Каждая нода должна иметь доступ к другим нодам по API порту. Также все сервер MinIO должен быть запущен с использованием одинаковых портов на всех нодах.
MinIO рекомендуют использование балансировщика нагрузки для управления подключением к кластеру, например, NGINX, HAProxy.
Одинаковые имена
Для того чтобы развернуть MinIO в распределенном режиме ваши имена серверов должны называться так чтобы в итоге вы могли использовать регулярные выражения для передачи этих имён одной строкой создавая таким образом пул серверов (server pool).
Например имея такие имена серверов как minio1.example.com
, minio2.example.com
, minio3.example.com
мы легко можем перечислить их одной строкой типа minio{1...3}.example.com
.
JBOD
При использовании MinIO рекомендуется использовать голые диски (JBOD) с типом файловой системы XFS.
Если верить официальному сайту, то использование файловых систем, отличных от XFS как правило, имеют более низкую производительность.
Ещё одна рекомендация — это использовать одинаковые диски во всех нодах пула серверов, как тип жесткого диска, так и его размер. Кроме того, MinIO ограничивает размер используемого диска до самого маленького диска. Например, если в ноде есть 15 дисков по 10 ТБ и 1 диск по 1 ТБ, MinIO ограничивает емкость каждого диска до 1 ТБ, по сути, как и СХД.
Ну и еще одно логичное замечание — это то что все диски должны быть перемонтированы с использованием fstab
, будет плохо если все диски пропадут после перезагрузки.
Одинаковая конфигурация
На сайте min.io сказано, что строго рекомендуется использовать сервера с одинаковым аппаратным обеспечением, хотя на мой взгляд это не так важно. Конечно использовать сервера с разным объёмом ОЗУ или количеством ядер не стоит, но вот какая разница какой производитель ОЗУ или количество планок я не совсем понимаю.
Планирование мощностей
Также рекомендуется брать железо для MinIO с расчётом на то что вы не будете его апгрейдить как минимум еще 2 года.
Например, если ваше приложение за год создаёт файлы общим размером в 5ТБ, то вы должны иметь 15ТБ свободного дискового пространства.
Установка
Мы будем рассматривать установку 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 имя и порт любой ноды в пуле, мы можем получить доступ к консоли просто вбиваем эту информацию в адресной строке вашего любимого браузера. Вы также можете использовать любую ноду для подключения, так как все настройки и все данные находятся на каждой ноде.
В итоге получаем такую картину, где вбиваем логин и пароль (задавали в файле переменных).
Используя консоль, вы можете создавать пользователей, права доступа, бакеты и т.д. Правда не всё можно сделать через консоль, поэтому необходимо также и установить 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.
Комментарии