SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Репликация в 4.0 - перенос журнала в архив (куплю смазку для лыж)
Репликация в 4.0 - перенос журнала в архив [сообщение #1414] Fri, 20 January 2023 16:25 Переход к следующему сообщению
Valery в настоящее время не в онлайне  Valery
Сообщений: 7
Зарегистрирован: January 2023
Junior Member
Всем привет!
Дано: асинхронная репликация между двумя серверами на четверке, файлы журнала переносятся между серверами средствами ОС. заметили сбой репликации, начали ковырять логи, увидели странное: иногда один и тот же номер сегмента передается дважды, с разным размером файла. База не сильно ответственная, так что плюнули и создали ее заново. И практически сходу поймали подозрительную ситуацию, когда один и тот же сегмент лежит и в архиве, готовый к отправке, и в текущем каталоге журнала репликации. Это нормальное поведение сервера?
И еще один момент, на primary сервере в replication.conf включено логирование (verbose_logging = true), но replication.log остается пустой. Опять же вопрос, это кривые руки или нормальное поведение сервера?
/index.php/fa/54/0/
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1420 является ответом на сообщение #1414] Fri, 20 January 2023 18:40 Переход к предыдущему сообщениюПереход к следующему сообщению
neozx1984 в настоящее время не в онлайне  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 в настоящее время не в онлайне  Valery
Сообщений: 7
Зарегистрирован: January 2023
Junior Member
Да, про размер мы уже догадались, когда увидели что новые сегменты создаются сразу одинакового (довольно большого и некруглого) размера.
Правильно ли я понял, перенос в архив происходит не переносом всего файла сегмента в другой каталог, а копированием (части?) данных из каталога journal в файл с тем же именем сегмента в каталог archive? И если копируется часть, что происходит с оставшимся файлом? Он позже досылается?
Прямо сейчас я вижу, что моя реплика уже обработала сегменты по 10 включительно, на мастере каталог архива пуст, а в каталоге журнала лежат сегменты 9 и 10. Получается, они еще раз должны добежать до реплики? И это значит, что на реплике для файлов сегментов нужно организовывать полноценную очередь, а не просто помойку, в которую один процесс кидает файлы, а другой в произвольные моменты времени выдергивает нужные ему файлы?
По второму вопросу моя вина, вместо того чтобы читать официальные документы, я адаптировал конфиги по инструкции с сайта IBExpert'а, а там в примерах verbose_logging = true стоит в обоих разделах Smile
C kaitai описанием структуры попробуем разобраться, спасибо за наводку!
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1447 является ответом на сообщение #1439] Mon, 23 January 2023 09:55 Переход к предыдущему сообщениюПереход к следующему сообщению
neozx1984 в настоящее время не в онлайне  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 - перенос журнала в архив [сообщение #1450 является ответом на сообщение #1447] Mon, 23 January 2023 13:35 Переход к предыдущему сообщениюПереход к следующему сообщению
Valery в настоящее время не в онлайне  Valery
Сообщений: 7
Зарегистрирован: January 2023
Junior Member
Тогда такой вопрос: после копирования файла в архив, мастер может еще к нему обращаться? Дописывать что-то, изменять?
У нас ОС на мастере по крону забирает файлы из архива и пересылает на реплику, не может ли возникнуть ситуация, когда файл сегмента уже улетел на реплику, а мастер создает в архиве файл с этим именем заново?
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1451 является ответом на сообщение #1450] Mon, 23 January 2023 14:24 Переход к предыдущему сообщениюПереход к следующему сообщению
neozx1984 в настоящее время не в онлайне  neozx1984
Сообщений: 27
Зарегистрирован: June 2022
Junior Member
Valery писал(а) Mon, 23 January 2023 13:35
Тогда такой вопрос: после копирования файла в архив, мастер может еще к нему обращаться? Дописывать что-то, изменять?
Нет. Журнал на статусе архив не изменяется.

Valery писал(а) Mon, 23 January 2023 13:35

У нас ОС на мастере по крону забирает файлы из архива и пересылает на реплику, не может ли возникнуть ситуация, когда файл сегмента уже улетел на реплику, а мастер создает в архиве файл с этим именем заново?
Может в случае отказа команды journal_archive_command. Например закончилось место в архивной директории или другая ошибка выполнения команды. В этом случае на реплику скопируется не полный или пустой файл. Но такие ситуации все рано придется разбирать в ручную.
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1452 является ответом на сообщение #1451] Mon, 23 January 2023 14:54 Переход к предыдущему сообщениюПереход к следующему сообщению
Valery в настоящее время не в онлайне  Valery
Сообщений: 7
Зарегистрирован: January 2023
Junior Member
Отлично, а случаи отказа команды journal_archive_command, видимо, должны попадать в лог репликации на мастере?
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1453 является ответом на сообщение #1452] Mon, 23 January 2023 15:12 Переход к предыдущему сообщениюПереход к следующему сообщению
neozx1984 в настоящее время не в онлайне  neozx1984
Сообщений: 27
Зарегистрирован: June 2022
Junior Member
Да.
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1464 является ответом на сообщение #1451] Tue, 24 January 2023 20:24 Переход к предыдущему сообщениюПереход к следующему сообщению
SEN в настоящее время не в онлайне  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 - перенос журнала в архив [сообщение #1481 является ответом на сообщение #1464] Thu, 26 January 2023 12:19 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 167
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Senior Member
imho, проще разместить оба каталога на одном разделе и атомарно перемещать файлы.
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1482 является ответом на сообщение #1414] Thu, 26 January 2023 12:42 Переход к предыдущему сообщениюПереход к следующему сообщению
neozx1984 в настоящее время не в онлайне  neozx1984
Сообщений: 27
Зарегистрирован: June 2022
Junior Member
Копирование в принципе на атомарная операция для ФС, в отличии от переименования.
Так что сначала копируем во временный каталог на том же разделе, что и архив, а потом переименовываем файл в архивный каталог.

Так же вместо команды копирования можно использовать компрессоры lzop, xz и т.д.
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1483 является ответом на сообщение #1481] Thu, 26 January 2023 12:50 Переход к предыдущему сообщениюПереход к следующему сообщению
SEN в настоящее время не в онлайне  SEN
Сообщений: 13
Зарегистрирован: June 2022
Junior Member
basid писал(а) Thu, 26 January 2023 12:19
imho, проще разместить оба каталога на одном разделе и атомарно перемещать файлы.
Мы просили у авторов ФБ реализовать такой механизм: копировать файл архива в каталог под временным расширением (например .part), а потом переименовывать его в финальное имя - так, например, делает firefox при загрузке файлов из интернета.
Но получили отказ. Файлы именно копируются. Поэтому целостность файла, тот же HQBird при передаче сегментов с мастера на реплику вынужден контролировать самостоятельно...
Попробуйте написать просьбу о копировании методом переименования на трекере файрбёрда, возможно количество таких требований от клиентов изменит ситуацию.
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1484 является ответом на сообщение #1483] Thu, 26 January 2023 13:21 Переход к предыдущему сообщениюПереход к следующему сообщению
neozx1984 в настоящее время не в онлайне  neozx1984
Сообщений: 27
Зарегистрирован: June 2022
Junior Member
Есть параметр journal_archive_command где можно указать свою команду. Это не решает проблему?
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1485 является ответом на сообщение #1483] Thu, 26 January 2023 13:40 Переход к предыдущему сообщениюПереход к следующему сообщению
Valery в настоящее время не в онлайне  Valery
Сообщений: 7
Зарегистрирован: January 2023
Junior Member
Когда еще оно изменит эту ситуацию, дожить бы Smile
Спасибо за помощь, будем прикручивать inotify/incron
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1486 является ответом на сообщение #1483] Thu, 26 January 2023 16:15 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время в онлайне  hvlad
Сообщений: 364
Зарегистрирован: August 2022
Senior Member
SEN писал(а) Thu, 26 January 2023 11:50
Мы просили у авторов ФБ реализовать такой механизм: копировать файл архива в каталог под временным расширением (например .part), а потом переименовывать его в финальное имя - так, например, делает firefox при загрузке файлов из интернета.
Но получили отказ.
Наверное при этом были озвучены какие-то аргументы ?
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1492 является ответом на сообщение #1486] Fri, 27 January 2023 10:30 Переход к предыдущему сообщениюПереход к следующему сообщению
Valery в настоящее время не в онлайне  Valery
Сообщений: 7
Зарегистрирован: January 2023
Junior Member
Влад, моей фантазии не хватает, чтобы придумать какие могут вознинуть проблемы на этом пути, а то обсуждение, даже если было публичным, сейчас вряд ли реально найти. Можно для слоупоков повторить, пожалуйста?
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1493 является ответом на сообщение #1492] Fri, 27 January 2023 11:30 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время в онлайне  hvlad
Сообщений: 364
Зарегистрирован: August 2022
Senior Member
Valery писал(а) Fri, 27 January 2023 09:30
Влад, моей фантазии не хватает, чтобы придумать какие могут вознинуть проблемы на этом пути, а то обсуждение, даже если было публичным, сейчас вряд ли реально найти. Можно для слоупоков повторить, пожалуйста?
Гм... а что я могу повторить ?
Я как раз хотел узнать - какие же там были аргументы Smile
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1494 является ответом на сообщение #1493] Fri, 27 January 2023 11:39 Переход к предыдущему сообщениюПереход к следующему сообщению
Valery в настоящее время не в онлайне  Valery
Сообщений: 7
Зарегистрирован: January 2023
Junior Member
Прошу прощения, я прочел прошлое сообщение как "Вам же тогда объяснили почему это сложно/невозможно" Smile
Re: Репликация в 4.0 - перенос журнала в архив [сообщение #1575 является ответом на сообщение #1493] Wed, 08 February 2023 12:48 Переход к предыдущему сообщению
SEN в настоящее время не в онлайне  SEN
Сообщений: 13
Зарегистрирован: June 2022
Junior Member
hvlad писал(а) Fri, 27 January 2023 11:30

Я как раз хотел узнать - какие же там были аргументы Smile
Какие-то технические сложности, с кроссплатформенностью или с многопоточностью и архитекутурой сервера что-ли... Не могу сейчас в почте переписку найти, давно было. У Дмитирия Еманова надо уточнять. Я, как разработчик, не вижу в этом алгоритмической проблемы. Так же как, например, не могу понять, почему на БД реплике невозможно сделать обновление номера последнего втянутого сегмента в заголовок базы, а приходится хранить его отдельным внешним файлом... Что тоже создаёт ряд проблем
Предыдущая тема: IBX: буферизация записей
Следующая тема: Firebird 4.0.2 "уходит в себя" при завершении работы клиентского приложения
Переход к форуму:
  


Текущее время: Mon Dec 30 20:08:11 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01003 секунд