Какие единицы измерения используются для определения местоположения в xlog?

Чтобы отслеживать задержку репликации с одного сервера PostgreSQL на другой, я использую простой скрипт, который выполняет запрос "SELECT pg_current_xlog_location()" на главном сервере и "SELECT pg_last_xlog_receive_location()" на ведомом устройстве. Затем я преобразовываю результаты из шестнадцатеричного в десятичное и вычисляю разницу, чтобы получить задержку репликации.

Моя проблема в том, что я не могу понять, в каких единицах возвращается этот xlog_location. Кто-нибудь может это объяснить?

2 ответа

Решение

"Единицы не имеют значения" (но, если вам интересно, эти единицы позиционируются в журнале транзакций - здесь есть небольшая дискуссия).

Важно отметить, что НЕТ положительной корреляции между положением журнала и временем.
Крупные транзакции могут продвинуть журнал на огромную сумму за короткий период.
Слабо используемые базы данных могут находиться в одной и той же точке журнала в течение нескольких часов (или дольше).

Все, что вы можете узнать из этого измерения, это то, насколько далеко вы находитесь в журнале (т.е. что вы синхронизированы или не синхронизированы с мастером, и примерно, сколько данных необходимо отправить / воспроизвести).

Здесь, в вики Postgres, есть еще несколько дискуссий, но, судя по вашему вопросу, я думаю, что вы уже читали эту страницу - может быть, стоит попросить разъяснения в списке рассылки Postgres pgsql-admin (и вы, возможно, найдете лучше ответьте, что я вам дал, и, возможно, сможете обновить Postgres Wiki:-)

Единицы журнала представлены в байтах (хотя они являются относительными - поэтому они бесполезны для измерения чего-либо, кроме "смещений", и иногда могут быть "скачки", где много пропущенных байтов), при этом значение вычисляется как:

Если вы возьмете вывод: SELECT pg_current_xlog_location(), вы получите что-то вроде:

70/A9002358

Часть перед "/" умножается на "ff000000" и добавляется ко второй части:

на языке Python (преобразование hex в в с помощью функции int('HEX',16)) это может выглядеть так:

int('ff000000',16)*int('70',16) + int('A9002358',16)

Вы можете найти текущее имя файла WAL, используя:

select pg_xlogfile_name(pg_current_xlog_insert_location());

Технически это "возможно" для подчиненного устройства догнать хозяина, если файлы журнала, которые требуются ведомому, все еще доступны на главном устройстве. Конечно, если ведомое устройство воспроизводит медленно, оно может никогда не догнать - но вы можете измерить, "догоняет" или "отстает" (вроде), используя запрос ниже:

На ведомом устройстве вы можете получить представление о временной задержке, используя запрос:

SELECT extract(epoch from (now()-
              pg_last_xact_replay_timestamp())) AS time_lag;

Однако возвращаемое число на самом деле является "временем с момента последней транзакции воспроизведения от мастера", поэтому, если у мастера не было транзакции в течение некоторого времени, это "время" может создать впечатление, что раб отстает (когда на самом деле, он догнал, но не было никаких сделок на мастера.)

Другие вопросы по тегам