Thank you for reading this post, don't forget to subscribe!
1. Настройка minio в кластере
2. Настройка точки входа по домену
3. Проверка работы
Minio – это открытый сервер хранения объектов, который может хранить неструктурированные данные – фотографии, видеоролики, образы виртуальной машины, контейнеры и файлы логов – в качестве объектов. В распределенном режиме Minio предоставляет единый сервер хранения объектов, который объединяет несколько дисков, распределенных между несколькими серверами.
В целом, Minio подходит для следующих случаев:
- хранилище без репликации поверх надежной файловой системы с доступом по S3 (малые и средние хранилища, размещенные на NAS и SAN);
- хранилище без репликации поверх ненадежной файловой системы с доступом по S3 (для разработки и тестирования);
- хранилище с репликацией на небольшой группе серверов в одной стойке с доступом по протоколу S3 (отказоустойчивое хранилище с доменом отказа равным стойке).
Часть вызовов API S3 в Minio не поддерживается, однако, для большинства применений это не является ограничением.
Для кластера необходимо чётное количество серверов.
есть 4 сервера:
minio1 - 192.168.1.201
minio2 - 192.168.1.202
minio3 - 192.168.1.203
minio4 - 192.168.1.204
1 2 3 4 5 6 7 8 |
на всех серверах добавляем в /etc/hosts [root@minio1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.201 minio1 192.168.1.202 minio2 192.168.1.203 minio3 192.168.1.204 minio4 |
На каждом сервере у нас будет добавлен дополнительный диск, примонтированный в директории /minio
pvcreate /dev/sdb
vgextend centos /dev/sdb
lvcreate -n minio -L 5G centos
mkfs.ext4 -L minio /dev/mapper/centos-minio
mkdir /minio
mount /dev/mapper/centos-minio /minio/
cat /etc/fstab | grep minio
/dev/mapper/centos-minio /minio ext4 defaults 1 2
Следующие действия выполняются также НА КАЖДОМ СЕРВЕРЕ
Загрузите бинарный файл Minio:
curl -O https://dl.minio.io/server/minio/release/linux-amd64/minio
В рабочий каталог будет загружен файл minio. Сделайте его исполняемым:
chmod +x minio
Переместите файл в /usr/local/bin, где его будет искать скрипт запуска.
mv minio /usr/local/bin
По соображениям безопасности не следует запускать сервер Minio как root. Скрипт systemd (который используется в следующем разделе) ищет учетную запись пользователя и группу по имени minio-user, давайте создадим их сейчас.
useradd -r minio -s /sbin/nologin
Передайте этому пользователю права на файл:
chown minio:minio /usr/local/bin/minio
Затем нужно создать каталог, в котором Minio будет хранить файлы, у нас это примонтированный ранее раздел /minio
Передайте права на каталог пользователю minio-user:
chown minio:minio /minio
Обычно конфигурационные файлы Minio хранятся в каталоге /etc. Создайте в нем отдельный подкаталог.
mkdir /etc/minio
Передайте права на каталог пользователю minio-user:
chown minio:minio /etc/minio
С помощью текстового редактора создайте файл среды, в котором можно изменить настройки по умолчанию.
vim /etc/default/minio
я устанавливаю свой ключ доступа и секретный ключ , поэтому я устанавливаю для него конфигурацию по умолчанию для minio:
Добавьте в файл следующие переменные:
[codesyntax lang="php"]
1 2 3 4 5 |
MINIO_ACCESS_KEY="minio" MINIO_VOLUMES=/minio/ MINIO_OPTS="http://minio-1:9000/minio http://minio-2:9000/minio http://minio-3:9000/minio http://minio-4:9000/minio" MINIO_SECRET_KEY="miniostorage" |
[/codesyntax]
- MINIO_VOLUMES: указывает на каталог для хранения объектов.
- MINIO_OPTS: изменяет поведение сервера. Флаг –C указывает, какой конфигурационный файл должен использовать сервер Minio. По умолчанию используется порт 9000, но вы можете выбрать любой другой порт.
Сохраните и закройте файл.
chown minio:minio /etc/default/minio
Теперь нужно добавить Minio в систему инициализации systemd. Для начала загрузите дескриптор Minio:
wget https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service
После завершения загрузки в рабочем каталоге появится файл minio.service.
Откройте minio.service в текстовом редакторе, чтобы просмотреть его содержимое:
vim minio.service
правим там имя пользователя, рабочую директорию и так как с переменными не захотел нормально работать то и ExecStart:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[Unit] Description=minio Documentation=https://docs.min.io Wants=network-online.target After=network-online.target AssertFileIsExecutable=/usr/local/bin/minio [Service] WorkingDirectory=/minio User=minio Group=minio EnvironmentFile=/etc/default/minio ExecStart=/usr/local/bin/minio server http://minio-1:9000/minio http://minio-2:9000/minio http://minio-3:9000/minio http://minio-4:9000/minio Restart=always LimitNOFILE=65536 TimeoutStopSec=infinity SendSIGKILL=no [Install] WantedBy=multi-user.target |
[/codesyntax]
Systemd хранит все unit-файлы в каталоге конфигураций systemd. Откройте этот каталог:
mv minio.service /etc/systemd/system
Запустите следующую команду, чтобы перезапустить сервисы systemd:
systemctl daemon-reload
ещё раз на всякий случай правим владельца на всех директориях
chown -R minio:minio /etc/default/minio /usr/local/bin/minio /minio /etc/minio/
Добавьте Minio в автозагрузку:
systemctl enable minio
systemctl start minio
systemctl status minio
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[root@minio1 ~]# systemctl status minio ● minio.service - minio Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2020-08-16 20:03:38 +06; 4min 12s ago Docs: https://docs.min.io Main PID: 21420 (minio) CGroup: /system.slice/minio.service └─21420 <strong>/usr/local/bin/minio server http://minio-1:9000/minio http://minio-2:9000/minio http://minio-3:9000/minio http://minio-4:9000/minio</strong> Aug 16 20:03:41 minio1 minio[21420]: Endpoint: http://192.168.1.201:9000 http://127.0.0.1:9000 Aug 16 20:03:41 minio1 minio[21420]: Browser Access: Aug 16 20:03:41 minio1 minio[21420]: http://192.168.1.201:9000 http://127.0.0.1:9000 Aug 16 20:03:41 minio1 minio[21420]: Object API (Amazon S3 compatible): Aug 16 20:03:41 minio1 minio[21420]: Go: https://docs.min.io/docs/golang-client-quickstart-guide Aug 16 20:03:41 minio1 minio[21420]: Java: https://docs.min.io/docs/java-client-quickstart-guide Aug 16 20:03:41 minio1 minio[21420]: Python: https://docs.min.io/docs/python-client-quickstart-guide Aug 16 20:03:41 minio1 minio[21420]: JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide Aug 16 20:03:41 minio1 minio[21420]: .NET: https://docs.min.io/docs/dotnet-client-quickstart-guide Aug 16 20:03:41 minio1 minio[21420]: Waiting for all MinIO IAM sub-system to be initialized.. lock acquired |
[/codesyntax]
проверяем, заходим:
http://192.168.1.201:9000/minio/login
тут вбиваем наши логин пароль который мы задавали тут:
[root@minio1 ~]# cat /etc/default/minio | grep KEY
MINIO_ACCESS_KEY="minio"
MINIO_SECRET_KEY="miniostorage"
теперь создадим директорию в которую сможем загружать файлы:
в правом нижнем углу нажимаем на крестик
набираем имя и нажимаем enter
кстати заглавные буквы нельзя использовать но мне лень переделывать скриншот так что пишите маленькими буквами.
как видим директория успешно создана. Теперь можем добавим файл:
грузим файл:
все действия с файлом можем производить нажимая на ".…" справа от файла:
теперь проверяем наличие этого файла на серверах:
[root@minio1 ~]# ll /minio/test/
total 4
drwxr-xr-x 3 minio minio 4096 Aug 16 20:21 200px-Brutal.png
[root@minio2 ~]# ll /minio/test/
total 4
drwxr-xr-x 3 minio minio 4096 Aug 16 20:21 200px-Brutal.png
[root@minio3 ~]# ll /minio/test/
total 4
drwxr-xr-x 3 minio minio 4096 Aug 16 20:21 200px-Brutal.png
[root@minio4 ~]# ll /minio/test/
total 4
drwxr-xr-x 3 minio minio 4096 Aug 16 20:21 200px-Brutal.png
как видим файл появился на всех тачках.
Настройка точки входа по домену.
На все ноды ставим nginx
yum install nginx -y
создаём конфиг файл:
[root@minio1 ~]# cat /etc/nginx/conf.d/minio.test.ru.conf
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
upstream minio_servers { server minio-1:9000 max_fails=3 fail_timeout=30s; server minio-2:9000 max_fails=3 fail_timeout=30s; server minio-3:9000 max_fails=3 fail_timeout=30s; server minio-4:9000 max_fails=3 fail_timeout=30s; } server { listen 80; server_name minio.test.ru; location / { proxy_set_header Host $http_host; proxy_pass http://minio_servers; } } |
[/codesyntax]
копируем его на каждый из серверов:
1 2 3 4 5 6 7 |
[root@minio1 ~]# for i in {2..4}; do <strong>scp /etc/nginx/conf.d/minio.test.ru.conf</strong> 192.168.1.20$i:/etc/nginx/conf.d/minio.test.ru.conf; done root@192.168.1.202's password: minio.test.ru.conf 100% 297 201.4KB/s 00:00 root@192.168.1.203's password: minio.test.ru.conf 100% 297 263.6KB/s 00:00 root@192.168.1.204's password: minio.test.ru.conf 100% 297 320.9KB/s 00:00 |
добавляем в автозагрузку и стартуем nginx на всех нодах:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@minio1 ~]# for i in {1..4}; do ssh -t 192.168.1.20$i "<strong>systemctl enable nginx && systemctl start nginx</strong>"; done root@192.168.1.201's password: Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. Connection to 192.168.1.201 closed. root@192.168.1.202's password: Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. Connection to 192.168.1.202 closed. root@192.168.1.203's password: Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. Connection to 192.168.1.203 closed. root@192.168.1.204's password: Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. Connection to 192.168.1.204 closed. |
проверяем что всё пашет, открываем по домену:
как видим слева снизу поменялось имя.
ну а чтобы прям всегда пахало ставим keepalived на который мы и повесим домен
[root@minio1 ~]# yum install keepalived -y
[root@minio2 ~]# yum install keepalived -y
[root@minio3 ~]# yum install keepalived -y
[root@minio4 ~]# yum install keepalived -y
Включаем маршрутизацию пакетов
[root@minio1 ~]# cat /etc/sysctl.conf | grep -v ^#
net.ipv4.ip_forward=1
копируем на все тачки
[root@minio1 ~]# for i in {2..4}; do scp /etc/sysctl.conf 192.168.1.20$i:/etc/sysctl.conf; done
и применяем:
[root@minio1 ~]# for i in {1..4}; do ssh -t 192.168.1.20$i "sysctl -p"; done
теперь создадим конфиги:
[root@minio1 ~]# cat /etc/keepalived/keepalived.conf
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
global_defs { notification_email { mid@test.ru } notification_email_from Andrey@test.ru smtp_server localhost smtp_connect_timeout 30 router_id centos1 } vrrp_instance VI_1 { state MASTER interface enp0s3 virtual_router_id 51 priority 100 advert_int 4 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.200 dev enp0s3 label enp0s3:vip } } |
[/codesyntax]
[root@minio2 ~]# cat /etc/keepalived/keepalived.conf
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
global_defs { notification_email { mid@test.ru } notification_email_from Andrey@test.ru smtp_server localhost smtp_connect_timeout 30 router_id centos1 } vrrp_instance VI_1 { state BACKUP interface enp0s3 virtual_router_id 51 priority 99 advert_int 4 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.200 dev enp0s3 label enp0s3:vip } } |
[/codesyntax]
[root@minio3 ~]# cat /etc/keepalived/keepalived.conf
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
global_defs { notification_email { mid@test.ru } notification_email_from Andrey@test.ru smtp_server localhost smtp_connect_timeout 30 router_id centos1 } vrrp_instance VI_1 { state BACKUP interface enp0s3 virtual_router_id 51 priority 98 advert_int 4 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.200 dev enp0s3 label enp0s3:vip } } |
[/codesyntax]
[root@minio4 ~]# cat /etc/keepalived/keepalived.conf
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
global_defs { notification_email { mid@test.ru } notification_email_from Andrey@test.ru smtp_server localhost smtp_connect_timeout 30 router_id centos1 } vrrp_instance VI_1 { state BACKUP interface enp0s3 virtual_router_id 51 priority 97 advert_int 4 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.200 dev enp0s3 label enp0s3:vip } } |
[/codesyntax]
теперь добавляем их в автозагрузку и стартуем:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@minio1 ~]# for i in {1..4}; do ssh -t 192.168.1.20$i "<strong>systemctl enable keepalived && systemctl start keepalived</strong>"; done root@192.168.1.201's password: Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service. Connection to 192.168.1.201 closed. root@192.168.1.202's password: Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service. Connection to 192.168.1.202 closed. root@192.168.1.203's password: Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service. Connection to 192.168.1.203 closed. root@192.168.1.204's password: Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service. Connection to 192.168.1.204 closed. |
проверяем что виртуальный айпишник поднялся:
1 2 3 |
[root@<strong>minio1</strong> ~]# ip a | grep 'inet 192' inet 192.168.1.201/24 brd 192.168.1.255 scope global noprefixroute enp0s3 inet <strong>192.168.1.200</strong>/32 scope global enp0s3:vip |
далее можем привязывать на DNS домен minio.test.ru к IP 192.168.1.200
Проверка работы
Вырубаем первый сервер minio1
[root@minio1 ~]# poweroff
смотрим что IP переехал:
1 2 3 |
[root@<strong>minio2</strong> ~]# ip a | grep 'inet 192' inet 192.168.1.202/24 brd 192.168.1.255 scope global noprefixroute enp0s3 inet <strong>192.168.1.200</strong>/32 scope global enp0s3:vip |
проверяем доступность сайта
http://minio.test.ru/
видим по логам что всё ок, отвечает второй сервер:
1 2 |
[root@<strong>minio2</strong> ~]# <strong>cat /var/log/nginx/access.log</strong> | tail -1 192.168.1.5 - - [16/Aug/2020:21:06:36 +0600] "POST /minio/webrpc HTTP/1.1" 200 214 "http://<strong>minio.test.ru</strong>/minio/fhgfh/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36" "-" |
вырубаем и этот сервер:
[root@minio2 ~]# poweroff
всё должно уйти на 3ий сервер. А теперь расскажу как эта херь пашет:
из 4 вырубаем 1 - работает
из 4 вырубаем 2 - чтение ещё работает запись уже нет
минимум 2 диска должно работать