Начало » Использование СУБД » Firebird, HQbird, InterBase » Репликация в 4.0 - перенос журнала в архив (куплю смазку для лыж)
Репликация в 4.0 - перенос журнала в архив [сообщение #1414] |
Fri, 20 January 2023 16:25 |
Valery
Сообщений: 7 Зарегистрирован: January 2023
|
Junior Member |
|
|
Всем привет!
Дано: асинхронная репликация между двумя серверами на четверке, файлы журнала переносятся между серверами средствами ОС. заметили сбой репликации, начали ковырять логи, увидели странное: иногда один и тот же номер сегмента передается дважды, с разным размером файла. База не сильно ответственная, так что плюнули и создали ее заново. И практически сходу поймали подозрительную ситуацию, когда один и тот же сегмент лежит и в архиве, готовый к отправке, и в текущем каталоге журнала репликации. Это нормальное поведение сервера?
И еще один момент, на primary сервере в replication.conf включено логирование (verbose_logging = true), но replication.log остается пустой. Опять же вопрос, это кривые руки или нормальное поведение сервера?
|
|
|
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1420 является ответом на сообщение #1414] |
Fri, 20 January 2023 18:40 |
neozx1984
Сообщений: 27 Зарегистрирован: June 2022
|
Junior Member |
|
|
По первому вопросу.
Файл в журнале не обрезается, поэтому его размер может быть больше, чем в архиве. Это нормально поведение.
Если файл успешно скопировался в архив, он переходит на статус free, при этом номер, т.е. и имя не изменяется.
По второму вопросу.
Параметр verbose_logging в секции "REPLICA SIDE SETTINGS" относится к реплике, на работу мастера не влияет.
Если посмотрите заголовки файла, то Вам будем понятнее логика работы.
В стандартной поставке Firebird нет инструментов для просмотра файлов асинхронной репликации.
Есть описание в формате kaitai здесь. С помощью этих описаний можно создать классы для чтения этих файлов, в проекте есть примеры на python.
Ну и в исходниках firebird можно посмотреть.
[Обновления: Sat, 21 January 2023 01:35] от Модератора Известить модератора
|
|
|
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1439 является ответом на сообщение #1420] |
Sun, 22 January 2023 15:07 |
Valery
Сообщений: 7 Зарегистрирован: January 2023
|
Junior Member |
|
|
Да, про размер мы уже догадались, когда увидели что новые сегменты создаются сразу одинакового (довольно большого и некруглого) размера.
Правильно ли я понял, перенос в архив происходит не переносом всего файла сегмента в другой каталог, а копированием (части?) данных из каталога journal в файл с тем же именем сегмента в каталог archive? И если копируется часть, что происходит с оставшимся файлом? Он позже досылается?
Прямо сейчас я вижу, что моя реплика уже обработала сегменты по 10 включительно, на мастере каталог архива пуст, а в каталоге журнала лежат сегменты 9 и 10. Получается, они еще раз должны добежать до реплики? И это значит, что на реплике для файлов сегментов нужно организовывать полноценную очередь, а не просто помойку, в которую один процесс кидает файлы, а другой в произвольные моменты времени выдергивает нужные ему файлы?
По второму вопросу моя вина, вместо того чтобы читать официальные документы, я адаптировал конфиги по инструкции с сайта IBExpert'а, а там в примерах verbose_logging = true стоит в обоих разделах
C kaitai описанием структуры попробуем разобраться, спасибо за наводку!
|
|
|
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1447 является ответом на сообщение #1439] |
Mon, 23 January 2023 09:55 |
neozx1984
Сообщений: 27 Зарегистрирован: June 2022
|
Junior Member |
|
|
Valery писал(а) Sun, 22 January 2023 15:07Правильно ли я понял, перенос в архив происходит не переносом всего файла сегмента в другой каталог, а копированием (части?) данных из каталога journal в файл с тем же именем сегмента в каталог archive?
Да. Имя состоит из заданного префикса и номера журнала.
Valery писал(а) Sun, 22 January 2023 15:07
И если копируется часть, что происходит с оставшимся файлом? Он позже досылается?
"Оставшиеся" данные это данные предыдущих журналов. В них нет данных для текущего журнала, там мусор.
Valery писал(а) Sun, 22 January 2023 15:07
Прямо сейчас я вижу, что моя реплика уже обработала сегменты по 10 включительно, на мастере каталог архива пуст, а в каталоге журнала лежат сегменты 9 и 10. Получается, они еще раз должны добежать до реплики?
В каталоге журнала файлы не удаляются, а используются повторно. Готовый файл копируется в архивный каталог. После успешного копирования он помечается как свободный и увеличивается его номер в заголовках файла.
Valery писал(а) Sun, 22 January 2023 15:07
И это значит, что на реплике для файлов сегментов нужно организовывать полноценную очередь, а не просто помойку, в которую один процесс кидает файлы, а другой в произвольные моменты времени выдергивает нужные ему файлы?
Для реплики копировать все файлы из архивного каталога мастера. Реплика сама разбирается с файлами по GUID и sequence в заголовке определяет какой файл применять. Если файл применен и не держит транзакцию, то удаляет файл.
В случае ошибок реплика будет писать в replication.log. Если файл пропущен или не полностью скопирован и т.д.
|
|
|
|
|
|
|
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1464 является ответом на сообщение #1451] |
Tue, 24 January 2023 20:24 |
SEN
Сообщений: 13 Зарегистрирован: June 2022
|
Junior Member |
|
|
Поделюсь опытом, возможно что-то уже стало не актуально, т.к. я не остлеживаю все изменения в коде репликации. Тем не менее:
1. В файле сегмента репликации, (в части его "заголовка") зашита его длина, поэтому сервер ФБ может понять - дописан файл сегмента или нет
2. Мастер создаёт "рабочии" копии в каталоге journal_directory - забудьте про него. После того как файл там допишется сервер ФБ переносит его тем или иным способом в каталог journal_archive_directory - откуда он должен будет транспортироваться на реплику.
Тут появляется несколько последствий:
2.1 В опциях конфига репликации есть команда которую можно вписать для явного копирования файлов репликации. Параметр: journal_archive_directory
вот выдержка из конфига 4:
# Program (complete command line with arguments) that is executed when some
# replication segment gets full and needs archiving.
#
# This program MUST return zero ONLY if archiving has been performed successfully.
# In particular, it MUST return non-zero if the target archive already exists.
#
# Special predefined macros are available:
# $(filename) - file name (without path) of the journal segment being archived
# $(pathname) - full path name of the journal segment being archived
# same as journal_directory + $(filename)
# $(archivepathname) - suggested full path name for the archived segment
# same as journal_archive_directory + $(filename)
#
# Simplest configuration is to use standard OS commands for archiving, e.g.:
#
# Linux: "test ! -f $(archivepathname) && cp $(pathname) $(archivepathname)"
# or
# Windows: "copy $(pathname) $(archivepathname)"
#
# journal_archive_command =
2.2 Поскольку пути могут быть на разных разделах "умолчательная" команда выполняется не атомарно. Соответственно в каталоге архивов файл может (и будет) появляться "частями", дописываясь. Понять что файл дописан, как я уже писал - можно по состоянию внутри его заголовка и текущему размеру. Если вы используете для трансфера ФТП (или какие-то иные механизмы), следите чтобы место под файл не резервировалось, иначе может получиться так что файл ещё не дописан, но в заголовке размер соответствует "зарезервированному"
2.3 Попскольку копирование не атомарное и может занимать какое-то время, а сегменты формируются разных размеров может получиться так что в каталоге архивов сегмент с номером N+1 появится после того как там же появится сегмент с номеро N+2. Т.е. Порядок повления сегментов негарантирован.
|
|
|
|
|
|
|
|
|
|
|
|
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1575 является ответом на сообщение #1493] |
Wed, 08 February 2023 12:48 |
SEN
Сообщений: 13 Зарегистрирован: June 2022
|
Junior Member |
|
|
hvlad писал(а) Fri, 27 January 2023 11:30
Я как раз хотел узнать - какие же там были аргументы
Какие-то технические сложности, с кроссплатформенностью или с многопоточностью и архитекутурой сервера что-ли... Не могу сейчас в почте переписку найти, давно было. У Дмитирия Еманова надо уточнять. Я, как разработчик, не вижу в этом алгоритмической проблемы. Так же как, например, не могу понять, почему на БД реплике невозможно сделать обновление номера последнего втянутого сегмента в заголовок базы, а приходится хранить его отдельным внешним файлом... Что тоже создаёт ряд проблем
|
|
|
Переход к форуму:
Текущее время: Sun Nov 24 18:13:39 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01376 секунд
|