- •Предисловие
- •Об этой книге
- •Глава 1. Обзор статистики
- •Внутреннее устройство PostgreSQL
- •Установка соединений и работа сеансов
- •Запросы как базовая единица рабочей нагрузки
- •Планирование и выполнение запросов
- •Ввод-вывод при выполнении запросов
- •Журнал сообщений СУБД
- •Репликация изменений
- •Архивирование журнала предзаписи
- •Фоновая синхронизация данных
- •Автоочистка
- •Интерфейс статистики
- •Статистика как отправная точка инструментов мониторинга
- •Особенности статистики
- •Тестовое окружение
- •Глава 2. Статистика активности
- •Ключ к пониманию происходящего в СУБД
- •Взаимодействие клиента и сервера
- •Источники информации об активности
- •Представление pg_stat_activity
- •Представление pg_locks
- •Особенности pg_stat_activity и pg_locks
- •Представление pg_stat_database
- •Подключенные клиенты
- •Отслеживание клиентских сеансов
- •Транзакционная активность
- •Статусы завершения сеансов
- •Состояния сеансов
- •Отслеживание состояний
- •Ожидания и блокировки
- •Отслеживание состояний с учетом ожиданий
- •Взаимоблокировки
- •Бездействующие транзакции
- •Время выполнения запросов и транзакций
- •Отслеживание времени ожидания блокировок
- •Использование pg_locks.waitstart
- •Использование pg_stat_activity.state_change
- •Дерево блокировок
- •Глава 3. Выполнение запросов и функций
- •Зачем нужен мониторинг запросов
- •Расширение pg_stat_statements
- •Метаданные запроса
- •Планирование запроса
- •Исполнение запроса
- •Сквозная идентификация с queryid
- •Построение отчетов на основе pg_stat_statements
- •Представление pg_stat_statements_info
- •Выполнение процедур и функций
- •Глава 4. Базы данных
- •Иерархия объектов СУБД
- •Кластер баз данных
- •Табличные пространства
- •Базы данных
- •Схемы
- •Таблицы и индексы
- •TOAST
- •События в кластере баз данных
- •Рабочая нагрузка в отношении таблиц и индексов
- •Ошибки и нежелательные события
- •Функции для работы с объектами СУБД
- •Определение размеров объектов СУБД
- •Размещение объектов в файловой системе
- •Глава 5. Область общей памяти и ввод-вывод
- •Анализ общей памяти
- •Представление pg_buffercache
- •Представление pg_shmem_allocations
- •Анализ памяти клиентских процессов
- •Оценка использования SLRU-кешей
- •Ввод-вывод в контексте объектов СУБД
- •Базы данных
- •Ввод-вывод в контексте выполнения запросов
- •Временные файлы
- •Уровень баз данных
- •Ввод-вывод при выполнении запросов
- •Отслеживание в журнале сообщений
- •Отслеживание активных временных файлов
- •Ввод-вывод фоновых процессов
- •Глава 6. Журнал упреждающей записи
- •Отслеживание активности в журнале
- •Представление pg_stat_wal
- •Представление pg_stat_statements
- •Архивирование журнала
- •Представление pg_stat_archiver
- •Очередь архивирования
- •Глава 7. Репликация
- •Обзор репликации
- •Инструменты отслеживания репликации
- •Представление pg_stat_replication
- •Представление pg_stat_wal_receiver
- •Cлоты репликации и pg_replication_slots
- •Публикации и подписки
- •Конфликты восстановления
- •Глава 8. Очистка
- •Введение в очистку
- •Особенности очистки на практике
- •Когда выполняется автоочистка?
- •Статистика выполнения очистки
- •Счетчик транзакций и предотвращение ошибок, связанных с его зацикливанием
- •Раздувание таблиц и индексов
- •Отслеживание активных процессов очистки
- •Представление pg_stat_activity
- •Представление pg_stat_progress_vacuum
- •Глава 9. Ход выполнения операций
- •Представление pg_stat_progress_analyze
- •Представление pg_stat_progress_basebackup
- •Представление pg_stat_progress_cluster
- •Представление pg_stat_progress_create_index
- •Представление pg_stat_progress_copy
- •Предметный указатель
|
|
|
|
|
|
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), используется так называемый репликационный идентификатор,который,как правило,основан на значениях первичного ключа таблицы. Вместо первичного ключа может использоваться любой другой уникальный ключ или вообще вся строка. Если при репликации изменений происходит нарушениеуникальностирепликационногоидентификатора,напримерприпопыткевставитьстроку с идентификатором, который уже присутствует в таблице, то возникает конфликт, который
