Windows: удалённое резервное копирование с использованием снапшотов (VShadow)

    При резервном копировании путём простого копирования файлов возникает вопрос: «как убедиться в целостности данных». Ведь если, например, копировать 50-гиговую базу lotus сервера, то в процессе копирования одной части может измениться другая и целостность будет нарушена. А в некоторых случаях (например с базами данных) может появиться необходимость остановки службы, но нет возможности остановить её на пару часов.

    Для подобных задач Windows имеет полезный инструмент. Впервые о подобной технологии я узнал работая с FreeBSD, затем узнал про LVM в Linux, а поискав такое же решение для Windows обнаружил, что оно здесь тоже есть и называется Volume Shadow Copy.

    Эта технология позволяет сделать мгновенный слепок файловой системы, который статичен во времени, в то время как оригинальная файловая система продолжает работу в штатном режиме. Для бекапа баз данных таким образом можно останавливать БД (когда это возможно), создавать слепок, запускать БД снова, и после этого спокойно копировать файлы используя созданный слепок.

    Я приведу пример автоматического создания слепка для резервного копирования базы Lotus Domino (останова она не требует) и поясню как оно работает. Скрипт можно легко адаптировать под свои нужды.


    snapshot.cmd


    rem Go to the script's directory
    %~d0
    cd %~dp0

    rem Get options or exit
    call snapshot_env.cmd || exit 1

    date /t > %snapshot_date%
    date /t >> %snapshot_status%

    rem Delete the oldest shadow of the specified volume
    vshadow -do=%snapshot_drive% > %snapshot_create_volume% && echo Removing old OK >> %snapshot_status% || echo Removing old ERR >> %snapshot_status%
    rem Force removing the share if it haven't done itself (it happens sometimes)
    net share %snapshot_share% /delete

    rem Create a persistent shadow copy
    vshadow -p -script=%snapshot_var_script% %snapshot_drive% >> %snapshot_create_volume% && echo Snapshot OK >> %snapshot_status% || echo Snapshot ERR >> %snapshot_status%
    call %snapshot_var_script%

    rem Expose a child directory from the shadow copy as a share
    vshadow -er=%SHADOW_ID_1%,%snapshot_share%,%snapshot_path% && echo Sharing OK >> %snapshot_status% || echo Sharing ERR >> %snapshot_status%

    echo --- >> %snapshot_status%


    snapshot_env.cmd


    set snapshot_drive=e:
    set snapshot_path=lotus
    set snapshot_share=lotus$
    set snapshot_var_script=snapshot_vars.cmd
    set snapshot_status=logs\snapshot_status.log
    set snapshot_create_volume=logs\snapshot_create_volume.log
    set snapshot_date=%snapshot_drive%\%snapshot_path%\snapshot_date.log


    Как это работает


    — Скрипт snapshot.cmd после запуска считывает параметры из файла snapshot_env.cmd
    — Создаётся файл %snapshot_date% в директории, которая будет архивироваться (позже объясню зачем)
    — Удаляет старые снапшоты, если таковые имелись и расшаренные директории
    — Создаёт новый снапшот для диска %snapshot_drive%
    — Расшаривает директорию %snapshot_path% с сетевым именем %snapshot_share% (т.е. по сети можно будет обратиться к этой директории как \\server\lotus$). Важный момент — права на директорию будет иметь группа Backup operators, а это значит вам нужно будет создать специального пользователя lotus-backup, добавить его в группу Backup operators и использовать его в скриптах для подключения к папке \\server\lotus$ по сети.
    — Начиная с этого момента данные из директории \\server\lotus$ можно спокойно и в любом темпе копировать в надёжное место :)

    А теперь отдельно скажу о том, зачем же нужен был файл %snapshot_date%. Этот файл нужен для того, чтобы по сети можно было отличить вновь созданный снапшот от старого, который по той или иной причине не удалился. Это можно сделать проверив дату создания файла %snapshot_date% (у нас это делает nagios).

    Требования


    — vshadow.exe, необходимый для работы скриптов вы можете найти в Volume Shadow Copy Service SDK который можно скачать по ссылке: www.microsoft.com/downloads/en/details.aspx?FamilyID=0b4f56e4-0ccc-4626-826a-ed2c4c95c871
    — Работа всего этого проверялась только на Windows Server 2003

    PS: кстати, Windows-клиент Bacula, на сколько я знаю, так же использует технологию «Volume Shadow Copy» в своей работе.
    Support the author
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 25

      0
      Насколько я помню, у Lotus Domino есть свои собственные средства резервного копирования, которые делают резервное копирование «правильным» образом, т.е. так чтобы обеспечить целостность данных. Вообще большинство производителей ПО снабжают свои продукты такими средствами резервного копирования чтобы учесть особенности этих продуктов. Например, бэкап MS SQL Server лучше делать собственными средствами и останавливать службы при этом нет никакой необходимости.
        +1
        Lotus у нас администрирует другой человек (удалённо, из Германии), я в нём не разбираюсь. Я спросил у него как бекапить, он сказал, что можно просто копировать. Но с «просто копированием» бывали проблемы типа «файл пропал в то время как должен был быть скопирован», поэтому я сделал снапшоты.
          0
          Ну а в целом я конечно же с вами согласен, если есть надёжные встроенные средства, то почему бы их не использовать. Но иногда этого недостаточно, а иногда это сложнее.
            0
            При очень больших базах, исчисляемых терабайтами, штатные средства бэкапа не успевают скопировать базу в необходимое время. Как раз в этих случаях применяется эта технология.
            И не обязательно останавливать базу. Например, Oracle можно перевести в backup mode и после снимка перевести в штатный режим.
            +3
            Я не люблю MS, но хочу сказать, что у shadow copy есть куда больший потенциал, чем у обычных снапшотов файловой системы.

            В частности, VSS предусматривает понятие «провайдера VSS», предоставляемого службой. В момент выполнения бэкапа провайдер гарантирует логическую целостность данных для снапшота (в пределах своей зоны ответственности). То есть, например, база данных сделает синк и не отдаст незавершённые транзацкии, а система виртуализации скинет буферы записи. Как результат, бэкап будет более консистентным, чем просто в случае снапшотов.

            Насколько я знаю, в юниксе подобной общепринятой технологии нет.
              +1
              Но база данных должна уметь с этим работать, верно? Да, штука полезная, если база её поддерживает.
              В Unix системах единого интерфейса, вроде как, действительно нет, но обычно можно найти какой-нибудь work around вроде read lock.
                0
                Если говорить о MySQL и MyISAM и, возможно о всех БД, не поддерживающих транзакции, то там flush tables with read lock может остановить работу всей системы, при условиях, что каждое действие системы сопровождается логироавнием в какую-нибудь таблицу. Пример: модуль статистики битрикс.
                С InnoDB все отлично.
                  0
                  Это является проблемой даже если создание снапшота занимает секунды?
                    0
                    Ну тут вам решать. :) Я не о снапшотах, а обратил внимание на проблему (вдруг кто не знает).
                +1
                Конечно я имел ввиду flush, а потом read lock.
                  0
                  В линуксе либо уже есть, либо активно развивается подобная фича: lwn.net/Articles/287435/. Правда, не знаю, в каком оно сейчас состоянии.

                  Смею предположить, что если даже будет достигнута целостность на уровне файловой системы (fsync), то на логическом уровне вряд ли будет всё так радужно. Чтобы в любой момент времени данные программы на диске были в согласованном состоянии, нужно очень тщательно продумать _все_ возможные ситуации сбоев и восстановлений после них. Вряд ли много кто кроме девелоперов БД хотя бы ставил себе такую цель (про строгое док-во я вообще молчу).
                    0
                    В моём понимании идея в том, чтобы база данных сама привела всё в порядок в файловой системе сразу после того как поступил запрос на создание снапшота, но перед тем, как снапшот будет сделан.
                      0
                      Вполне возможно. Но тогда должна быть поддержка со стороны софта, а софт — он такой, бывает разного качества :)
                        0
                        Я так понял, что amarao об этом и говорил.
                          0
                          Я про то, что это очень ограниченная фича — в уже написанный софт, первоначально не предназначенный на подобного рода синхронизацию, просто так её поддержку не добавишь.
                            0
                            Это верно :)
                              0
                              Практически весь софт от Microsoft поддерживает VSSWriter
                              msdn.microsoft.com/en-us/library/aa384649(v=vs.85).aspx

                              Так же довольно просто добавить в самописное ПО компонент VSS.
                        0
                        А про заморозку в xfs мне кажется это не совсем то, хотя я с xfs не работал.
                      0
                      Вы забыли опубликовать содержимое snapshot_vars.cmd, который у вас используется в «set snapshot_var_script=snapshot_vars.cmd»
                        0
                        Не забыл, но вы внимательны :)
                        Это файл временный. Он создаётся автоматически при создании снапшота, а потом используется для расшаривания директории.
                        0
                        2011-2003=8.
                          0
                          Пользуюсь аналогичным решением для работы с базами данных почтового сервера hmailserver и резервного копирования с файловых серверов. vshadow.exe прекрасно работает и с Windows XP, только нужно использовать другой исполняемый файл, не для Winodws 2003.
                          Справедливости ради стоит отметить, что о теневом копировании знает и собственный, встроенный в Windows Backup. Единственная тонкость — запускаться он должен на том же сервере, с томов которого выполняется резервное копирование, и путь к источнику данных на сервере в задании ntbackup должен быть указан как, например, C:\data, а не \\server\data, иначе теневое копирование при резервировании не включится, и открытые на тот момент файлы окажутся пропущенными.
                          Еще одно интересное готовое решение — Hobocopy
                            0
                            А оно с открытым кодом! github.com/candera/hobocopy
                            Спасибо за наводку.
                            0
                            А оно с открытым кодом! github.com/candera/hobocopy
                            Спасибо за наводку.
                              0
                              1. Сделали с помощью вышеописанных программ образ диска C (система+пара программ с базами) ~80 Гиг.
                              2. Все работает N-дней
                              3. Сгорает мать (совсем, новых нет, снята с производства)
                              4. Покупается новая мать
                              5. ????

                              p.s. Нет, переустановить систему не вариант.

                              Only users with full accounts can post comments. Log in, please.