MinIO

MinIO – популярный открытый сервер хранилища объектов, совместимый с сервисом облачных хранилищ Amazon S3.

MinIO standalone mode

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 #перезагрузка кластера

Видео