- •Предисловие
- •Об этой книге
- •Глава 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
Репликация
Вэтой главе мы рассмотрим:
•репликацию и ее устройство;
•инструменты отслеживания репликации;
•представления pg_stat_replication и pg_stat_wal_receiver;
•отставание репликации;
•слоты репликации;
•представление pg_replication_slots;
•публикации и подписки;
•представление pg_stat_replication_slots;
•представления pg_stat_subscription и pg_stat_subscription_stats;
•конфликты восстановления и представление pg_stat_database_conflicts.
Впредыдущей главе мы рассмотрели журнал упреждающей записи, один из важных компонентов СУБД, обеспечивающий гарантии сохранности данных. Кроме того, на использовании WAL-журнала основана репликация. С помощью репликации становится возможным построение комплексных и распределенных конфигураций, которые позволяют обеспечить резервирование, отказо- и катастрофоустойчивость и распределение нагрузки. Использование репликации и кластерных конфигураций усложняет администрирование, требует ответственного отношения и навыков настройки и эксплуатации. В этой главе мы кратко рассмотрим устройство репликации в PostgreSQL и варианты ее использования, а также более детально погрузимся в инструменты,которые предоставляетСУБДдля отслеживания работы кластеров и механизма репликации.
7.1. Обзор репликации
Репликация — это процесс синхронизации данных между двумя и более узлами. Обычно различают два вида репликации: физическую и логическую. Физическая репликация предполагает передачу физических изменений блоков данных без анализа содержимого передаваемых изменений. Логическая репликация является более сложной и включает в себя анализ,
174Глава 7. Репликация
фильтрацию и выборочную передачу изменений. В минимальной конфигурации в репликации участвует два узла: один — в роли основного (primary), являясь источником изменений, второй — в роли реплики, принимая изменения с основного узла и воспроизводя их у себя. В зависимости от типа репликации терминология может изменяться: например, в случае физической репликации реплики обычно называют резервными, или запасными (standby) узлами. В более сложных схемах репликации могут участвовать несколько основных узлов, типы репликации могут комбинироваться, и каждый из отдельных узлов может реплицировать изменения надругие узлы.Основное применение репликация находитв задачах распределения нагрузкинанесколькоузловиобеспеченияотказоустойчивости:приавариинаосновномузле можно переключить реплику в основной режим и продолжить обслуживать рабочую нагрузку с минимальным простоем (downtime) системы в целом. Физическая репликация получила распространение в силу своей универсальности и применимости в обоих сценариях. Логическаяжерепликацияприменяетсядлявыборочнойпередачинабораданных,напримервслучае шардирования (sharding).В этой главе мы по большей части сосредоточимся на рассмотрении именно физической репликации,а логическую затронем в меньшей степени.
ОбатипарепликациивPostgreSQLустроенысхожимобразом.Сначалавыполняетсяначальная синхронизацияданныхсосновногоузланареплику.Дальшерепликаподключаетсякосновному узлу, и все изменения, попадающие в WAL-журнал основного узла, передаются на реплику попротоколурепликации.Реплики,всвоюочередь,такжемогутпередаватьизменениянадругие узлы; таким образом можно выстраивать каскадные конфигурации.
Репликация по умолчанию является асинхронным процессом: изменения на основном сервере фиксируются независимо от наличия реплик. Репликацию можно переключить в синхронный режим (см. synchronous_commit), в котором транзакция на основном узле фиксируется только после подтверждения ее получения резервным узлом.В зависимости от значения параметра synchronous_commit подтверждение может отсылаться после сохранения полученных журнальных записей на диск (remote_write), синхронизации их с диском (on, по умолчанию) или воспроизведения принятых изменений (remote_apply).Синхронный режим позволяетваварийныхслучаяхсвестипотеризафиксированныхтранзакцийкнулю.Однакоиспользованиесинхроннойрепликации,особенноврежимеremote_apply,можетзначительносказаться напроизводительности,и,болеетого,отказрепликиможетпривестикотказувобслуживании наосновномузле:всеоперациипофиксациитранзакцийбудутожидатьдоставкижурнальных записей на реплику. Поэтому решение использовать синхронную репликацию должно быть взвешенным и обоснованным. В любом случае все изменения, записанные в журнал основного узла, появляются на репликах с некоторой задержкой (replication lag); ее величина зависит оттаких факторов,как производительностьузлов,сетевое окружение илитекущая рабочая нагрузка.
Процесс репликации инициируется репликой. Процесс walreceiver проверяет состояние локального WAL-журнала и отправляет на основной узел запрос на передачу журнальных записей.Если у основного узла естьв распоряжении запрашиваемые записи,то на нем запускается
7.1. Обзор репликации |
175 |
фоновый процесс walsender, который в дальнейшем и будет отвечать за потоковую передачу журнала. Оба процесса, walsender и walreceiver, поддерживают между собой постоянное соединение, и, как только в журнале появляются новые данные (включая данные еще незафиксированных транзакций), walsender передает их процессу walreceiver. Процесс walreceiver ожидаетпередачиданных.Получив журнальные записи,он сохраняетих влокальный каталог pg_walосновногокаталогаданных,послечегодругойфоновыйпроцесс,startup,воспроизводит (replay) переданные изменения на локальной копии данных. Как только изменения применены, обновленные данные становятся видны запросам, выполняющимся на реплике. Такой механизм репликации зарекомендовал себя как простой и надежный.
На основе передачи WAL-записей реализованы оба вида репликации — и физическая, и логическая. Поскольку в WAL-журнале фиксируются изменения на уровне отдельных физических блоков, физическая репликация и заключается в передаче изменений физических блоков. Эти изменения описывают атомарный переход блока из одного физического состояния в другое без уточнения, какие именно пользовательские данные были изменены (таблицы, строки или отдельные поля). Таким образом, процессы walsender и walreceiver обеспечивают непрерывную и последовательную передачу потока изменений между узлами, а процесс startup применяет все изменения, без пропусков и строго в порядке следования журнальных записей. Для оценки работы физической репликации достаточно отслеживать состояние процессов walsender и walreceiver и объем данных передаваемых основным узлом на реплики.
Логическая репликация более сложна и позволяет реплицировать изменения выборочно. В PostgreSQL эта функциональность реализована механизмом публикаций1 и подписок2. В случае логической репликации исчезают понятия основного и резервного узлов, поскольку узлы логической репликации могут совмещать обе роли; для обозначения источника и получателяизмененийиспользуютсятерминысерверпубликацииисерверподписки.Серверпубликации декодирует поток журнала и выявляет объекты, которые были изменены. В результате декодирования появляется возможность фильтровать поток записей и реплицировать изменения (все или определенный набор операций) отдельных объектов. Выбранные изменения передаются серверу подписчика, который сохраняет их локально и затем применяет транзакции в том порядке,в котором они были зафиксированы на стороне сервера публикации (а не в порядке следования записей в WAL,как в случае физической репликации).
При физической репликации могутиспользоватьсятак называемые слоты репликации,а в случае логической репликации они являются обязательными.Слоты позволяютудерживатьнеобходимый объем WAL-сегментов, исключая возможность их переработки в ходе выполнения контрольных точек.Слоты являются важной частью механизма репликации и требуют внимания и контроля со стороны администратора: для мониторинга логической репликации нужно отслеживать не только передачу изменений,но и состояние слотов репликации.
1 postgrespro.ru/docs/postgresql/current/sql-createpublication
2 postgrespro.ru/docs/postgresql/current/sql-createsubscription
