Начало » Использование СУБД » 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 
Я как раз хотел узнать - какие же там были аргументы   
 
Какие-то технические сложности, с кроссплатформенностью или с многопоточностью и архитекутурой сервера что-ли... Не могу сейчас в почте переписку найти, давно было. У Дмитирия Еманова надо уточнять. Я, как разработчик, не вижу в этом алгоритмической проблемы. Так же как, например, не могу понять, почему на БД реплике невозможно сделать обновление номера последнего втянутого сегмента в заголовок базы, а приходится хранить его отдельным внешним файлом... Что тоже создаёт ряд проблем
		
		
		
 |  
	| 
		
	 | 
 
 
 |   
Переход к форуму:
 
 Текущее время: Tue Nov 04 06:17:51 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.01019 секунд 
 |