Страницы

Сохранить статью у себя в соцсети:

понедельник, 11 марта 2013 г.

§ Postgres-XC: Cluster setup.

Postgres-XC: настройка кластера.

постгрес

Статья описывает практическую часть работы с Postgres-XC, в частности приводится пример сборки кластера который включает в себя:
  • развертывание двух менеджеров транзакций (main и standby);
  • развертывание координатора;
  • развертывание двух узлов с данными.
Перед установкой, с помощью DNS или файлов hosts заводим соответствия между именами и IP-адресами. В конфигурации будем использовать только имена. При использовании hosts, соответствия прописываем на каждый узел будущего кластера.
10.1.21.1 datanode1 node1
10.1.21.2 datanode2 node2
10.1.21.3 coordinator1 coord1
10.1.21.4 gtm one
10.1.21.5 gtm-standby two

Установку выполняем из исходных кодов (я ставил в Gentoo Linux, но для Debian/Ubuntu есть пакеты в sid). Каталогом назначения выбираем /usr/pgxc-1.0, номер версии указываем с учетом мультиверсионной установки (вдруг пройдет какое-то время и выпустят 1.2 и мы захотим ее установить рядом), также укажем сборку с Perl. Дополнительно можно установить документацию и расширения (contribs). Установку нужно выполнить на всех узлах будущего кластера.
# ./configure --prefix=/usr/pgxc-1.0 --with-perl
# make 
# make install 
# make install-docs
# make install-world

После установки, на каждом из узлов, создаем учетную запись под которой будут работать сервисы. Каталог размещения бинарных файлов добавим в переменную PATH.
# useradd -m -d /srv/pgxc postgres
# echo 'PATH=/usr/pgxc-1.0/bin:$PATH' > ~postgres/.bashrc
# echo '[[ -f ~/.bashrc ]] && . ~/.bashrc' > ~postgres/.bash_profile

Теперь переходим в созданную учетную запись и начинаем инициализацию узлов. Будьте внимательны, для каждого узла выполняем инициализацию только его роли.
$ su - postgres
node1 $ initdb -D /srv/pgxc/data_datanode1 --nodename datanode1
node2 $ initdb -D /srv/pgxc/data_datanode2 --nodename datanode2
coord1 $ initdb -D /srv/pgxc/data_coord1 --nodename coord1
gtm $ initgtm -D /srv/pgxc/data_gtm -Z gtm
gtm-standby $ initgtm -D /srv/pgxc/data_gtm -Z gtm

Теперь для каждого из узлов выполняем настройку конфигурации (указаны только имеющие первостепенные для запуска опции):
gtm $ vi /srv/pgxc/data_gtm/gtm.conf
nodename = 'one'
listen_addresses = '*'
port = 6666
startup = ACT

gtm-standby $ vi /srv/pgxc/data_gtm/gtm.conf
nodename = 'two'
listen_addresses = '*'
port = 6666
startup = STANDBY
active_host = 'one'
active_port = 6666

node1 $ vi /srv/pgxc/data_datanode1/postgresql.conf
listen_addresses = '*'
max_connections = 30
max_prepared_transactions = 30
gtm_host = 'gtm'
gtm_port = 6666
pgxc_node_name = 'datanode1'

node2 $ vi /srv/pgxc/data_datanode2/postgresql.conf
listen_addresses = '*'
max_connections = 30
max_prepared_transactions = 30
gtm_host = 'gtm'
gtm_port = 6666
pgxc_node_name = 'datanode2'

coord1 $ vi /srv/pgxc/data_coord1/postgresql.conf
listen_addresses = '*'
max_connections = 30
max_prepared_transactions = 10
gtm_host = 'gtm'
gtm_port = 6666
pgxc_node_name = 'coord1'
enforce_two_phase_commit = on

Несколько нюансов о параметрах:
При определении числа max_connections для узлов данных, следует помнить о числе координаторов. Каждый координатор имея определенное число соединений, может совершить столько же к узлу данных. Следовательно, нужно указать общее количество соединений, которое могут принять все координаторы. К примеру если у вас 4 координатора и каждый координатор может принять 100 соединений, для узлов данных следует указать значение max_connections в 400. При определении параметра для координатора, можно брать в расчет только максимальное число соединений от приложения. 

max_prepared_transactions. Даже если приложение не использует PREPARE TRANSACTION, координатор может использовать их в случае когда используется несколько узлов данных. Этот параметр рекомендуется установить равным max_connections. Для координатора следует указать значение равное числу координаторов в кластере (по умолчанию вообще 10).

pgxc_node_name - Глобальный менеджер транзакций идентифицирует каждый узел по имени указанном в этом параметре.

Также стоит отметить, что узлы с данными и координаторы представляют собой модифицированные сервера PostgreSQL и для них действительны параметры доступа pg_hba. Координатор должен иметь доступ в узлы данных (иначе будет ERROR: Failed to get pooled connections), а клиенты должны иметь возможность устанавливать соединения с кординатором. В своем случае во всех pg_hba.conf я прописываю возможность доверенного подключения для всей сети.
$ vi pg_hba.conf 
host all all 10.1.21.0/16 trust

Теперь переходим к запуску сервисов. Начинаем с менеджера транзакций и заканчиваем узлами данных:
gtm $ gtm_ctl -Z gtm -D /srv/pgxc/data_gtm -l logfile start
gtm-standby $ gtm_ctl -Z gtm -D /srv/pgxc/data_gtm -l logfile start
coord1 $ pg_ctl start -D /srv/pgxc/data_coord1 -Z coordinator -l logfile
node1 $ pg_ctl start -D /srv/pgxc/data_datanode1 -Z datanode -l logfile
node2 $ pg_ctl start -D /srv/pgxc/data_datanode2 -Z datanode -l logfile

После запуска сервисов, инициализируем узлы данных. Выполняем подключение к координатору с любого хоста. Клиентской утилитой может быть psql из стандартного пакета postgresql (вот она совместимость с оригинальным PostgreSQL API, не нужно вносить никаких изменений в клиентское приложение). 
client $ psql -h coord1 -U postgres -c "CREATE NODE datanode1 WITH (TYPE = 'datanode', HOST = '10.101.15.1', PORT = 5432)"
client $ psql -h coord1 -U postgres -c "CREATE NODE datanode2 WITH (TYPE = 'datanode', HOST = '10.101.15.2', PORT = 5432)"
client $ psql -h coord1 -U postgres -c "SELECT pgxc_pool_reload()"

Теперь создаем нашу первую базу.
client $ createdb -h coord1 -U postgres test

Если не появилось сообщений об ошибках значит все сделано верно и база создана успешно.

На главную "Virtualizing Linux"

Комментариев нет:

Отправить комментарий

Популярные сообщения

Профиль в Google+ Яндекс цитирования Яндекс.Метрика