Добавил:
ИВТ (советую зайти в "Несортированное")rnПИН МАГА Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Database 2024 / Books / Мониторинг PostgreSQL.pdf
Скачиваний:
26
Добавлен:
20.11.2024
Размер:
6.87 Mб
Скачать

 

 

 

 

 

 

7.2. Инструменты отслеживания репликации

187

Tue Jan

3

14:22:54

2023 (every

60s)

 

 

slot_name | active

| backlog |

wal_status | safe_wal_size

 

-----------

 

+--------

+---------

+

------------

+---------------

 

standby

 

| f

|

|

lost

|

 

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

2023-01-03 14:18:10.111 UTC 21 LOG: checkpoint starting: time

2023-01-03 14:22:40.095 UTC 21 LOG: invalidating slot "standby" because its restart_lsn E3/DDE30AB8 exceeds max_slot_wal_keep_size

2023-01-03 14:22:40.458 UTC 21 LOG: checkpoint complete: wrote 3545 buffers (21.6%); 0 WAL file(s) added, 57 removed, 6 recycled; write=269.931 s, sync=0.015 s, total=270.348 s; sync files=10, longest=0.009 s, average=0.002 s; distance=78162 kB, estimate=81638 kB

Для возвращения реплики в строй придется повторно инициализировать ее (поскольку в тестовом окружении нет WAL-архива):

#docker-compose rm standby

#docker volume rm playground_standby_data

#docker-compose up -d

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

# SELECT

 

 

 

 

slot_name, active,

 

 

 

pg_current_wal_lsn() - restart_lsn AS backlog,

 

wal_status, safe_wal_size

 

 

 

FROM pg_replication_slots;

 

 

 

slot_name | active | backlog

| wal_status | safe_wal_size

-----------+--------

+-----------

+------------

+---------------

 

standby | f

|

0 | reserved

|

1090234536

Публикации и подписки

Логическая репликация использует модель публикаций и подписок. На одном узле можно опубликоватьизменения,происходящие в одной или несколькихтаблицах,а надругом—под- писаться на получение этих изменений и воспроизводить их. Как и в случае физической репликации, механизм публикаций и подписок реализован на основе передачи журнала упреждающей записи. Процесс репликации инициируется на стороне подписки: при создании подписки запускается фоновый рабочий процесс logical replication worker,который подключается поуказанномуадресуксерверупубликации.Насторонепубликациизапускаютсядвапроцесса walsender,один из которых выполняетначальное копирование целевыхтаблиц и завершается,

188Глава 7. Репликация

а второй остается и занимается передачей WAL-журнала. Если серверов подписки несколько, для каждого из них будет запущен отдельный процесс walsender, но не больше, чем указано в параметре max_wal_senders. Дальше начинается процесс декодирования WAL-журнала, при котором происходят разбор журнальных записей, извлечение данных об изменении отдельных строктаблиц и их группировка по отдельнымтранзакциям.В результате подписчику передаются данные зафиксированных транзакций. Для декодирования используется буфер, размер которого определяется параметром logical_decoding_work_mem (64 МБ по умолчанию). При нехватке этого буфера отправитель может принять решение о вытеснении содержимого буфера на диск или немедленной отправке части декодированных данных подписчику.Это решение принимается на основе параметра streaming, указанного при создании подписчика. По умолчанию потоковая передача выключена, и транзакция сначала полностью декодируетсянасторонеотправителя,итолькозатемдекодированныеданныеотправляютсяподписчику. Узнатьбольше об устройстве,настройке и работелогической информации можно в официальной документации1.

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

Представление pg_stat_replication_slots содержит информацию только о слотах логической репликации и может быть использовано для оценки объемов выполняемой работы. Каждая строка представления содержит статистику по отдельному логическому слоту:

slot_name—уникальный идентификатор слота;

spill_txns—общее количествотранзакций,вытесненных надиск из-за нехватки рабочей памяти при декодировании журнала. Учитываются как транзакции верхнего уровня, так

ивложенные транзакции (subtransaction);

spill_count — общее количество фактов вытеснения транзакций на диск при декодировании журнала. Счетчик увеличивается каждый раз при вытеснении транзакции, одна

ита же транзакция может быть вытеснена несколько раз;

spill_bytes — общий объем декодированных данных в байтах, вытесненных на диск при декодировании журнала;

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

stream_count — общее количество раз, когда данные активных транзакций отправлялись подписчику из-за нехватки рабочей памяти при декодировании журнала. Этот счетчик увеличивается каждый раз, когда данные транзакций передаются в потоковом режиме; одна и та же транзакция может быть передана таким способом несколько раз;

1 postgrespro.ru/docs/postgresql/current/logical-replication

7.2. Инструменты отслеживания репликации

189

stream_bytes — общий объем декодированных данных в байтах, переданных подписчику в потоковом режиме;

total_txns — общее количество декодированных транзакций, отправленных подписчику. Учитываются только транзакции верхнего уровня, но не вложенные транзакции. Счетчик учитывает как транзакции, передаваемые в потоковом режиме, так и вытесненные транзакции;

total_bytes — общий объем декодированных данных в байтах, отправленных подписчику. Счетчик учитывает данные транзакций, передаваемых как в потоковом режиме, так и вытесненных;

stats_reset—отметка времени сброса этой статистики.

Счетчики помогают оценить объем работы и ввода-вывода, связанного с логическим декодированием журнала,и настроить параметр logical_decoding_work_mem.

Следующий инструмент — это представление pg_stat_subscription со статистикой подписок, которое позволяет отслеживать процесс получения журнала со стороны отправителя:

subid,subname—уникальный идентификатор и имя подписки;

pid—процесс,обслуживающий подписку;

relid — идентификатор отношения, для которого в данных момент выполняется начальная синхронизация. Значение будет отсутствовать (NULL), если процесс работает в основном рабочем режиме,в котором только применяются изменения;

received_lsn—последняя позиция журнала,записи до которой приняты подписчиком;

last_msg_send_time—время отправки последнего сообщения,полученного подписчиком;

last_msg_receipt_time — время поступления последнего сообщения, полученного со стороны публикующего узла;

latest_end_lsn—последняялокальная позиция в журнале,подтвержденнаяподписчиком публикующему узлу;

latest_end_time — время последней локальной позиции в журнале, подтвержденное подписчиком публикующему узлу.

На практике pg_stat_subscription может пригодиться для отслеживания состояния подписок и скорости обработки приходящих изменений.

Следующий инструмент — это представление pg_stat_subscription_stats, которое помогает отслеживать появление ошибок на стороне подписки. При репликации изменений, связанных с операциями обновления и удаления (команды UPDATE и DELETE), используется так называемый репликационный идентификатор,который,как правило,основан на значениях первичного ключа таблицы. Вместо первичного ключа может использоваться любой другой уникальный ключ или вообще вся строка. Если при репликации изменений происходит нарушениеуникальностирепликационногоидентификатора,напримерприпопыткевставитьстроку с идентификатором, который уже присутствует в таблице, то возникает конфликт, который

Соседние файлы в папке Books