Архитектура процессов PostgreSQL
PostgeSQL - это объектно-реляционная система управления базами данных. В данной СУБД реализована клиент-серверная архитектура, когда база данных хранится на сервере, а доступ к ней осуществляется с клиентских компьютеров.
Совокупность нескольких процессов, которые совместно управляют кластером баз данных, обычно называют "сервером PostgreSQL". Как правило, выделяют следующие типы процессов:
- Основной процесс - это postgres server process. Данный процесс является «родителем» для всех процессов, связанных с кластером, так как он порождает все остальные процессы и создает разделяемую память (shared memory);
- Каждый обслуживающий процесс (backend) обрабатывает все запросы и утверждения, отправленные подключенным клиентом;
- Различные фоновые процессы выполняют задачи по управлению базой данных, такие как обработка VACUUM и CHECKPOINT;
- Процессы, связанные с репликацией, выполняют потоковую репликацию. Более подробную информацию Вы найдете в разделе 11.
- Фоновые рабочие процессы, поддерживаемые в версии 9.3 и новее, могут выполнять любую обработку данных. Более подробная информация доступна по ссылке.
В следующих подразделах Вы найдете подробное описание первых трех типов процессов.
На данном рисунке отображены различные процессы сервера PostgreSQL: postgres server process, два backend процесса, семь фоновых процессов и два клиентских процесса, а также показаны кластер баз данных и shared memory.
Postgres Server Process
Итак, postgres server process является «родителем» всех процессов сервера PostgreSQL. В более ранних версиях он назывался "postmaster".
Каждый раз, когда Вы запускаете утилиту pg_ctl, стартует postgres server process. Затем он запускает различные фоновые процессы, при необходимости запускает процессы, связанные с репликацией, а также фоновые рабочие процессы и ожидает запросов на подключение от клиентов. При получении такого запроса он запускает обслуживающий процесс (backend). (Данный процесс обрабатывает все запросы, отправленные подключившимся клиентом).
Обслуживающий процесс (backend)
Обслуживающий процесс (backend) обрабатывает все запросы, отправленные одним подключенным клиентом. Он взаимодействует с клиентом через одно TCP-соединение и завершается, как только клиент отсоединяется.
Поскольку данный процесс может работать только с одной базой данных, при подключении к серверу PostgreSQL необходимо четко указать именно ту базу данных, которую Вам необходима.
PostgreSQL позволяет подключаться сразу нескольким клиентам одновременно. Параметр конфигурации max_connections определяет максимальное количество одновременных подключений к БД (по умолчанию это 100 подключений).
Когда к серверу подключается много клиентов, для каждого из них порождается собственный обслуживающий процесс. Это не проблема, если на всех хватает оперативной памяти и соединения не происходят слишком часто. Тем не менее при одновременной работе с какими-либо объектами приходится принимать меры, чтобы один процесс не поменял какие-либо данные в то время, пока с ними работает другой процесс. Для объектов в общей памяти используются короткоживущие блокировки. PostgreSQL делает это достаточно аккуратно для того, чтобы система хорошо масштабировалась при увеличении числа процессоров (ядер).
В большинстве инсталляций Postgres Pro для ограничения числа запускаемых обслуживающих процессов применяются внешние средства, например, J2EE, odyssey или pgbouncer. Однако применение внешних пулов соединений подразумевает дополнительные издержки, связанные с их установкой, настройкой и сопровождением. Кроме того, если пул работает в одном потоке, Вам придётся запускать сразу несколько экземпляров пула.
Фоновые процессы
В таблице 2.1 приведен список фоновых процессов.
В отличие от postgres server process и обслуживающего процесса (backend), невозможно объяснить каждую из функций фоновых процессов. Это связано с тем, что данные функции зависят от индивидуальных особенностей и внутреннего устройства PostgreSQL.
Поэтому в данном разделе мы приводим только введение. Подробности Вы найдете в последующих разделах.
|
Таблица 2.1: Фоновые процессы |
||
|
Процесс |
Описание |
Ссылка |
|
background writer |
записывает и синхронизует страницы с измененными данными на диск для того, чтобы процессам, которые обрабатывают запросы, не приходилось ждать синхронизации |
|
|
checkpointer |
выполняет процесс контрольной точки в версии 9.2 и новее. |
|
|
autovacuum launcher |
реагирует на активность изменения данных и запускает рабочие процессы по очистке таблиц. |
|
|
WAL writer |
периодически записывает и стирает данные WAL в буфере WAL. |
|
|
statistics collector |
собирает статистическую информацию для pg_stat_activity, pg_stat_database и т.д. |
|
|
logging collector (logger) |
собирает отправленные в stderr сообщения и перенаправляет их в журнальные файлы. |
|
|
archiver |
выполняет архивировное логирование |
|
Примечание:
С использованием фоновых рабочих процессов сопряжены угрозы стабильности и безопасности, поскольку они имеют неограниченный доступ к данным. Администраторы, желающие использовать модули, в которых задействованы фоновые рабочие процессы, должны быть крайне осторожными. Запускать рабочие процессы можно разрешать только модулям, прошедшим всесторонний аудит.
Следующий пример описывает один postgres server process (pid - 9687), два обслуживающих процесса (backend) (pids - 9697 и 9717) и несколько фоновых процессов, перечисленных в таблице 2.1.
postgres> pstree -p 9687 -+= 00001 root /sbin/launchd \-+- 09687 postgres /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data |--= 09688 postgres postgres: logger process |--= 09690 postgres postgres: checkpointer process |--= 09691 postgres postgres: writer process |--= 09692 postgres postgres: wal writer process |--= 09693 postgres postgres: autovacuum launcher process |--= 09694 postgres postgres: archiver process |--= 09695 postgres postgres: stats collector process |--= 09697 postgres postgres: postgres sampledb 192.168.1.100(54924) idle \--= 09717 postgres postgres: postgres sampledb 192.168.1.100(54964) idle i




