- •Предисловие
- •Об этой книге
- •Глава 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
- •Предметный указатель
176Глава 7. Репликация
При эксплуатации кластеров репликации могут возникнуть разные проблемы, способные повлиять как на работоспособность кластера,так и на производительность отдельных узлов:
•отказ,недоступность узлов и невозможность передачи журнала;
•задержка при передаче журнала из-за недостаточной производительности узлов СУБД или среды передачи;
•недостаточная производительность при воспроизведении журнала на репликах и, как результат,отставание от основного узла;
•конфликты при воспроизведении журнала, приводящие к отставанию или ошибкам при выполнении запросов;
•аварийноезавершениеработыСУБДиз-занехваткиместанадискевсвязиснакоплением сегментов журнала.
Каквидноизприведенногосписка,потенциальныхпроблемпредостаточно.Некоторыеизних могут приводить к деградации или даже к полному отказу в обслуживании с непрогнозируемым временем восстановления. Поэтому в обязанности администратора входит отслеживание состояния кластера и работоспособности отдельных узлов,атакже предупреждение проблем,способных нарушитьнормальную работу.Дальше мы рассмотрим инструменты,которые предлагает СУБД для отслеживания репликации и выявления связанных с ней проблем.
7.2. Инструменты отслеживания репликации
Для отслеживания репликации есть несколько инструментов, и в зависимости от способа репликации могут понадобиться только некоторые из них:
•pg_stat_replication—отслеживание процессов walsender и процедуры передачи журнала на реплики;
•pg_stat_wal_receiver—отслеживание процесса walreceiver и процедуры приема журнала;
•pg_replication_slots — отслеживание слотов репликации, как физических, так и логических;
•pg_stat_replication_slots—статистика использования логических слотов репликации;
•pg_stat_subscription—статистика работы подписчиков;
•pg_stat_subscription_stats—статистика ошибок в работе подписчиков;
•pg_stat_database_conflicts — статистика конфликтов восстановления с разделением по причинам их возникновения.
Далее мы рассмотрим эти инструменты и возможные сценарии их использования.
7.2. Инструменты отслеживания репликации |
177 |
Представление pg_stat_replication
Основной узел является источником всех изменений и может реплицировать данные больше чем на один узел. Скорость отправки изменений и скорость их применения на репликах могут различаться, что выражается в величине отставания репликации и степени актуальности данных. Для определения отставания репликации и других характеристик передачи журнала можно использовать представление pg_stat_replication. В каждой его строке содержится статистика работы отдельного процесса walsender. Представление pg_stat_replication показываеттекущие данные аналогично тому,как работает представление pg_stat_activity:
# TABLE pg_stat_replication;
-[ RECORD 1 ]---- |
+ |
------------------------------ |
pid |
| |
39 |
usesysid |
| |
16431 |
usename |
| |
replica |
application_name | |
walreceiver |
|
client_addr |
| |
172.22.0.3 |
client_hostname |
| |
|
client_port |
| |
46666 |
backend_start |
| |
2022-12-14 03:54:32.228266+00 |
backend_xmin |
| |
|
state |
| |
streaming |
sent_lsn |
| |
D8/EF27AFC0 |
write_lsn |
| |
D8/EF27AFC0 |
flush_lsn |
| |
D8/EF27AFC0 |
replay_lsn |
| |
D8/EF27AFC0 |
write_lag |
| |
00:00:00.000159 |
flush_lag |
| |
00:00:00.002637 |
replay_lag |
| |
00:00:00.002807 |
sync_priority |
| |
0 |
sync_state |
| |
async |
reply_time |
| |
2022-12-16 04:36:36.495495+00 |
В тестовом окружении настроен кластер репликации с одним запасным узлом; соответственно,в представлении будет всего одна строка.Набор полей таков:
•pid—идентификатор процесса walsender в операционной системе;
•usesysid,usename—идентификаториимяпользователяСУБД,откотороговыполненопод- ключение со стороны резервного узла;
•application_name — дополнительный идентификатор приложения, который можно указать при подключении к основному узлу;
•client_addr,client_hostname,client_port—сетевые реквизиты со стороны резервного уз-
ла: адрес,имя узла и номер порта;
•backend_start—отметка времени подключения и создания процесса walsender;
178Глава 7. Репликация
•backend_xmin—транзакционный горизонтреплики,переданный основному узлу через об-
ратную связь (см. hot_standby_feedback);
•state — текущее состояние процесса walsender, определяющее и общее состояние репликации:
—startup—walsender находится в процессе запуска;
—catchup—реплика пытается «догнать» основной узел;
—streaming—этоосновнойрежимработы:walsenderпередаетпотокизмененийнареп- лику,после того как реплика успешно «догнала» основной узел;
—backup—walsender находится в процессе передачи резервной копии;
—stopping—walsender находится в процессе выключения.
На основе следующих полей, показывающих состояние отправки и приема журнала, можно определить величину отставания конкретной реплики и объем работы,который ей предстоит проделать,чтобы полностью устранить это отставание:
•sent_lsn—позиция журнала,записи до которой отправлены на реплику;
•write_lsn—позиция журнала,записи до которой приняты,но еще не синхронизированы процессом walreceiver;
•flush_lsn — позиция журнала, записи до которой уже синхронизированы процессом walreceiver;
•replay_lsn—позиция журнала,записи до которой воспроизведены процессом startup.
Как уже упоминалось, изменения на репликах могут появляться с задержкой. Величина задержки (отставание репликации) в идеале должна быть близка к нулю, но это не всегда возможно.Отставание еще можно расценивать как меру работы,которую необходимо проделать. Однако основной узел не стоит на месте, и в его журнал записываются новые и новые изменения.Объем появляющихся измененийможетварьироваться; соответственно,отставание реплики тоже будет непостоянным. Увеличение отставания может выражаться в том, что результаты выполнения запросов к основному узлу и реплике будут расходиться, и это следует учитывать при проектировании приложений,которые получаютданные с реплик.
Чтобы «догнать» основной узел,реплике требуется: а) получить все изменения с него,б) записатьихвлокальноехранилище,в)синхронизироватьиг)воспроизвестинадлокальнойкопией данных. Используя вышеперечисленные поля с позициями журнала, можно вычислить расстояние в байтах между позициями и получить представление о том, в каком месте образоваласьнаибольшая задержка.Для этого потребуются уже известная функция pg_current_wal_lsn
иоператор вычитания,который поддерживается типом данных pg_lsn:
•pg_current_wal_lsn - sent_lsn — объем данных к отправке, который состоит из всех журнальных записей,накопленных на основном узле,но еще не переданных на реплику;
7.2. Инструменты отслеживания репликации |
179 |
•sent_lsn - write_lsn—объем данных,отправленных с основного узла,но еще не записанных на стороне реплики;
•write_lsn - flush_lsn — объем данных, записанных, но еще не синхронизированных на реплике;
•flush_lsn - replay_lsn—объем данных,готовых для воспроизведения процессом startup.
Полученный объем выражается в байтах и позволяетдовольно наглядно представить масштабыотставанияреплик.Напрактикеотставаниечастовозникаетнаэтапеотправкииливоспро- изведенияжурнала.Частоэтопроисходитиз-затого,чтоврезультатеизменениябольшихобъ- емов данных генерируется много журнальных записей и процессы walsender или walreceiver не справляются с передачей или процессу startup не хватает производительности,чтобы своевременно воспроизводить весь объем журналов.
Следующая группа полей позволяет сразу отслеживать отставание в секундах,показывая приблизительное время,которое потребуется реплике,чтобы «догнать» основной узел:
•write_lag—время,прошедшее между локальной синхронизацией журнала и получением уведомления о том,что изменения записаны (но еще не синхронизированы) на реплике;
•flush_lag—время,прошедшее между локальной синхронизацией журнала и получением уведомления о том,что изменения записаны и синхронизированы на реплике;
•replay_lag—время,прошедшеемеждулокальнойсинхронизациейжурналаиполучением уведомления о том,что изменения записаны,синхронизированы и применены;
•reply_time — отметка времени о получении последнего служебного сообщения от реплики,в котором и содержатся данные по обработке журнала.
Данные поля позволяют оценить задержку, возникающую при подтверждении транзакции в случае синхронной репликации, когда параметр synchronous_commit установлен в одно из значений—remote_write,on или remote_apply.
Остаются еще два поля: sync_priority и sync_state. При асинхронной репликации sync_state всегда равно async. В случае синхронной репликации узлы могут находиться в разных состояниях и выполнять в кластере разные роли. Значение sync означает, что в данный момент реплика работает как синхронная.Если используется синхронная репликация,основанная на приоритетах, значение potential говорит о том, что реплика работает в асинхронном режиме, но является кандидатом на переход в синхронный режим (в этом случае sync_priority показывает приоритет данного узла). Если же используется синхронная репликация, основанная на кворуме, значение quorum означает, что реплика входит в минимально необходимое число узлов, подтвердивших получение изменений. Больше информации о настройке синхронной репликации можно получить из документации1.
1 postgrespro.ru/docs/postgrespro/15/runtime-config-replication#GUC-SYNCHRONOUS-STANDBY-NAMES
180 |
Глава 7. Репликация |
С точки зрения поиска и устранения проблем интересными являются поля с адресом,позициями обработки журнала и задержками,которые позволяютточно идентифицировать реплики (особенно если их несколько) и определить, на каких этапах обработки журнала возникают задержки.Поля с позициями журнала можно сразу преобразовать в величину задержек:
# SELECT client_addr, state,
pg_current_wal_lsn() - replay_lsn AS total_lag_bytes, pg_current_wal_lsn() - sent_lsn AS pending_bytes, sent_lsn - write_lsn AS write_lag_bytes,
write_lsn - flush_lsn AS flush_lag_bytes, flush_lsn - replay_lsn AS replay_lag_bytes, write_lag,
flush_lag, replay_lag
FROM pg_stat_replication;
-[ RECORD 1 ]---- |
+---------------- |
client_addr |
| 172.22.0.3 |
state |
| streaming |
total_lag_bytes |
| 17152 |
pending_bytes |
| 0 |
write_lag_bytes |
| 0 |
flush_lag_bytes |
| 17152 |
replay_lag_bytes |
| 0 |
write_lag |
| 00:00:00.000151 |
flush_lag |
| 00:00:00.000151 |
replay_lag |
| 00:00:00.000151 |
Представление позволяет оценивать величину задержки как в байтах, так и в секундах, показывая, какой объем данных нужно обработать реплике, чтобы «догнать» основной узел,
искольковремениэтозаймет.Ввыводезапросавидно,чтоотставаниерепликинезначительно
исоставляетнесколькомикросекунд,вбайтахзадержкасоставляетвсегооколо17КБ,приэтом данные уже переданы и записаны на реплику,их осталосьтолько синхронизировать и воспроизвести.
На основе величин задержек можно собиратьметрики и строитьграфики,которые будутотображать отставание реплик во времени (рис. 7.1 и 7.2).
Обратите внимание на легенды обоих графиков. Отставание в байтах представлено более подробно и содержитинформацию об объеме журнала,который еще не был отправлен на реплику.Второй любопытный факт связан с тем,что в выбранный момент оба графика показывают разные максимумы отставания. Например, большая часть отставания в байтах находится на этапезаписиизменений,втовремякакотставаниевсекундах—уженаэтапахсинхронизации и воспроизведения. Особенно хорошо это заметно на небольших значениях. Общая картина обоих графиков показывает,что отставание часто появляется на этапах синхронизации и воспроизведения.Это говорит о том,что реплика чуть хуже справляется со своей частью работы.
