Концепция
СУБД PostgreSQL управляет кластером баз:
один экземпляр PostgreSQL может запускать и контролировать набор баз данных, которые
изолированы друг от друга, и при этом обслуживаются через один и тот же сокет TCP/IP (UNIX-сокеты
также поддерживаются). Ограничений по количеству запущенных экземпляров PostgreSQL нет, разве
что должно быть достаточно системных ресурсов и незанятых TCP/IP сокетов.
Кластер основан на процессной схеме: сервис запускает главный процесс (исторически называемый
postmaster), который ожидает входящие клиентские подключения. При первом соединении postmaster
создаёт копию самого себя и этот новый процесс начинает обслуживание клиента. Он называется backend.
Кластер использует файловую систему для хранения всех баз и их данных: есть главная директория
(индивидуальная на кластер), называемая PGDATA, состоящая из нескольких поддиректорий, по
одной на каждую базу, которые, в свою очередь,хранят все объекты в базе (таблицы, генераторы
последовательностей и т.п.). Также можно реализовать хранение данных вне PGDATA, например, в другом
каталоге, за счет механизма tablespace. Конфигурация PostgreSQL, в основном, хранится в нескольких
текстовых файлах, которые обычно находятся внутри PGDATA.
Из вышеизложенного читатели могут видеть, что для обслуживания нескольких кластеров на одной и
той же машине для каждого экземпляра должно быть выполнено следующее:
• отдельный сокет TCP/IP, на котором postmaster будет работать и ожидать клиентские
подключения;
• отдельная структура PGDATA;
• отдельный набор конфигурационных файлов (обычно хранимых в PGDATA).
Базовая инсталляция
Установить PostgreSQL на машине с FreeBSD можно через систему портов: сначала требуется установить
порт -server, который в свою очередь установит порт -client, необходимого для доступа к кластеру (т.е. для
обеспечения соединения к процессам backend). По желанию, можно также установить и модуль -contrib, в
котором хранятся дополнительные полезные утилиты по управлению экземплярами PostgreSQL.
Прежде, чем мы начнем процесс установки, вам нужно выбрать правильную версию. PostgreSQL
формируется в форме
головнойномер.версия.минорная версия
(например, 9.1.2).
В случае, если отличие версии находится в строке головнойномер.версия, содержащей главный номер
релиза и номер версии, обычно приходится делать дамп данных и проводить реинициализацию. В версиях
PostgreSQL, которые отличаются только минорной версией, совместимость не нарушается, поэтому для
них реинициализацию делать не требуется.
В Листинге 1 приведены шаги, необходимые для установки сервера 9.1 (и клиентского окружения);
Листинг 1. Устанавливаем PostgreSQL из портов
# cd /usr/ports/databases/postgresql91-server/
# make install clean
# cd /usr/ports/databases/postgresql91-contrib/
# make install clean
…
# id pgsql
uid=70(pgsql) gid=70(pgsql) groups=70(pgsql)
# pkg_info -cs ‚postgresql*’
Information for postgresql-client-9.1.2:
Comment:
PostgreSQL database (client)
Package Size:
7914 (1K-blocks)
Information for postgresql-contrib-9.1.2:
Comment:
The contrib utilities from the PostgreSQL distribution
Package Size:
1647 (1K-blocks)
Information for postgresql-server-9.1.2:
Comment:
The most advanced open-source database available anywhere
Package Size:
14621 (1K-blocks)
Устанавливаются пакеты как для клиентской и серверной части и добавляется пользователь pgsql. Он нужен
для запуска серверных процессов PostgreSQL в непривилегированном режиме.
Как только СУБД установлена, то должен быть создан и новый кластер. Чтобы сделать это, для PostgreSQL
PGDATA должна быть назначена новая директория.
Только лишь создать директорию недостаточно, т.к. она должна быть инициализирована командой
initdb(1), чтобы PostgreSQL могла размещать в ней свои структуры данных кластера. Все кластерные
процедуры, включая инициализацию, старт, остановку и получение статуса кластера могут быть произведены
через исполняемый скрипт /usr/local/etc/rc.d/postgresql, который, в свою очередь, вызывает нужную
команду (обычно pg_ctl(1) или initdb(1)) посредством непривилегированного пользователя pgsql. Как и
для многих остальных сервисов, очень важно внести в файл rc.conf нужную строчку, разрешающую
запуск PostgreSQL. А также внести туда значение переменной PGDATA – главной директории кластера.
Это обеспечит запуск утилит из состава пакета PostgreSQL без указания каждый раз этой переменной. В
листинге 2 приводится пример стандартной установки PostgreSQL и указания переменных в rc.conf, а в
листинге 3 показано, как достичь того же результата с помощью определения папки PGDATA в командной
строке.
После инсталляции из листинга 2, самое время запустить сервис и проверить, работает ли он.
Листинг 2. Инициализируем кластер без PGDATA
# echo ‘postgresql_enable=”YES”’ >> /etc/rc.conf
# echo ‘postgresql_data=”/postgresql/cluster1”’ >> /etc/rc.conf
# mkdir -p /postgresql/cluster1
# chown pgsql:pgsql /postgresql/cluster1/
# /usr/local/etc/rc.d/postgresql initdb
Листинг 3. Инициализируем кластер с PGDATA
# mkdir /postgresql/anotherCluster
# chown pgsql:pgsql /postgresql/anotherCluster
# su -l pgsql -c „exec /usr/local/bin/initdb -D /postgresql/anotherCluster”
Обратите внимание, что пока не создана ни база данных, ни пользователи, которые могут ею
распоряжаться. Поэтому вам потребуется от имени пользователя pgsql подключиться к СУБД (см. листинг
4). Соединение с кластером (как и к любой его базой данных) происходит посредством команды psql(1),
которая выглядит как интерактивная оболочка. Либо же вы можете запускать SQL-запросы в пакетном
режиме.
Листинг 4. Запускаем PostgreSQL и получаем первую информацию о ней
# service postgresql start
# /usr/local/bin/psql -l -U pgsql
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
————+——-+———-+———+————-+——————-
postgres | pgsql | UTF8 | C | en_US.UTF-8 |
template0| pgsql | UTF8 | C | en_US.UTF-8 | =c/pgsql +
| | | | | pgsql=CTc/pgsql
template1 | pgsql | UTF8 | C | en_US.UTF-8 | =c/pgsql +
| | | | | pgsql=CTc/pgsql
Анатомия свежеустановленного экземпляра базы
Как показано в листинге 4, кластер уже содержит две важных базы данных, готовых к работе: template1
и template0. Эти две шаблонных базы работают в качестве каркаса для других баз, которые будут в
дальнейшем созданы администратором СУБД. Обе они создаются во время инициализации кластера (т.е.
когда запускается initdb(1)). Любая новая база будет клонирована из template1, т.к. template0 выступает
в качестве дублирующей копии для template1, в случае, если последняя будет разрушена. Обратите,
пожалуйста, внимание, что к этим шаблонным базам можно подключаться как к обычным базам данным.
Единственным владельцем директории PGDATA
является пользователь psql. В ней хранятся конфигурационные данные для всего кластера, а
также файлы с данными – основные параметры Обратите внимание, что для восстановления
или миграции кластера не достаточно обычного бекапа на уровне файловой системы; требуются
более сложные процедуры, типа Point In Time Recovery (более подробно о ней будет сказано позже).
Каждый объект базы идентифицируется по своему уникальному номеру, называемому OID (Object Identi-fier)
и сохраняется в файловой системе (в директории PGDATA) в файле, имя которого совпадает с этим
номером. Файл с данными может разрастись максимум до размера в 1Гб, после чего будет разбит
на сегменты, название которых будет формироваться как OID и соответствующая часть счетчика.