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