Pull to refresh

Собираем демо-кластер Minio, потому что можем

Reading time4 min
Views13K

Поехали!

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

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

Tags:
Hubs:
Total votes 10: ↑5 and ↓50
Comments17

Articles