MinIO
MinIO – популярный открытый сервер хранилища объектов, совместимый с сервисом облачных хранилищ Amazon S3.
Erasure Code
В MinIO Erasure Code представляет математический алгоритм для восстановления отсутствующих или поврежденных данных.
По умолчанию MinIO разделяет объекты на диски данных N / 2 и диски четности N / 2.
Т.е с 12 дисками, когда сервер MinIO работает в конфигурации по умолчанию, вы можете потерять любой из шести дисков и при этом надежно восстановить данные с оставшихся дисков.
На самом сайте его сравнивают с RAID и пишут что он лучше. Так как может выдержать падение половины дисков. На сайте они сравнивают его с RAID 6 и тут он конечно выигрывает. Но по сути то это и есть RAID 1 (зеркало).
Реальное преимущество в том что Erasure Code работает на объектном уровне и восстанавливает один объект за раз, а не весь диск как в случае с RAID.
MinIO разделяет предоставленные вами диски на группы Erasure Code от 4 до 16 дисков. Поэтому количество приводимых вами дисков должно быть кратным одному из этих чисел. Минимальное количество дисков, необходимых для распределенного MinIO, равно 4
Набор дисков делится на 2 группы Erasure Code. Например, 18 дисков настроены как 2 группы по 9 накопителей, а 24 диска настроены как 2 группы по 12 накопителей. Каждый объект записывается в одну группу Erasure Code.
Размер дисков может различаться, но естественно лучше не добавлять диски меньшим размером чем другие.
Bit Rot защита
Защита от порчи данных. MinIO использует высокоскоростные контрольные суммы HighwayHash для защиты от Bit Rot.
Высокая доступность
Распределенная установка MinIO с m серверами и n дисками будет защищать ваши данные, пока m / 2 серверы или m * n / 2 или более дисков находятся в сети. При этом данные будут доступны для чтения, но для записи понадобиться m / 2 + 1 серверов
Например, 16-серверная распределенная установка с 200 дисками на узел будет продолжать обслуживать файлы, даже если до 8 серверов отключены в конфигурации по умолчанию, т. Е. Около 1600 дисков могут выйти из строя. MinIO продолжит обслуживание файлов. Но для создания новых объектов вам понадобится как минимум 9 серверов.
MinIO даёт возможность использовать классы хранения, чтобы установить пользовательское распределение четности для каждого объекта
Добавляем разделы для MinIO
Я создал 4 диска по 17GB ( рекомендовано создавать диски одного размера ).
Создаём разделы
fdisk /dev/sdi
fdisk /dev/sdj
fdisk /dev/sdk
fdisk /dev/sdl
Форматируем их в ext4
mkfs.ext4 /dev/sdi1
mkfs.ext4 /dev/sdj1
mkfs.ext4 /dev/sdk1
mkfs.ext4 /dev/sdl1
Создаём папки назначения
mkdir /data1 /data2 /data3 /data4
Получаем UUID разделов
blkid /dev/sdi1
blkid /dev/sdj1
blkid /dev/sdk1
blkid /dev/sdl1
Редактируем /etc/fstab
vim /etc/fstab
UUID=40f71a62c6f6 /data1 ext4 defaults 0 0
UUID=9542fdd8bc84 /data2 ext4 defaults 0 0
UUID=aa96ce00c2b6 /data3 ext4 defaults 0 0
UUID=7f3de5487346 /data4 ext4 defaults 0 0
Монтируем разделы
mount -a
df -h
/dev/sdi1 17G 45M 16G 1% /data1
/dev/sdj1 17G 45M 16G 1% /data2
/dev/sdk1 17G 45M 16G 1% /data3
/dev/sdl1 17G 45M 16G 1% /data4
Установка и конфигурирование MinIO
useradd -r minio -s /sbin/nologin
firewall-cmd --add-port=9000/tcp --permanent
firewall-cmd --reload
chown -R minio:minio /data1 /data2 /data3 /data4
mkdir /usr/share/minio && cd /usr/share/minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
chown -R minio:minio /usr/share/minio
./minio server /data{1...4}
Заходим на http://127.0.0.1:9000 (minioadmin/minioadmin)
Использование tls
По умолчанию каталог с сертификатами находится по пути ${HOME}/.minio/certs, но есть возможность указать другой с помощью –certs-dir. Приватный ключ должен иметь имя private.key, публичный public.crt. Публичный сертификат также должен содержать промежуточные сертификаты.
mkdir /etc/ssl/certs/minio
cp public.crt /etc/ssl/certs/minio/public.crt
cp private.key /etc/ssl/certs/minio/private.key
./minio server /data{1...4} --certs-dir /etc/ssl/certs/minio/
Заходим на https://mydomain.lan:9000/
Я попробовал залить файл размером 4мб и в итоге получил куски по 2мб на каждом из дисков. 2 файла составляют залитый файл и 2 файла копия ( по сути объектный RAID 1 ).
Пользователи
В MinIO учетные данные администратора или корневые учетные данные могут быть изменены только с использованием переменных, а именно MINIO_ACCESS_KEY и MINIO_SECRET_KEY. Используя комбинацию этих двух значений, MinIO шифрует конфигурацию, хранящуюся в серверной части.э
Пример смены пароля:
export MINIO_ACCESS_KEY=newminio
export MINIO_SECRET_KEY=newminio123
export MINIO_ACCESS_KEY_OLD=minio
export MINIO_SECRET_KEY_OLD=minio123
./minio server /data
Запуск как сервиса systemd
vim /usr/lib/systemd/system/minio.service
[Unit]
Description=MinIO test cluster
DefaultDependencies=no
Wants=network.target # network is required
After=network.target
[Service]
WorkingDirectory=/usr/share/minio
ExecStart=./minio server /data{1...4} --certs-dir $certs_path
Restart=always
RestartSec=10
SyslogIdentifier=minio.service
User=minio
Group=minio
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
Environment=certs_path=/etc/ssl/certs/minio/
Environment=MINIO_ACCESS_KEY=minioadmin
Environment=MINIO_SECRET_KEY=minioadmin2
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable minio
systemctl start minio
Управление пользователями
#добавить пользователя
mc admin user add minio readeronly password123
#список пользователей
mc admin user list minio
#добавить группу
mc admin group add minio readergroup readeronly
#список групп
mc admin group list minio
#назначить политику для группы (writeonly, readonly или readwrite)
mc admin policy set minio/* readonly group=readergroup
#отключить пользователя
mc admin user disable minio readeronly
#удалить пользователя
mc admin user remove minio readeronly
При readonly в браузере вы ничего не увидите. Работать будет только через:
mc cat minio/2020/test.2
Тестирование
При umount /data1
сервис понял что пропал диск и в логах выдал:
DeploymentID: af2fbe1c-ec71-4f6f-bca8-c3a484f3e11d
minio.service[9152]: Error: open /data3/.writable-check-150748cd27ff66de.tmp: permission denied
minio.service[9152]: endpoint=/data3
minio.service[9152]: 2: github.com/minio/minio@/cmd/prepare-storage.go:57:cmd.glob..func5.1()
minio.service[9152]: 1: github.com/minio/minio@/cmd/erasure-sets.go:207:cmd.(*erasureSets).connectDisks.func1()
Т.е из лога понятно что сервис пытается время от времени создать файл ( каждые 10 секунд ) /data3/.writable-check-150748cd27ff66de.tmp
и если не получается выдаёт ошибки.
./mc admin info minio
показало 3 drives online, 1 drive offline
./mc cp /tmp/test.1 minio/2020/test.4
отработал нормально
./mc stat minio/2020/
вывел файлы
Заметил странное поведение в web версии, там при частом обновлении страницы попадаешь на We encountered an internal error, please try again..
mc stat
отрабатывает отлично
!!! Очень важно
Синхронизация файлов не сработала сама после mount /data1
. Т.е на разделе /data1 было на один файл меньше, чем на всех остальных. Чтобы синхронизация / rebuild прошла запускаем ./mc admin heal --recursive minio
При umount /dev/sdk1 /dev/sdi1 /dev/sdj1 mc не смог подключиться. Web ответил We encountered an internal error, please try again.
./mc cp /tmp/test.1 minio/2020/test.1
не сработало. При этом сам запрос висел, не убивался
./mc stat minio/2020/
выводит файлы
После mount всё заработало. Зависший copy отработал тоже ( меня хватило на 5 минут ожидания ).
Когда место кончается на диске получаем Error: Storage resources are insufficient for the write operation. Место нужно добавлять на всех дисках, на которых оно закончилось.
Распределенный MinIO
По сути всё тоже самое, только команда будет вида /usr/share/minio/minio server https://minio.lan:9000/data{1...4} https://minio-2.lan:9000/data{1...4}
на обоих серверах.
Важно чтобы логин и пароль от MinIO совпадали на обоих серверах, чтобы кол-во дисков и их размеры были одинаковы.
Нужно помнить что Write quorum N/2+1. Т.е если из 2 нод одна упала, то у вас будет только нода для чтения.
Плюсы
Защита от дурака присутствует, т.е при попытке удаления /data4 Device or resource busy. Даже при выключенном сервисе
Используя --address :9001
можно запустить несколько экземпляров с разными портами на одном сервере ( разделы дисков естественно должны быть разные, или папки )
Возможность отправлять логи об операциях с файлами. Причем систем для принятия логов поддерживается куча ( elk, postgresql и т.д )
Можно настроить автоматическое удаление объектов через указанное количество дней или указанную дату. ( Bucket Lifecycle )
Возможность подключить cache
Недостатки
Umount отрабатывает.
Непонятно почему нельзя было сделать автоматический heal. Можно запустить на любой ноде.
Если удалять файл при unmount какого-то диска, то на отключенном останется кусок файла. И после mount команда ./mc admin heal --recursive minio
ничего не изменит
Наверное было бы хорошо иметь возможность выставлять Write quorum 1. Хотя понять разработчиков можно, так все начнут выставлять в 1 и терять данные. В идеале 4 ноды по 4 диска. Минимальный кластер считаю 3 ноды по 2 диска или 4 ноды по 1 диску.
Ограничения
Я не уверен что кто-то в них упрётся, но можно почитать
MinIO client
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc config host add minio https://minio.lan:9000 minioadmin minioadmin2 #добавить узел
./mc admin info minio #вывод информации
./mc admin heal minio #восстановление
./mc ls minio/2020 #просмотр содержимого backet
./mc mb minio/newbucket #backet create
./mc rb minio/newbucket #backet delete
./mc stat minio/2020/ #инфо о файлах
./mc cp /tmp/test.1 minio/2020/test.1 #скопировать файл
./mc cat minio/2020/test.1 #вывод файла
./mc admin config set minio #получить все параметры конфигурации
./mc admin config set minio compression --env #получить ве параметры конфигурации compression в виде переменных
export MINIO_BROWSER=off #отключит web
mc admin service restart minio #перезагрузка кластера
Видео
Комментарии