MinIo для самых маленьких

    MinIO — прекрасное решение, когда надо легко и просто организовать объектное хранилище. Элементарная настройка, множество платформ и хорошая производительность сделали своё дело на ниве народной любви. Так что у нас не было другого пути, как месяц назад заявить о совместимости Veeam Backup & Replication и MinIO. Включая такую важную функцию, как Immutability. На самом деле у MinIO есть целый раздел в документации, посвящённый нашей интеграции.

    Поэтому сегодня мы поговорим о том, как:

    • Настроить MinIO очень быстро.
    • Настроить MinIO чуть менее быстро, но значительно качественней.
    • Использовать его в качестве Archive Tier для масштабируемого репозитория Veeam SOBR.



    Что ты такое?


    Краткая вводная для тех, кто не сталкивался с MinIO. Это опенсорсное объектное хранилище, совместимое с Amazon S3 API. Выпускается под лицензией Apache v2 и придерживается философии спартанского минимализма.

    То есть у него нет развесистого GUI с дашбордами, графиками и многочисленными меню. MinIO просто запускает свой сервер одной командой, на котором можно просто хранить данные, используя всю мощь S3 API. Но надо заметить, что простота эта может быть обманчива, когда речь заходит об используемых ресурсах. RAM и CPU поглощаются на отлично, но о причинах будет ниже. И, к слову сказать, такие комбайны, как FreeNAS и TrueNAS под капотом используют именно MinIO.

    На этом введение можно и заканчивать.

    Настройка MinIO очень быстро


    Настройка его настолько быстра, что мы рассмотрим её для Windows и Linux. Есть варианты и для докера, и для кубернетиса, и даже для макоси, но смысл  везде будет одинаковый.

    Итак, в случае Windows идём на официальный сайт https://min.io/download#/windows и качаем последнюю версию. Там же наблюдаем инструкцию по запуску:

     minio.exe server F:\Data
    

    И там же ссылка на чуть более развёрнутый Quick start guide. Инструкции не верить смысла нет, поэтому запускаем и получаем примерно такой ответ.


    На этом всё! Хранилище работает и можно начинать с ним работать. Я не шутил, когда говорил, что MinIO — это минимализм и просто работает. Если пройти по предложенной при запуке ссылке, то максимум доступных там функций — это создать бакет. И можно начинать писать данные.

    Для любителей линуксов всё остаётся не менее простым. Простейшая инструкция:

    
    wget https://dl.min.io/server/minio/release/linux-amd64/minio
    chmod +x minio
    ./minio server /data

    Результат будет неотличим от виденного ранее. 

    Настройка MinIO чуть более осмысленная


    Как мы понимаем, предыдущий абзац — это баловство для тестовых целей. И, скажем честно, именно для тестирования MinIO у нас используется очень широко, в чём нам совершнно не стыдно признаться. Конечно, оно работает, но дальше тестовых стендов выносить такое стыдно. Поэтому берём в руки напильник и начинаем доводить до ума.

    HTTPS


    Первый обязательный шаг на пути к продакшену — шифрование. В сети уже есть миллион и тысяча мануалов по добавлению сертификатов к MiniIO, но общий план у них такой:

    • Создаём сертификат
    • В случае Windows кладём его в C:\Users\%User%\.minio\certs
    • В случае Linux в ${HOME}/.minio/certs 
    • Перезапускаем сервер

    Банальный Let’s Encrypt — это скучно и описано везде, так что наш путь — это путь самурая, поэтому в случае Windows скачиваем Cygwin, а в случае Linux просто проверяем, что у нас установлен openssl. И делаем немного консольной магии:

    • Создаём ключи: openssl ecparam -genkey -name prime256v1 | openssl ec -out private.key
    • Создаём сертификат по ключу: openssl req -new -x509 -days 3650 -key private.key -out public.crt
    • Копируем private.key и public.crt в папку, указанную выше
    • Перезапускаем MinIO

    Если всё прошло как надо, то в статусе появятся примерно такие строчки.


    Включаем MinIO Erasure Coding


    Сперва пара слов о сабже. В двух словах: это программная защита данных от повреждения и потери. Как рейд, только намного надёжней. Если классический RAID6 может позволить себе потерять два диска, то MinIO спокойно переживает потерю половины. Более детально технология описана в официальном гайде. Но если взять самую суть, то это реализация кодов Рида-Соломона: вся информация хранится в виде блоков данных, к которым есть блоки чётности. И вроде это всё уже было сделано много раз, только есть важное «но»: мы можем явно указывать соотношение блоков чётности к блокам данных для хранимых объектов.
    Хотите 1:1? Пожалуйста!
    Хотите 5:2? Без проблем!

    Очень важная функция, если вы используете сразу несколько нод и хотите найти свой собственный баланс между максимальной безопасностью данных и затраченных ресурсов. Из коробки MinIO использует формулу N/2 (где N — общее количество дисков), т.е. делит ваши данные между N/2 дисками данных и N/2 дисками четности. Переводя на человеческий: можно потерять половину дисков и восстановить данные. Это соотношение задаётся через Storage Class, позволяя вам самостоятельно выбрать, что важнее: надёжность или ёмкость.

    В гайде приведён такой пример: предположим, что у вас инсталляция на 16 дисков и вам надо сохранить файл размером 100 Мб. Если используются настройки по умолчанию (8 дисков под данные, 8 под блоки чётности), то файл в итоге займёт практически двойной объём т.е. 200 Мб. Если отношение дисков будет 10/6, то понадобится 160 Мб. 14/2 — 114 Мб.

    Другое важное отличие от рейдов: в случае выпадения дисков MinIO будет работать на уровне объектов, восстанавливая один за другим, не останавливая работу всей системы. В то время как обычный рейд будет вынужден восстанавливать весь volume, что займёт непредсказуемое количество времени. На памяти автора дисковая полка, которая после выпадения двух дисков ушла на пересчёт на полторы недели. Было весьма неприятно.

    И, важное замечание: MinIO делит все диски для Erasure Coding на сэты от 4х до 16ти дисков, используя максимально возможный размер сэта. И в дальнейшем, один элемент информации будет храниться только в пределах одного сэта.

    Звучит всё это очень здорово, но насколько сложной будет настройка? Давайте посмотрим. Берём команду для запуска и просто перечисляем диски, на которых нужно создать хранилище. Если всё сделано верно, то в репорте увидим количество задействованных дисков. И совет, что негоже на один хост добавлять сразу половину дисков, ибо это к потере данных.

    c:\minio>minio.exe server F:\ G:\ H:\ I:\ J:\ K:\


    Далее для управления и настройки MinIO сервера нам потребуется агент, скачать который можно всё там же с официального сайта.

    Чтобы не стирать пальцы, каждый раз набирая адрес и ключи доступа (да и небезопасно это), удобно при первом запуске сразу создать alias по формуле mc alias set <YOUR-MINIO-ENDPOINT> [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]

    mc alias set veeamS3 https://172.17.32.52:9000 YOURS3ACCESSKEY YOURSECERTKE

    Или же можно сразу добавить ваш хост:

    mc config host add minio-veeam https://minio.jorgedelacruz.es YOURS3ACCESSKEY YOURSECERTKEY

    А потом создадим immutable бакет красивой командой

    mc mb --debug -l veeamS3/immutable 
    
    mc: <DEBUG> PUT /immutable/ HTTP/1.1
    Host: 172.17.32.52:9000
    User-Agent: MinIO (windows; amd64) minio-go/v7.0.5 mc/2020-08-08T02:33:58Z
    Content-Length: 0
    Authorization: AWS4-HMAC-SHA256 Credential=minioadmin/20200819/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-bucket-object-lock-enabled;x-amz-content-sha256;x-amz-date, Signature=**REDACTED**
    X-Amz-Bucket-Object-Lock-Enabled: true
    X-Amz-Content-Sha256: UNSIGNED-PAYLOAD
    X-Amz-Date: 20200819T092241Z
    Accept-Encoding: gzip
    mc: <DEBUG> HTTP/1.1 200 OK
    Content-Length: 0
    Accept-Ranges: bytes
    Content-Security-Policy: block-all-mixed-content
    Date: Wed, 19 Aug 2020 09:22:42 GMT
    Location: /immutable
    Server: MinIO/RELEASE.2020-08-16T18-39-38Z
    Vary: Origin
    X-Amz-Request-Id: 162CA0F9A3A3AEA0
    X-Xss-Protection: 1; mode=block
    mc: <DEBUG> Response Time:  253.0017ms

    --debug позволяет видеть не просто итоговое сообщение,  а более развёрнутую информацию. 

    -l значит --with-lock, что значит immutable

    Если теперь вернуться в веб интерфейс, то там появится наш новый бакет.


    На данный момент это всё. Мы создали защищенное хранилище и готовы переходить к интеграции с Veeam.

    Можно ещё удостовериться, что всё работает на отлично:

    c:\minio>mc admin info veeamS3
    
    ●  172.17.32.52:9000
       Uptime: 32 minutes
       Version: 2020-08-16T18:39:38Z
       Network: 1/1 OK
       Drives: 6/6 OK
    0 B Used, 1 Bucket, 0 Objects
    6 drives online, 0 drives offline

    MinIO и Veeam


    Внимание! Если по какой-то из невероятных причин вы хотите работать через HTTP, то по адресу HKEY_LOCAL_MACHINE\SOFTWARE\Veeam\Veeam Backup and Replication\ создайте DWORD ключ SOBRArchiveS3DisableTLS. Выставите его значение в 1 и помните, что мы такое поведение решительно не одобряем и никому не советуем.

    Внимание ещё раз! Если из-за какого-то недоразумения вы продолжаете использовать Windows 2008 R2, то при попытке подключить MinIO к Veeam вы скорее всего получите примерно такую ошибку: Failed to establish connection to Amazon S3 endpoint. Лечится это официальным патчем от Microsoft.

    Ну что же, с приготовлениями закончено, давайте откроем интерфейс VBR и перейдём на вкладку Backup Infrastructure, где вызовем мастер добавления нового репозитория.


    Само собой, интересует нас Object storage, а именно S3 Compatible. В открывшемся визарде задаём имя, проходим шаги с указанием адреса и учётной записи. Если требуется, то не забываем указать гейт, через который будут проксироваться запросы к хранилищу.


    После чего выбираем бакет, папку и ставим галочку Make recent backups immutable. Или не ставим. Но раз уж мы сделали хранилище с поддержкой этой функции, то грех будет не воспользоваться.


    Next > Finish и наслаждаемся результатом.

    Теперь надо добавить его к SOBR репозиторию в качестве Capacity Tier. Для этого или создаём новый, или редактируем имеющийся. Нас интересует шаг Capacity Tier.


    Здесь нам надо выбрать, по какому сценарию мы будем работать. Все варианты довольно хорошо описаны в другой статье, так что не буду повторяться

    А по завершении работы мастера будут автоматически запущены задания на копирование или перенос бекапов. Но если в ваши планы не входит так сразу выдать нагрузку на все системы, то обязательно задайте допустимые интервалы для работы по кнопке Window.


    И, само собой, можно сделать отдельные Backup Copy задания. Некоторые считают, что так даже удобнее, так как они несколько более прозрачны и предсказуемы для пользователя, не желающего вникать в подробности работы капасити тира. А подробностей там хватает, так что ещё раз рекомендую соответствующую статью по ссылке выше.

    И напоследок — ответ на коварный вопрос: что же будет, если всё же взять и попробовать удалить бекап из Immutable стораджа?

    Вот ответ:


    На этом на сегодня всё. По верной традиции, ловите список полезных топиков по теме:

    Veeam Software
    Продукты для резервного копирования информации

    Комментарии 23

      +1
      Активно пользуюсь Veeam, добавлю в закладки.
        0
        Всем пользователям Veeam плюсик автоматически =)
        0

        А про кластер минио будет?

          0
          Вы об этом? Пока не планировал, если честно.
            0

            Угу. Интересно было бы почитать, делал ли кто такое в реальности на террабайтах данных.

          0
          Насколько помню для erasure coding, есть важный момент — минимум 4 диска.
            0
            Даже хитрее: MinIO делит общее количество дисков на сеты от 4 до 16 штук. И каждый кусок данных будет записан только в пределах одного такого сета.
            Спасибо что напомнили про этот нюанс, добавлю в статью.
            –1
            я думал azure blob storage апи есть, а по факту только s3 :(
              +1
              У minio есть существенный недостаток — он не годится для организации хранилища большого количества объектов. Если у вас, допустим, есть несколько сотен миллионов объектов, то при расположении данных minio на «обычной» ФС вы столкнётесь с существеннными проблемами (потому что внутри он создаёт минимум по 2 inode на объект).
                0
                вы столкнётесь с существеннными проблемами

                Какими именно? Деградация производительности или что-то другое?

                на «обычной» ФС

                Что такое обычная ФС?
                  +2
                  В лучшем случае деградация, в худшем — невозможность использования и/или потеря данных.

                  «Обычная» — любая ФС, которая не использует динамическое выделение inode и использует стандартную стратегию выделения. Если вы сделаете, допустим, раздел с ext4 на диске 4ТБ, то скорее всего вы не сможете разместить там 1млрд файлов, а так как minio хранит объекты как отдельные файлы (ещё и не по одному), то не сможете и 200млн.
                  Поэтому minio хорошо подходит как хранилище для каких-нибудь образов виртуалок и совершенно не подходит для работы в качестве «замены S3» общего назначения.
                  Обычно, объектные хранилища не используют примитивы файловой системы для хранения индивидуальных объектов. Amazon S3 использует подлежащую БД (Dynamo), Azure/GCP — собственные БД, и Яндекс.Облако использует YDB, ну и нельзя не вспомнить про MongoDB GridFS. Создатели minio решили на этом сэкономить, вполне понятное желание, но один из сценариев использования, который был например очень интересен нам, для minio совершенно недоступен.
                    0
                    Мне кажется это типичная архитектурная ошибка. Если есть задача хранить миллиарды файлов, то странно для этого использовать фс не предназначенную для этого. Minio даёт лишь метод хранения объектов поверх фс, а не серебрянную пулю, которая от и до за нас подумала обо всех аспектах. Так что я тут разработчиков понимаю. Они решают задачу сделать легковесный файловый сервер, а не пытаются изобрести очередную фс или решить за нас использовать нам, условно, xfs или ext.

                    Если хочется сразу из коробки получить правильный ответ, где за нас уже всё решили и подумали, а пользователю надо только нажать большую красную кнопку «Сделать всё по красоте», для этого уже давно придуманы целые платформы типа ECS, Unity и прочих StorageGrid.
                      0
                      Задачи хранить файлы не было, была задача хранить объекты. Это ключевой терминологический вопрос.
                      Minio себя с самого начала позиционировала как объектное хранилище, а не «метод хранения объектов поверх ФС» (вероятно вы имели в виду поддержку удалённого доступа поверх ФС, ну тут можно вспомнить про NFS). Если они не в состоянии дифференцировать термины «объектное хранилище» и «файловая система», то жаль что они вводят в заблуждение своих пользователей.

                      Зашёл к ним на страницу, и их самопозиционирование не только не стало скромнее, теперь там на главной написано что это «Kubernetes Native, High Performance Object Storage». Там ничего не сказано про то что это «сетевая ФС» или «распределённая ФС». Это «объектное хранилище с S3 интерфейсом».

                      Итого — minio это не объектное хранилище в современном понимании этого слова, это скорее аналог glusterfs, у которого лучше организована часть с erasure coding.
                      Ну или нужно к каждому слову писать слишком много звёздочек: Высокопроизводительное* распределённое** объектное хранилище***
                      * — пока ФС справляется с организацией древовидной структуры
                      ** — пока система синхронной репликации не зависнет из-за проблем сети
                      *** — файловая система с удалённым доступом

                      Я уже сталкивался с некоторыми «системными интеграторами», которые нам продавали «S3-совместимое хранилище», которое через месяц эксплуатации безбожно тормозило, потому что они не предусмотрели сценарий, что для управления, допустим, временем жизни, в бакете где есть 700млн объектов, нужен подход отличный от «давайте положим всё файлами а потом будем запускать скрипт на Python».
                        0
                        Вот да. Взяли minio. Предполагалось хранить 10-50 тысяч объектов.
                        В итоге объектов стало 50+ млн и растет. На десяток бакетов.
                        И все и пипец, сколько там файлов — неизвестно. Листинг? я тя умоляю.
                        И вопросы в стиле: а что оно теперь в 10 раз медленнее работает, чем раньше?
                          0

                          То есть тот факт что под MySQL, PosgresSQL или не приведи хосподть Oracle надо тюрить ОС и по хорошему подбирать ФС — вас не смущает. А вот minio мы этого не простим, да

                            0

                            Я предполагаю, что даже если настроить ФС так, чтобы в неё влезло нужное количество файлов, то это будет работать чудовищно медленно. Экспериментов не проводил, но эксплуатирую хранилище с 1 млрд объектов и чуть больше 100ТБ полезных (в смысле без учёта репликации) данных.

                              0

                              Кхм. Есть взять микроскоп и начать им забивать гвозди, то он очень быстро сломается. Так мне ваши жалобы напоминают претензии о том, что дескать у микроскопа хрупкая конструкция, подножка легкая и гнется, и вообще он не подходит к забиванию гвоздей. Так вся штука в том, что никто и не обещал что minio в один бинарь заменит весь амазон с его s3. у minio своя ниша, на мой взгляд отличная, и в своей нише он работает замечательно. Зачем вы пытаетесь натянуть сову на глобус?

                                0

                                Да не вопрос, у меня претензии, если вы заметили, в первую очередь к позиционированию, а не к функциональности. Я уже писал об этом здесь комментариях, почитайте. Они заявляют что они “Kubernetes Native, High Performance Object Storage”, а по факту это скорее glusterfs с другим API.
                                Я ничего не пытаюсь натянуть или забить, я в своё время протестировал minio и убедился что для решения моей задачи, для которой подходят другие объектные хранилища он не подходит, следовательно называть его объектным хранилищем можно лишь с некоторыми весьма важными утончениями, которые как минимум на момент проведения мною тестов в документации и аннотации отсутствовали.
                                Итого — люди сделали одно, а рекламируют как другое. Значит ли это что это плохой продукт? Не знаю, в моём случае значит, а в вашем вероятно нет.


                                Мне вообще непонятно почему то что я поделился своим отрицательным опытом вызовет такое негодование. Что, у любимого вами продукта не может быть недостатков? Или про то что такой недостаток есть может было узнать заранее из документации? Или если кто-то протестировал продукт и нашёл ограничения должен молчать что ли?
                                С моей точки зрения ответ на все три вопроса — «нет».


                                И да, про «один бинарь» — решение, которое сейчас используется у нас и не имеет таких ограничений (разумеется оно имеет другие ограничения) тоже представлено в виде одного статически слинкованного файла, так что аргументация такого рода мне кажется неуместной.

                                  0
                                  Я ничего не пытаюсь натянуть или забить, я в своё время протестировал minio и убедился что для решения моей задачи, для которой подходят другие объектные хранилища он не подходит, следовательно называть его объектным хранилищем можно лишь с некоторыми весьма важными утончениями, которые как минимум на момент проведения мною тестов в документации и аннотации отсутствовали.

                                  Л — логика
                                  А если вы попытаетесь писать на php драйвера и не сможете — php не будет языком программирования?


                                  Они заявляют что они “Kubernetes Native, High Performance Object Storage”

                                  • Minio разработан как cloud native application? Разработан
                                  • Работает быстро? Да, быстро
                                  • Оно работает с S3? Работает
                                  • Где-нибудь заявлено, что они могут переварить терабайты данных? Нет

                                  Они не соврали ни в чем. То, что вы взяли не подходящую fs под ваши задачи, и запихали в нее огромное количество файлов на один сервер и ждете скорости как от кластера — ну это ваша личная проблема, а не как ни продукта.

                                    0
                                    php не будет языком программирования?

                                    В случае minio я сказал что «он не годится для организации хранилища большого количества объектов», в случае с PHP скажу что он «не подходит для написания драйверов» — всё честно, не больше и не меньше. Думаю человек, плохо знакомый с PHP будет благодарен за совет не писать на нём драйверы, не считаете?

                                    У меня складывается ощущение, что вам кажется, как будто я (несправедливо) поливаю minio фекалиями, потому что он меня где-то подвёл, потому что я был недостаточно сообразителен чтобы им воспользоваться без проверки. Ситуация полностью обратная — я рассматривал его как один из вариантов организации хранилища и убедился в процессе тестирования и аудита архитектуры что он нам не подходит, о чём и не преминул сообщить (выше даже был человек, который тоже столкнулся с такими проблемами).

                                    Работает быстро?

                                    В случае с средним объёмом файлов с одинаковым префиксом — нет (см. issues ниже).

                                    Где-нибудь заявлено, что они могут переварить терабайты данных?

                                    Да: docs.minio.io/docs/minio-server-limits-per-tenant.html
                                    Maximum number of objects per bucket: no-limit

                                    Только не надо съезжать на «вы не понимаете, это другое» =) Попросили указать на лимиты — получите, заявлено что их нет, при этом docs.minio.io не содержит никаких гайдлайнов по настройке ФС или описания этих лимитов.
                                    Зато потом появляются вот такие вот issue: github.com/minio/minio/issues/10733, github.com/minio/minio/issues/10268 и т.д. (и автор не я, если что).
                          0
                          А «целые платформы» — вы хотите прибегнуть к аргументу «раз недорого то можно закрыть глаза на все проблемы, а если хотите чтобы проблем не было раскошеливайтесь»? Я предпочту всё-таки недорого и хорошо, а не покупать чудовищные по своей неподдерживаемости «чёрные ящики» от Dell/HP/NetApp, забитые избыточной функциональностью =) Не уверен что эти «целые платформы» в своей конфигурации по умолчанию реально реализуют тот же S3 полностью с нормальной поддержкой lifecycle policy (это вот у всех больное место, начиная от самоделок и заканчивая хвалёным Cloudian HyperStore).
                            0

                            ну вот как раз с lifecycle policy у NetApp StorageGRID очень хорошо. Очень гибко настраиваются политки.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое