Поехали!
И так, допустим вам приспичило поднять своё собственное 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)
vasyakrg
14.12.2021 10:36еще минио прикольно себя ведет, когда делаешь на нем хостинг фоток или как я на одной инсталляции собрал rsync в него всех вложений из rocketChat. когда их переваливает за несколько тысяч в одной дире, память просто уже десятками гигов начинает кушаться.
в остальном же - отлиный и главное - бесплатный инструмент. но вот сижу я пока на их старой версии, когда еще все было на 9000 порту. нововведения я как-то пока не принял.
Shaz Автор
14.12.2021 10:48+1Про его поведение под разной нагрузкой, потерю нод и дисков думаю тоже напишу.
Но сперва для этого надо собрать данные)
vasyakrg
а еще можно прям на докерах (без куба, на умершем сворме) - https://github.com/vasyakrg/minio
или так
https://github.com/vasyakrg/docker-proxmox-s3
Shaz Автор
Можно. А зачем?
Если есть необходимость запуска именно в контейнерах, то полагаю стоит выбрать оператор и стартануть в кубе.
Но если у вас есть куб, то вероятно он в облаке.
Если у вас есть облако, то вероятно там уже есть s3 как сервис.
А на начальном этапе разбирательств, докер добавляет лишний слой абстракции, который вроде как упрощает запуск. (Ну да, скачать один бинарь и стартануть это аццки сложно.)
Но попутно он может добавить дополнительных проблем и непоняток.
vasyakrg
конфигурирование кучи сервисов из вашего мана может создать кучу непоняток.
вот например совсем недавно (когда эти самые мамины парни вдруг решили разнести админку и консольный порт на разные порты) нельзя было одновременно использовать ключи --address :9000 --console-address :9001
второй момент по кубу. уже с пару лет (поправьте, могу путать) как был rook-оператор, который вот взял и забил на минио и перестал его поддерживать с фразой "нецелесообразно".
а то что при наличии куба есть s3 - не факт. в облаке допустим, дома на пет-сервере все равно что-то такое будешь себе городить. наверное..
ну и мой мессадж был про то, что можно взять имадж и запустить так же надежно его в сворме (не качаю за него совсем, но когда нет куба, а Уже есть сворм - то это вариант)
Shaz Автор
Если кто-то вдруг решит что данный пост это призыв повторять один-в-один, и что это является маном - ой. Тут даже плашки “Tutorial” нет.
Ну и это, количество постов про то как сделать docker pull и без меня огромно. Почему немного не разнообразить их башатиной?
vasyakrg
башатина - тема :) тут уж не поспоришь..
il_da_r
а как же ansiblятина?)
Shaz Автор
Недостаточно сурово.
Максимально сурово было бы на cfengine, но я пока к такому не готов.
Kirikekeks
Спасибо, дельно. Но в моей картине мира "башите, ли братия, начати старыми словесами" функция, объявленная до переменной не работает. Но верю, что этот скрипт сделал, всё, что описано. Счётчик $disk_count. Просто не понимаю почему.
Shaz Автор
Оно в самом деле работает. В centos 7.6 прям точно точно.
Вроде там disk_count был, может при копипасте что-то сбилось. Проверю и исправлю если что Идея оформить это в пост пришла внезапно, уже после того как все было сделано.
GrgPlus93
Да уж, "куча сервисов". Как бы не сломаться от сложности. А когда нет куба и сворма - то вариант поставить по-человечески и не устраивать цирк из оверлеев и вольюмов, ковыряния дырок для разных юзеров, капабилетей, сетей и привязки всего к демону докера с его обвязками из шимов. Один бинарь. Минио - это даже не пять, это один бинарь. Есть какой-то предел когда у людей хотя бы неловкость какая-то просыпается?
vasyakrg
ой ты господи, вам бы велосипед подарить, чего ж вы злой то такой ? :)
в доке минио все эти решения есть. каждое удобно в уже существующей инфре.
если нет куба и сворма, да конечно же бинарь и в lxc его, как у меня дома например. и без всяких там "по четыре диска на ноду" и прочее. ну чего уж там ?