Поехали!

И так, допустим вам приспичило поднять своё собственное 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, ну и любые другие вещи на ваше усмотрение.

Спасибо за внимание и потраченное время с трафиком.

Комментарии (14)


  1. vasyakrg
    14.12.2021 09:58
    +2

    а еще можно прям на докерах (без куба, на умершем сворме) - https://github.com/vasyakrg/minio

    или так

    https://github.com/vasyakrg/docker-proxmox-s3


    1. Shaz Автор
      14.12.2021 10:25
      +2

      Можно. А зачем?

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

      Но если у вас есть куб, то вероятно он в облаке.

      Если у вас есть облако, то вероятно там уже есть s3 как сервис.

      А на начальном этапе разбирательств, докер добавляет лишний слой абстракции, который вроде как упрощает запуск. (Ну да, скачать один бинарь и стартануть это аццки сложно.)

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


      1. vasyakrg
        14.12.2021 10:31
        +2

        конфигурирование кучи сервисов из вашего мана может создать кучу непоняток.

        вот например совсем недавно (когда эти самые мамины парни вдруг решили разнести админку и консольный порт на разные порты) нельзя было одновременно использовать ключи --address :9000 --console-address :9001

        второй момент по кубу. уже с пару лет (поправьте, могу путать) как был rook-оператор, который вот взял и забил на минио и перестал его поддерживать с фразой "нецелесообразно".

        а то что при наличии куба есть s3 - не факт. в облаке допустим, дома на пет-сервере все равно что-то такое будешь себе городить. наверное..

        ну и мой мессадж был про то, что можно взять имадж и запустить так же надежно его в сворме (не качаю за него совсем, но когда нет куба, а Уже есть сворм - то это вариант)


        1. Shaz Автор
          14.12.2021 10:46

          Если кто-то вдруг решит что данный пост это призыв повторять один-в-один, и что это является маном - ой. Тут даже плашки “Tutorial” нет.

          Ну и это, количество постов про то как сделать docker pull и без меня огромно. Почему немного не разнообразить их башатиной?


          1. vasyakrg
            14.12.2021 10:47
            +1

            башатина - тема :) тут уж не поспоришь..


          1. il_da_r
            14.12.2021 13:17

            а как же ansiblятина?)


            1. Shaz Автор
              14.12.2021 13:19

              Недостаточно сурово.

              Максимально сурово было бы на cfengine, но я пока к такому не готов.


          1. Kirikekeks
            16.12.2021 23:13

            Спасибо, дельно. Но в моей картине мира "башите, ли братия, начати старыми словесами" функция, объявленная до переменной не работает. Но верю, что этот скрипт сделал, всё, что описано. Счётчик $disk_count. Просто не понимаю почему.


            1. Shaz Автор
              16.12.2021 23:19

              Оно в самом деле работает. В centos 7.6 прям точно точно.

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


        1. GrgPlus93
          14.12.2021 18:39

          Да уж, "куча сервисов". Как бы не сломаться от сложности. А когда нет куба и сворма - то вариант поставить по-человечески и не устраивать цирк из оверлеев и вольюмов, ковыряния дырок для разных юзеров, капабилетей, сетей и привязки всего к демону докера с его обвязками из шимов. Один бинарь. Минио - это даже не пять, это один бинарь. Есть какой-то предел когда у людей хотя бы неловкость какая-то просыпается?


          1. vasyakrg
            14.12.2021 18:43
            +1

            ой ты господи, вам бы велосипед подарить, чего ж вы злой то такой ? :)

            в доке минио все эти решения есть. каждое удобно в уже существующей инфре.

            если нет куба и сворма, да конечно же бинарь и в lxc его, как у меня дома например. и без всяких там "по четыре диска на ноду" и прочее. ну чего уж там ?


  1. vasyakrg
    14.12.2021 10:36

    еще минио прикольно себя ведет, когда делаешь на нем хостинг фоток или как я на одной инсталляции собрал rsync в него всех вложений из rocketChat. когда их переваливает за несколько тысяч в одной дире, память просто уже десятками гигов начинает кушаться.

    в остальном же - отлиный и главное - бесплатный инструмент. но вот сижу я пока на их старой версии, когда еще все было на 9000 порту. нововведения я как-то пока не принял.


    1. Shaz Автор
      14.12.2021 10:48
      +1

      Про его поведение под разной нагрузкой, потерю нод и дисков думаю тоже напишу.

      Но сперва для этого надо собрать данные)


  1. Zoro
    14.12.2021 11:35

    .