Поехали!
И так, допустим вам приспичило поднять своё собственное s3 хранилище. Немного погуглив вы наткнулись на minio.
И выполнив рекомендации из Quickstart радостно ��ачали им пользоваться.
Но тут захотелось чего-то большего. Например собрать кластер.
И тут нас может ожидать первое разочарование - нам понадобится 4 сервера и 4 диска на каждом. Такой вот минимальный набор для старта.
И так создав в своем любимом гипервизоре 4 свежих ВМ, любым привычным вам способом, и накатив туда какую-то ОС (ну кроме Windows, под это сами пост пишите) докидываем к каждой по 4 виртуальных диска. Или можно заморочиться и сразу создать разделы под будущие диски minio, это как вам удобнее. Главное помнить что отдать ему директорию на рутовом разделе уже не выйдет, вместо кластера получите ошибки разной степени информативности в логах.

Так как повторять все необходимые процедуры вручную было откровенно лениво, то пришлось отвлечься и написать скрипт. На самом деле даже два:
#!/bin/bash if getent passwd minio $2 > /dev/null; then echo "Ok. User exist" else useradd minio fi if [ ! -d /var/lib/minio ]; then mkdir -p /var/lib/minio fi if [ ! -f /etc/default/minio ]; then touch /etc/default/minio chown minio:minio /etc/default/minio fi cd /var/lib/minio wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x /var/lib/minio/minio chown -R minio:minio /var/lib/minio
#!/bin/bash disk_list=$(lsblk | grep sd[b-e] | awk '{print $1}') disk_array+=( $disk_list ) function create_lvm { pvcreate /dev/$disk_name if [ ! -d /dev/s3 ]; then vgcreate s3 /dev/$disk_name else vgextend s3 /dev/$disk_name fi lvcreate -n disk$disk_count -L 4.75G s3 mkfs.ext4 -L disk$disk_count /dev/s3/disk$disk_count if [ ! -d /s3/disk$disk_count ]; then mkdir -p /s3/disk$disk_count fi if grep -q "/dev/mapper/s3-disk$disk_count /s3/disk$disk_count ext4 relatime 0 2" /etc/fstab; then echo "OK record exist" else echo "/dev/mapper/s3-disk$disk_count /s3/disk$disk_count ext4 relatime 0 2" >> /etc/fstab fi } disk_count=0 for disk_name in ${disk_array[*]} do disk_count=$(( $disk_count + 1 )) create_lvm done mount -a chown -R minio:minio /s3 chown -R minio:minio /s3/disk*
Первый скрипт скачает непосредственно minio, заведет пользователя, создаcт директории, файлы для конфига и тд. Второй скрипт - добавит в систему диски которые мы ранее подключили к ВМ, если будете пользоваться - стоит обратить внимание на имена устройств, и размер создаваемых Logical Volume
. (Если же вы озаботились этим еще на стадии установки ОС, то понятно что это вам не нужно. Но думаю вы и так в курсе.)
Теперь нам осталось добавить конфиг и сервис в systemd. (Если выбранный вами дистрибутив имеет отличную от systemd систему инициализации, то полагаю вы лучше меня знаете что делать.) И так:
# Volume to be used for MinIO server. MINIO_VOLUMES="http://s3node{1...4}:9000/s3/disk{1...4}" # Use if you want to run MinIO on a custom port. MINIO_OPTS="--address :9000 --console-address :9001" # Root user for the server. MINIO_ROOT_USER="admin" # Root secret for the server. MINIO_ROOT_PASSWORD="password" MINIO_SERVER_URL="http://s3node1:9000"
Это минимально необходимый для старта конфиг.
Стоит обратить внимание на строчку MINIO_VOLUMES, да, конструкция содержащая {1...n} в данном случае абсолютно верная и рабочая. Альтернативой будет нудное и кучное перечисление всех хостов с дисками в строчку.
Вместо имен хостов можно использовать и ip, но зачем если есть DNS?
Остальную кучу параметров полагаю вы опробуете самостоятельно в ходе дальнейших экспериментов.
Не забываем про настройку фаерволла, selinux и тд.
Теперь сервис systemd (честно позаимствованный на просторах кажется гитхаба):
[Unit] Description=MinIO Documentation=https://docs.min.io Wants=network-online.target After=network-online.target AssertFileIsExecutable=/var/lib/minio/minio [Service] WorkingDirectory=/var/lib/minio User=minio Group=minio 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=/var/lib/minio/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
Если к этому моменту не появились какие-то невнятные ошибки, сбои и прочее НЕХ, то...

И так, нам остается выполнить краткий набор команд:
systemctl enable minio.service
systemctl start minio.service
Ну и journalctl -f (или -e) -u minio.service и надеятся что в логе будет что-то такое:

Теперь нам остается перейти на http://<что-то-там>:9001, залогинится с кредами MINIO_ROOT_USER и MINIO_ROOT_PASSWORD, и если все по прежнему хорошо, то увидеть вот такую приятную картину:

Теперь можно спокойно разбираться с отказоустойчивостью, бакетами, прикручивать SSL и внешнюю балансировку, ставить консольный minio-client, ну и любые другие вещи на ваше усмотрение.
Спасибо за внимание и потраченное время с трафиком.