В своей домашней лаборатории я использую бесплатную виртуализацию от VMware – это дешево и надежно. Сначала был один сервер, потом в него начал добавлять локальные датасторы, потом собрал второй сервер… Стандартной проблемой при этом был переезд виртуальной машины. Делая эти операции вручную, я наткнулся на один способ, который позволял переключить работающую виртуальную машину на копии флэтов совершенно в другом месте. Способ крайне прост: достаточно создать снапшот виртуальной машины, склонировать флэты в новое место, а затем в дельте перебить ссылку на родительский диск. Гипервизор не держит файлы метаданных диска открытыми, поэтому при удалении снапшота происходит сливание с новым диском, а старый можно спокойно удалять. Этот способ прекрасно работает без всякого VDDK, который недоступен на бесплатных гипервизорах и которым пользуется, например, Veeam в похожей ситуации.


Я без труда автоматизировал эту процедуру на python, применив еще несколько трюков, которые, при наличии запросов, смогу раскрыть в следующих статьях. Немного позже нашелся хороший человек из моих бывших коллег по цеху, который согласился написать гуй, последний, правда, реализован на Unity, но для получившегося бесплатного солюшена, названного нами Extrasphere, это было совсем не плохо. Чем не игрушка для админа?


Сделав для своей домашней лаборатории миграцию виртуальных машин, я задумался о защите от сбоев. Минимальным требованием было резервирование работающей виртуалки, максимально недостижимым же отсутствие отставания резервной копии от оригинала. Не то чтобы у меня были такие данные, где потеря 15 секунд критична, по правде сказать, для меня не критично потерять и пару дней, но вот к такому идеалу хотелось прийти с заделом на будущее.
Я не стану приводить анализ и сравнение доступных решений – это было давно, заметок с тех пор не сохранилось, помню только о немыслимой тяге к велосипедизму.


На бесплатном гипервизоре можно сделать простейший бэкап-агент из Linux машины, к которой цеплять флэты заснапшоченной виртуальной машины. Такое решение хорошо подходит для создания фуловых резервных копий, но абсолютно не годится для инкрементального бэкапа, т.к. родной CBT не доступен для бесплатных гипервизоров.


Я подумал, что неплохо бы самому запилить CBT, но как? Слышал про Zerto и SRM с их vSCSIFilter, но скачав open-source пакет для ESXi не нашел там ничего похожего — ну разве что символьное устройство написать можно. Решил взглянуть на устройство hbr_filter, там, к моему удивлению, все оказалось не слишком сложно. Три недели экспериментов – и вот я уже могу навесить свой фильтр-драйвер на диск виртуалки и трэкать изменения.


А что если не просто трэкать изменения, а реплицировать их? Тут самая большая опасность в том, чтобы начать писать тонну кода обеспечивающего канал передачи: тут вытащи изменения, упакуй и отправь в сеть, там прими, распакуй и запиши, а еще и целостность на каждом шагу нужно обеспечить и обработку ошибок. Без пары агентов кажется не обойтись. Достаточно взглянуть на архитектуру Zerto, чтобы понять, что написать и стабилизировать такое решение в одиночку нереально:


image

Рис. 1. Архитектура Zerto Virtual Replication из рекламного ролика.


Тут я вспомнил, что ESXi и сам умеет писать по сети через iSCSI и NFS к примеру. Все что нужно – это примонтировать таргетный датастор локально. А если еще и включить реплику, то можно писать в неё прямо из фильтр-драйвера! Я начал эксперименты: поначалу не знал, что делать с включенной репликой и просто грузил её с Ubuntu Live CD, через пару-тройку недель начала получаться работоспособная копия, а затем и научился передавать изменения на лету. Причем исходная машина не получает подтверждения записи, пока не пройдут записи в оба получателя. Так у меня получилась репликация с нулевым отставанием.


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


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


image

Рис. 2. Потребление CPU на исходной машине с нагрузкой.


image

Рис. 3. Потребление CPU на зеркале в тот же период.


image

Рис. 4. Потребление памяти на исходной машине с нагрузкой.


image

Рис. 5. Потребление памяти на зеркале в тот же период.


image

Рис. 6. Дисковая производительность исходной машины под нагрузкой.


image

Рис. 7. Дисковая производительность зеркала за тот же период.


Для того, чтобы проверить состояние зеркала я сделал тестовые машины, которые запускаются как linked-clone от снапшота зеркала. При желании снапшот можно хранить и потом запускать тесты повторно, а если тест очень понравился, то его можно превратить в персистентную виртуальную машину встроенной миграцией, про которую я рассказывал вначале повести.


Локальный таргет – это хорошо, а что делать, если необходимо зеркалировать в другой офис/город? Даже если канал связи будет достаточно широким, то продолжительность ответа серьезно просадит производительность исходной машины, мы же помним, что исходная машина не получает подтверждение записи, пока она не завершится в оба получателя. Решение здесь крайне простое: нужно расширить интервал неопределенности записи с нуля до некоторого разумного значения. Скажем, допустимое отставание в 3-5 секунд обеспечат как хорошую сохранность данных, так и приличную производительность. Над этим решением я как раз работаю в данный момент. На очереди работа без ssh и консистентность уровня приложений, где тоже не обойдется без трюков, которыми я с радостью поделюсь.

Поделиться с друзьями
-->

Комментарии (13)


  1. Sergey-S-Kovalev
    24.11.2016 18:54
    +4

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


    1. Str3lok
      24.11.2016 20:03
      +1

      Благодарю! Подумаю о переименовании в хлебного тролля.


  1. neumeika
    24.11.2016 19:16
    +1

    хм, ни кода, ни примеров. Статья о том, что вы научились делать аналог CoW?


    1. Str3lok
      24.11.2016 19:20
      +1

      Да, потому что начинал я без кода и без примера (дизассемблер не считается).
      Если что-то конкретное из рассказа заинтересовало, я смогу подробнее ответить в комментарии или в новой статье — от размера ответа зависит.


      1. neumeika
        24.11.2016 21:49
        +2

        ответ не будет большим, в принципе, статья уже говорит, что ковырнуть и что поискать, если захочется подобного. Проделанная работа заслуживает уважения, респект.
        Имхо, социуму бы пригодилась «тулза» для зеркалирования. Не хотите по этому пути пойти?


        1. Str3lok
          24.11.2016 22:11
          +1

          А продакшен мне доверите? )


          1. AdmAlexus
            02.12.2016 08:53

            Если выложите в open source со всеми исходниками, то почему бы и нет.


  1. DRDOS
    25.11.2016 10:32

    Почти аналогичная статья но более приятный стиль
    https://habrahabr.ru/post/312112/


    1. Str3lok
      25.11.2016 10:33
      +1

      А в чем, простите, аналогия? Там тоже про Free ESXi? Там нет ничего даже отдаленно напоминающего зеркалирование виртуальных машин.


  1. lovecraft
    25.11.2016 13:43

    Статья — супер, а ваш продукт (не важно, как быстро он работает) может составить конкуренцию серьезным коммерческим решениям. Veeam тоже, как вы помните, выроз из маленькой утилитки для резервного копирования в обход тормозного на ESXi-хостах SSH. Если вам не трудно — выложите его на гитхаб, а потом можете искать инвесторов для стартапа )) Продакшн же доверяют куда более костыльным решениям…


    1. Str3lok
      25.11.2016 16:11

      Благодарю! Честно говоря, после двух лет ковыряний хочется сразу начать с инвесторов )


  1. Lelik13a
    28.11.2016 06:16

    Велосипед конечно занятный, но есть сильное опасение о проблемах с лицензированием. Для VDDK вроде как есть специальные лицензионные ограничения на работу с ESXi. И скорее всего, есть запрет общего вида на создание подобного ПО другими средствами.


    1. Str3lok
      28.11.2016 10:58

      Опасения понятны, но я не использую то, что запрещено, ограничено или заблокировано, вроде VDDK, SOAP или VixAPI. Задним числом лицензию менять не принято, её можно поменять только в новых версиях или апдэйтах. Продукт прекрасно работает и с платными лицензиями (standalone лицензия вроде совсем должна быть дешевой, но конкретных цифр быстро найти не смог), более того для них собираюсь отказаться от работы через ssh и поддержать аутентификацию через AD. Все равно получится на порядок дешевле, чем покупать полный фарш от VMware или Zerto. Простая архитектура обуславливает хорошую стабильность и минимум потребностей на сопровождение.