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
    Продукты для резервного копирования информации

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

      +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
                        А «целые платформы» — вы хотите прибегнуть к аргументу «раз недорого то можно закрыть глаза на все проблемы, а если хотите чтобы проблем не было раскошеливайтесь»? Я предпочту всё-таки недорого и хорошо, а не покупать чудовищные по своей неподдерживаемости «чёрные ящики» от Dell/HP/NetApp, забитые избыточной функциональностью =) Не уверен что эти «целые платформы» в своей конфигурации по умолчанию реально реализуют тот же S3 полностью с нормальной поддержкой lifecycle policy (это вот у всех больное место, начиная от самоделок и заканчивая хвалёным Cloudian HyperStore).
                          0

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

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

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