- •Предисловие
- •Об этой книге
- •Глава 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
- •Предметный указатель
1.2. Внутреннее устройство PostgreSQL |
21 |
журнал транзакций, однако чаще всего просто используется аббревиатура WAL. Запись в журналтребуется для обеспечения надежности и сохранения порядка всех изменений над данными и возможности восстановления после аварийного завершения СУБД. В таком случае при последующем запуске СУБД, используя журнал, воспроизведет последовательность измененийнадтемиданными,которыенебылисброшеныизбуферногокешавосновноехранилище. ПроизводительностьСУБДзависитвтомчислеиотскоростиработысWAL-журналом,которую можно узнать с помощью статистики.
Журнал сообщений СУБД
Послетогокаккомандазавершилась,клиентупередаетсярезультатвыполнения,будьтонабор строк, тег или вообще ошибка. Здесь может выполняться протоколирование, то есть сохранение служебной информации о выполнении команды.Эта информация может включать в себя данные о клиенте,текст и параметры запроса и т. п.Протоколирование дополняет статистику и также является важным источником информации о работе СУБД.Далее сервер готов к получению и выполнению следующей команды.
Репликация изменений
Помимоосновнойработысклиентами,СУБДвыполняетрядслужебныхзадач.Дляэтогосуществуютотдельныепроцессы,которыеработаютв фоновом режиме.Одной изтаких задач является физическая репликация, которая построена на основе журнала упреждающей записи. Все изменения данных,которые попадают в журнал,читаются процессом walsender и по протоколу репликации передаются на реплики.На репликах процессы walreceiver принимаютданные журнала и сохраняют содержимое на диск. Другой фоновый процесс — startup — читает полученныеданныежурналаивоспроизводитпоследовательностьизмененийналокальнойкопии данных. После этого изменения, пришедшие с основного сервера, становятся видимыми для запросов,выполняющихся на реплике.
Кромефизическойрепликации,PostgreSQLподдерживаетилогическую.Физическаярепликация предполагаетпередачу и применение всех изменений,вто время каклогическая позволяет выборочно передавать данные на уровне отдельных таблиц и даже операций. Использованиерепликацииможетпреследоватьразныецели,напримерраспределениерабочейнагрузки или отказоустойчивость и быстрое переключение при сбоях. Поэтому важно отслеживать состояние всех узлов,и в этом снова нам помогает статистика.
Архивирование журнала предзаписи
Похожей на репликацию является задача архивирования WAL-журнала. С точки зрения операционной системы WAL-журнал — это всего лишь последовательность файлов, называемых WAL-сегментами. Как только запись в очередной WAL-сегмент завершена, специальный процесс archiver может поместить этот сегмент в архив. Под архивом подразумевается отдельное
22Глава 1. Обзор статистики
от СУБД хранилище, которое используется для задач резервного копирования и аварийного восстановления.
Фоновая синхронизация данных
Есть и другие фоновые задачи. Одна из них — это синхронизация измененных данных из буферного кеша с основным хранилищем. Для этого задействованы два процесса: background writer и checkpointer. Первый в непрерывном цикле ищет грязные страницы и записывает их на диск. Второй, checkpointer, выполняет контрольные точки. Контрольная точка — это отметка в WAL-журнале,которая указывает на то,что все изменения до этой отметки уже записаны внадежноехранилище.Привыполненииконтрольнойточкипроцессcheckpointerзаписывает все грязные данные в отличие от background writer, который делает это выборочно. Другими словами,checkpointer,такжекакиbackgroundwriter,синхронизируетизмененияизбуферного кеша с диском,но дополнительно ставит особую отметку в WAL-журнале о том,что синхронизированы все грязные данные.
Поскольку журнал предзаписи — это история всех изменений, возникает вопрос: как долго следует хранить эту историю? Ответ дает процесс checkpointer: установка контрольной точки означает, что все предыдущие изменения надежно записаны в основное хранилище и все сегменты журнала, предшествующие этой контрольной точке, могут быть удалены. Таким образом,объем журнала предзаписи сохраняется более или менее постоянным и WAL-сегменты не накапливаются.
Автоочистка
Еще одной регулярной фоновой задачей является очистка таблиц и индексов от устаревших версий строк,так называемая автоочистка (autovacuum).Необходимость автоочистки является следствием реализации операций обновления данных и конкурентного доступа к ним.При изменении данных и конкурентной работе нескольких клиентов в таблицах могут возникать несколько версий одних и тех же строк. Со временем самые старые версии строки становятся неактуальными и могут быть удалены. Их удалением и занимается процесс автоочистки. Фоновыйпроцессautovacuumlauncherсопределеннойпериодичностью(см.autovacuum_naptime) запускает рабочие процессы autovacuum worker, которые выполняют очистку. Дополнительно рабочие процессы могут собирать статистику для планировщика о качественных и количественных характеристиках данных в таблицах. Эта статистика нужна для построения планов запросов. Неэффективная работа автоочистки в перспективе негативно влияет на производительность,и с помощью статистики активности можно наблюдать за работой не только очистки,но и других фоновых процессов.
Подводяитог,можносказать,чтовPostgreSQLестьмногосложныхпроцессов,которыевлияют другнадруга и связаны между собой.При возникновении проблем администратору БД нужна информацияотом,какработаюттеилииныепроцессы.Дляотслеживанияразличныхсобытий СУБД имеетвнутренние инструменты,которые ведутучети хранятстатистику в специальной
