|
After-Image репликация для Windows
(Архив скриптов)
Скрипты switch_a.vbs и roll_forward.vbs выполняют After-Image (AI) репликацию. Репликация выполняется с двумя ai-экстентами каждой базы. Исходим из того, что один всегда в состоянии busy, другой – в состоянии full.
Switch_a.vbs выполняет на боевом сервере следующие действия:
-
В случае, если нет файлов flag1 или flag2, сигнализирующих о том, что скрипт roll_forward.vbs на резервном сервере не отработал, производит для каждой базы проверку статуса экстента a1. Если статус – BUSY, то происходит очистка экстента a2 и переключение c a1 на a2. Если статус отличен от BUSY, значит происходит очистка экстента a1 и переключение с a2 на a1. И так по циклу.
-
В случае, если процесс After-imaging для какой-то базы не запущен, создается файл abort, сигнализирующий скрипту roll_forward.vbs о том, что его отработка запрещена.
-
В случае, если есть файл flag1 или flag2, скрипт не отрабатывает и ждёт, когда отработает roll_forward, который копирует и накатывает на hot-swap базу соответственно a1 или a2 для каждой базы
Roll_forward.vbsвыполняет на резервном сервере следующие действия:
-
Создает папку AiArchive для хранения накатываемых экстентов, если ее не существует
-
Создает папку в AiArchive, присваивая имя в формате YYYYMMDDhhmm00, для записи в нее накатываемых экстентов, где YYYY - год, MM – месяц, DD – день, hh – час, mm - минуты
-
Если нет файла abort и существует файл flag1 или flag2 происходит копирование соответствующего по номеру экстента для каждой базы и его накатывание на резервную базу.
-
Производится проверка количества экстентов в сессии (в моем случае, число экстентов должно быть равно 6, так как 6 баз). Если условие не выполняется, удаления файла flag1 или flag2 не происходит, что блокирует работу скрипта switch_a.vbs. В то же время отправляется широковещательное сообщение через net на боевой сервер и на хост администратора о том, что требуется его вмешательство (у меня пока таких ситуаций не возникало).
-
Если проверка на количество экстентов прошла, происходит удаление файла-флага (flag1 или flag2).
Действия обоих скриптов, обеспечивающих репликацию, логгируются в отдельные файлы switch_a.vbs и roll_forward.log.
Запуск скриптов разнесен по времени на 30 минут. У меня расписание такое: switch_a.vbs стартует с 9:00 каждые 30 минут на протяжении 790 минут (то есть до 22:00)
roll_forward работает с 9:05 каждые 30 минут на протяжении 790 минут (то есть до 22:05)
Все накатываемые экстенты хранятся в папке, путь к которой описан в переменной patharchive. Для того, чтобы чистить папки с ненужными экстентами (ненужными считаю экстенты, которые накатывались до полного бэкапа), отрабатывает скрипт ArchCleaner.vbs.
ArchCleaner.vbs выполняет следующие действия:
Проверяет разность дат (текущей и даты-названия папки) по дням (интервал можно менять, см. возможные значение в начале скрипта) со значением, указанным в переменной edge. Если разность больше папка удаляется. В моем случае полный бэкап происходит в субботу, а чистящий скрипт запускается в воскресенье. Поэтому в качестве edge я указываю 1, таким образом остаются только папки с субботней «историей» накатываемых экстентов, всё остальное удаляется.
В 22:30 стартует процесс создания бэкапа, о котором речь пойдет ниже.
Backup.vbs выполняет следующие действия:
В зависимости от названия компьютера, на котором запущен скрипт инициализирует основные переменные (см. таблицу), определяет тип бэкапа (с понедельника по пятницу инкрементальный, в субботу - полный), создается папку для бэкапа, если она отсутствует (для инкрементальных бэкапов в формате YYYYMMDD, для полного - full), в субботу копирует предыдущий полный бэкап в папку oldfull на боевом и резервном серверах, осуществляет бэкап:
-
Выполняется проверка статуса базы (offline или online)
-
Выполняется проверка отключено ли ai-журналирование: если ai-журналирование не отключено, то перед бэкапом выполняется очистка неиспользуемого экстента (full), так как PROBKUP переключит экстенты перед выполнением бэкапа. Создается файл flag1 или flag2, в зависимости от того, какой экстент стал full, после переключения утилитой эктентов. Таким образом мы не потеряем этот экстент и он накатится при следующем запуске скрипта roll_forward.vbs
-
Производится проверка бэкапа
-
Вывод статистики по каждой базе в отдельный файл
-
Удаление «старых» инкрементальных бэкапов на боевом и резервном сервере за последние 7 дней (производится в понедельник); также удаление папки oldfull
-
Копирование папки с бэкапом на резервный сервер
Скрипты restore.vbs и restore_incr.vbs выполняют соответственно рестор полного и инкрементального бэкапа.
Задания по расписанию (backup и switch_a) выглядят следующим образом:
На боевом сервере
на резервном сервере (ArchCleaner, roll_forward)
Изменения, которые необходимо внести в скрипты для работы в Вашей среде:
Данная схема работоспособна только для баз, в структуре которых есть два экстента a1 и a2 (может нужно больше, но 2-х вполне достаточно).
Чтобы не столкнуться с проблемой доступа при настройке ai-журналирования советую настраивать запуск скриптов от одной доменной учетной записи (служебного аккаунта), который является на обоих серверах локальным администратором.
В скриптах производится вызов Progress-утилит. Путь к папке Progress стандартный C:\Program Files\Progress\OpenEdge. Если у кого-то другой – придется поменять этот фрагмент на свой (или вынести путь в отдельную переменную)
Switch_a.vbs:
strpathDB |
Путь к директории с базой данных |
pathflag |
Путь к директории для создания файлов flag1 и flag2. Директория должна быть расшарена с правами Change для резервного сервера, чтобы он мог смотреть в эту папку и удалять файлы flag1 и flag2 |
str |
Путь к директории для ведения log-файла |
temppath |
Путь к папке для создания временных файлов |
bases |
Массив с именами баз |
Roll_forward.vbs:
strpathDB |
Путь к директории с базой данных |
strai |
Путь к директории, куда с боевого сервера будут копироваться экстенты (у меня это рабочая директория ProgressD:\OpenEdge\WRK) |
fstrai |
Путь к директории боевого сервера, в которой располагаются ai-экстенты. |
pathflag |
Путь к директории боевого сервера c файлами flag1 и flag2. Директория должна быть доступна с резервного сервера. Можно замапить на отдельный диск, можно использовать полный путь (по желанию) |
str |
Путь к директории для ведения log-файла |
patharchive |
Путь к директории на резервном сервере, куда будут складываться все отработанные ai-экстенты (происходит перемещение файлов из директории strai в patharchive) |
temppath |
Путь к папке для создания временных файлов |
bases |
Массив с именами баз |
Server, Host |
Название боевого сервера и машины администратора СУБД для оповещения в случае сбоя репликации (служба Messenger должны быть на обоих машинах запущена) |
ArchCleaner.vbs:
strpath |
Инициализируется в функции Machine_Name. Путь к директории, в которой хранятся по директориям «отработанные» экстенты |
interval |
Интервал для вычисления разности дат (месяц, день, неделя и т.д.) |
edge |
Пороговое значение. Если разность дат с учетом интервала больше порогового значения папка с экстентами удаляется |
Backup.vbs:
strPath |
Путь к директории, куда складывается текущий бэкап |
strPathBackup |
Путь к директории с бэкапами на боевом сервере |
strPathDB |
Путь к директории с базой данных на боевом сервере |
resPathDB |
Путь к директории с базой данных на резервном сервере. Необходимо замапить путь на какой-нибудь диск |
resPath |
Путь к директории с бэкапами на резервном сервере |
bases |
Массив с именами баз |
Restore.vbs:
strPathDB |
Путь к директории, в которую будет ресторится полный бэкап |
strfullbkp |
Путь к директории с полным бэкапом |
str |
Путь к директории, в которой будет вестись log-файл |
bases |
Массив с именами баз |
Restore_incr.vbs:
strPathDB |
Путь к директории с базами данных, в которую будет ресторится инкрементальный бэкап |
str |
Путь к директории, в которой будет вестись log-файл |
bases |
Массив с именами баз |
Автор: Шитый Андрей
|