В этой статье объясняется, как настроить Active/Passive кластера PostgreSQL, с использованием Pacemaker, Corosync и DRBD.
Подготовлено Рафаэль Марангони, из команды BRLink Servidor Linux
За основу был взят дистрибутив Centos 5.5, но за основу Вы можете взять Red Hat Linux или Fedore Core
Мы будем использовать DRBD для репликации PostgreSQL данных между узлами и Вам необходимо иметь диск или раздел исключительно DRBD.
Помните: разбиение дисков нужно делать во время установки
Мы используем два Gigabit NIC's на узел, один (eth0) подключиться к сети (LAN), а другой (eth1) с перекрестным кабелем подключения для обоих узлов. Перекрестный кабель служит для производительности системы.
И так, мы будем использовать два физических нода node1.clusterbr.int и node2.clusterbr.int:
node1.clusterbr.int: ip первого нода 10.0.0.191 (LAN) и ip 172.16.0.1 (перекрестное соединение)
node2.clusterbr.int: ip 10.0.0.192 (LAN) и IP 172.16.0.2 (перекрестное соединение)
dbip.clusterbr.int: ip кластера, 10.0.0.190 (Во всех приложениях должен указываться этот IP для доступа к PostgreSQL)
* Перекрестное соединение я буду писать как Cross-Over
Оба узла имеют по два раздела:
/dev/sda: для операционки;
/dev/sdb: для DRBD.
Версия PostgreSQL 8.5, все данные которые будут хранится на DRBD будут использоваться в рамках нашего кластера.
Отключаем SELINUX:
(Правим только эту строку, остальное оставляем как есть)
Настраиваем имя хоста и шлюзы узлов:
node1:
Настраиваем сетевые интерфейсы:
node1:
LAN интерфейс:
Cross-Over/DRBD интерфейс:
node2:
LAN интерфейс:
Cross-Over/DRBD интерфейс:
Настройка DNS:
Настройка hostname:
Конфигурация одинакова на обоих нодах:
Проверяем сеть:
node1:
Пингуем node2 (через LAN интерфейс):
Пингуем node2 (через cross-over интерфейс):
node2:
Пингуем node1 (через LAN интерфейс):
Пингуем node1 (через cross-over интерфейс):
Настроим параметры инициализации:
(Изменение вносим только в эту строку, остальное оставляем как есть)
Посмотрим запущенные службы:
Теперь после выполнения выше описанных действий, перегрузим наши узлы.
Ставим необходимые пакет:
Добавим репозиторий:
Теперь мы установи ClusterLabs EPEL репозиторий:
Устанавливаем кластер и DRBD пакеты:
Во первых нам нужно настроить DRBD на обоих узлах:
resource: Ссылаемся на ресурс, который будет управлять по DRBD, и мы его называли «Postgres»
disk: Указываем устройство которое будет использовать DRBD (диск или раздел)
address: IP-адрес и порт, который будет использовать DRBD (мы указали Cross-Over интерфейсы)
syncer: Скорость передачи данных между узлами
Если у Вас возникли какие либо вопросы или сомнения Вы можете всегда воспользоваться мануалом: www.drbd.org/users-guide-emb
После этой конфигурации мы можем создать метаданные о ресурсах PostgreSQL
Выполнив следующее:
node1:
node2:
Далее нам нужно создать ресурс до подключения, опять же выполним на обоих узлах следующие действия:
Теперь мы можем сделать начальную синхронизацию между узлами, делаем синхронизацию на основной узел выбрав node1:
Что бы проверить синхронизацию смотрим:
Дождемся завершения синхронизации. Процесс может занять долгое время, все зависит от размера, производительности дисков и конечно скорость интерфейсов кластера сети.
После того как процесс синхронизации закончился мы можем взглянуть на состояние ресурсов postgre
node1:
node2:
Во первых нам нужно запустить сервис DRBD на обоих узлах
Как ранее было сказано узел node1 у нас основной и поэтому выполним на нем команду:
Primary/Secondary означает что локальный сервер является основным, а другой вторичным.
Далее нам нужно форматнуть DRBD и выберем в качестве файловой системы ext3.
node1:
После этого мы можем смонтировать устройство, в качестве стандартного расположения PostgreSQL.
Смонтируем раздел на узле:
node1:
Далее поменяем владельца и группу монтирования:
node1:
Теперь инициализируем базу данных PostgreSQL:
node1:
Я предпочитаю проверять аутентификацию на узлах кластера и ip:
node1:
Далее мы сделаем настройку что бы PostgreSQL начал работать на всех интерфейсах:
node1:
Раскомментируйте только эту строку:
Запустим PostgreSQL:
node1:
Теперь создадим пользователя с правами администратора для управления PostgeSQL:
node1:
Вам нужно установить пароль на admpgsql
После этого мы создадим БД и наполним ее:
node1:
pgbench заполнит некоторой информацией базу:
Теперь обратимся к базе для проверки:
node1:
На этом настройка закончена.
Проверяем работу PostgreSQL на node2:
Но прежде чем на начнем работать с сервисом Pacemaker, лучше убедится что postgre будет работать на node2.
Во первых, на node1 мы должны остановить postgresql:
node1:
Далее раз монтировать DRBD:
Теперь мы сделаем node1 как вторичный на DRBD:
Теперь на node2 сделаем DRBD первичным:
node2:
Далее монтируем устройство DRBD:
и наконец запускаем PostgreSQL:
Теперь проверим сможем ли мы получить доступ к pgbench по node2:
После того как мы убедились что все работает нормально, мы должны инициализировать наш кластер:
node2:
node1:
Нам нужно сделать так что бы все службы были отключены на обоих узлах, выполнив команды на обоих нодах:
Делаем настройку Corosync
node1:
Затем проверим данные:
Переменная ais_addr должна содержать сетевой адрес, который кластер будет слушать В нашем случае это 10.0.0.0
Далее мы создам файл конфигурации corosync:
Добавим в наш конфиг следующее:
Файл
Из node1 мы перекинем конфигу на node2:
На обоих нодах нам нужно создать каталог лоя голов:
Теперь запустим corosync
node1:
Давайте проверим в порядке ли наша служба:
node1:
Проверим наши интерфейсы которые должен слушать corosync:
Далее смотрим pacemaker:
Смотрим в процессах наш corosync:
Если все прошло успешно, то мы можем corosync перенести на node2
node2:
Выполняем проверку кластера на обоих узлах:
Мы должны быть уверены в том что оба узла определяются как online
Добавим corosync в автозагрузку на обоих узлах:
Важные команды для управления кластером:
Проверка конфигурации кластера:
Получаем список и статус кластера:
Список конфигурации кластера:
Список открытых crm консолей
Настройка Stonith
При проверки конфигурации кластера мы должны получить некоторые ошибки:
Таким образом, что бы отключить Stonith мы должны выполнить следующую команду на одной из ноде:
Теперь проверка конфигурации кластера должна пройти без ошибок:
Основные настройки кластера
Выполним команду на любом узле из наших нод:
Настройка значения поменяет ресурс на другой узел, тем самым при сбое синхронизации на одной из ноде произойдет перехват синхронизации другим узлом.
Посмотрим нашу конфигурацию:
Конфигурация DBIP
Добавим в конфиг DBIP ip-адрес нашего кластера:
Проверяем статус:
Отметим, что состояние кластера показывает где работает наш ресурс, в данный момент работа происходит на node2, но также он может работать и на node1
Конфигурация DRBD на кластере
Добавим DRBD в наш кластер:
Настроим первичный и вторичный нод:
Смонтируем DRBD:
Настройка PostgreSQL на кластере
Добавим postgresql в наш кластер:
Теперь мы должны наши сервисы добавить в группу postgres
Конфигурируем postgre для запуска после:
Посмотрим конфигурацию кластера
Настраиваем предпочтительный узел:
Проверяем статус:
Если у Вас появятся ошибки вы должны перегрузить оба узла, что бы новые конфигурации corosync были приняты системой. Также после ребута системы, мы должны подключиться к DBIP (10.0.0.190) по TCP 5432 порту к сервису postgres.
Управление кластером
Перенос ресурса на другой узел:
Удаление команды migrate:
Чистим наши сообщения:
Остановка сервиса PostgreSQL
Запуск сервиса PostgreSQL
Веб интерфейс будет удобен для мониторинга нашего кластера
Стартуем apache:
Создаем директорию для кластера (DocumentRoot):
Для генерации страниц делаем следующее:
и сделаем положим это все дело в автозагрузку:
Проверяем доступность нашей морды в браузере:
Выполняем действия на обоих узлах:
Устанавливаем:
Идем в браузере по адресу 10.0.0.190/cluster-pgadmin
П.С. Логин и пароль были введены при установке postgresql
Если Вам потребуется доступ к postgresql из локальной сети, не забудьте настроить проверку подлиности на Postgres
Здесь мы установим MD5 аутентификацию по сети к 10.0.0.0/24
Перезапустим postgres:
Мониторинг кластера является обязательной частью всего процесса выполнения скриптов. Я предлагаю Вам проводить мониторинг с помощью Zabbix, для этого на каждом узле установите Zabbix agent и настраивайте мониторинг по этим пунтам:
1. Проверка пинга на доступность (10.0.0.191, 10.0.0.192 и 172.16.0.1, 172.16.0.2)
2. Проверка доступности DBIP (ip кластера) 10.0.0.190
3. Проверка порта TCP 5432 на DBIP 10.0.0.190
4. Проверка цпу, озу и диск
5. Вы можете использовать скрипт monitor_drbd.sh (Результат возвращает 1 когда все в порядке и 0 когда есть проблемы)
Скрипт monitor_drbd.sh для Zabbix:
P.S. Если Вы увидели опечатки или же не соответствие в переводе, очень сильно Вас прошу написал в ЛС.
Я быстренько все поправлю во благо обществу.
Подготовлено Рафаэль Марангони, из команды BRLink Servidor Linux
1. Замечания:
Linux дистрибутив:
За основу был взят дистрибутив Centos 5.5, но за основу Вы можете взять Red Hat Linux или Fedore Core
Мы будем использовать DRBD для репликации PostgreSQL данных между узлами и Вам необходимо иметь диск или раздел исключительно DRBD.
Помните: разбиение дисков нужно делать во время установки
Сетевое оборудование/Топология:
Мы используем два Gigabit NIC's на узел, один (eth0) подключиться к сети (LAN), а другой (eth1) с перекрестным кабелем подключения для обоих узлов. Перекрестный кабель служит для производительности системы.
И так, мы будем использовать два физических нода node1.clusterbr.int и node2.clusterbr.int:
node1.clusterbr.int: ip первого нода 10.0.0.191 (LAN) и ip 172.16.0.1 (перекрестное соединение)
node2.clusterbr.int: ip 10.0.0.192 (LAN) и IP 172.16.0.2 (перекрестное соединение)
dbip.clusterbr.int: ip кластера, 10.0.0.190 (Во всех приложениях должен указываться этот IP для доступа к PostgreSQL)
* Перекрестное соединение я буду писать как Cross-Over
Диски:
Оба узла имеют по два раздела:
/dev/sda: для операционки;
/dev/sdb: для DRBD.
PostgreSQL:
Версия PostgreSQL 8.5, все данные которые будут хранится на DRBD будут использоваться в рамках нашего кластера.
2. Подготовка узлов:
Отключаем SELINUX:
vi /etc/selinux/config
(Правим только эту строку, остальное оставляем как есть)
SELINUX=disabled
Настраиваем имя хоста и шлюзы узлов:
vi /etc/sysconfig/network
node1:
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node1.clusterbr.int
GATEWAY=10.0.0.9
node2:
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node2.clusterbr.int
GATEWAY=10.0.0.9
Настраиваем сетевые интерфейсы:
node1:
LAN интерфейс:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=10.0.0.191
NETMASK=255.255.255.0
ONBOOT=yes
HWADDR=a6:1e:3d:67:66:78
Cross-Over/DRBD интерфейс:
vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
IPADDR=172.16.0.1
NETMASK=255.255.255.0
ONBOOT=yes
HWADDR=ee:ef:ff:9a:9a:57
node2:
LAN интерфейс:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=10.0.0.192
NETMASK=255.255.255.0
ONBOOT=yes
HWADDR=52:52:a1:1a:62:32
Cross-Over/DRBD интерфейс:
vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
IPADDR=172.16.0.2
NETMASK=255.255.255.0
ONBOOT=yes
HWADDR=1a:18:b2:50:96:1e
Настройка DNS:
vi /etc/resolv.conf
search clusterbr.int
nameserver 10.0.0.9
Настройка hostname:
Конфигурация одинакова на обоих нодах:
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
10.0.0.191 node1.clusterbr.int node1
10.0.0.192 node2.clusterbr.int node2
10.0.0.190 dbip.clusterbr.int node2
Проверяем сеть:
node1:
Пингуем node2 (через LAN интерфейс):
ping -c 2 node2
[root@node1 ~]# ping -c 2 node2
PING node2 (10.0.0.192) 56(84) bytes of data.
64 bytes from node2 (10.0.0.192): icmp_seq=1 ttl=64 time=0.089 ms
64 bytes from node2 (10.0.0.192): icmp_seq=2 ttl=64 time=0.082 ms
--- node2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.082/0.085/0.089/0.009 ms
Пингуем node2 (через cross-over интерфейс):
ping -c 2 172.16.0.2
[root@node1 ~]# ping -c 2 172.16.0.2
PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data.
64 bytes from 172.16.0.2: icmp_seq=1 ttl=64 time=0.083 ms
64 bytes from 172.16.0.2: icmp_seq=2 ttl=64 time=0.083 ms
--- 172.16.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.083/0.083/0.083/0.000 ms
node2:
Пингуем node1 (через LAN интерфейс):
ping -c 2 node1
[root@node2 ~]# ping -c 2 node1
PING node1 (10.0.0.191) 56(84) bytes of data.
64 bytes from node1 (10.0.0.191): icmp_seq=1 ttl=64 time=0.068 ms
64 bytes from node1 (10.0.0.191): icmp_seq=2 ttl=64 time=0.063 ms
--- node1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.063/0.065/0.068/0.008 ms
Пингуем node1 (через cross-over интерфейс):
ping -c 2 172.16.0.1
[root@node2 ~]# ping -c 2 172.16.0.1
PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data.
64 bytes from 172.16.0.1: icmp_seq=1 ttl=64 time=1.36 ms
64 bytes from 172.16.0.1: icmp_seq=2 ttl=64 time=0.075 ms
--- 172.16.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.075/0.722/1.369/0.647 ms
Настроим параметры инициализации:
(Изменение вносим только в эту строку, остальное оставляем как есть)
vi /etc/inittab
id:3:initdefault:
Посмотрим запущенные службы:
chkconfig --list | grep 3:sim
[root@node1 ~]# chkconfig --list | grep 3:sim
acpid 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
anacron 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
apmd 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
atd 0:não 1:não 2:não 3:sim 4:sim 5:sim 6:não
cpuspeed 0:não 1:sim 2:sim 3:sim 4:sim 5:sim 6:não
crond 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
irqbalance 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
kudzu 0:não 1:não 2:não 3:sim 4:sim 5:sim 6:não
network 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
rawdevices 0:não 1:não 2:não 3:sim 4:sim 5:sim 6:não
sshd 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
syslog 0:não 1:não 2:sim 3:sim 4:sim 5:sim 6:não
Теперь после выполнения выше описанных действий, перегрузим наши узлы.
3. Установка необходимого ПО
Ставим необходимые пакет:
yum install -y postgresql84** gcc perl-mailtools perl-dbi php-pgsql
Добавим репозиторий:
rpm -Uvh download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
Теперь мы установи ClusterLabs EPEL репозиторий:
wget -O /etc/yum.repos.d/pacemaker.repo clusterlabs.org/rpm/epel-5/clusterlabs.repo
Устанавливаем кластер и DRBD пакеты:
yum install -y pacemaker corosync drbd83 kmod-drbd83 heartbeat
4. Настройка DRBD
Во первых нам нужно настроить DRBD на обоих узлах:
vi /etc/drbd.conf
global {
usage-count no;
}
common {
syncer { rate 100M; }
protocol C;
}
resource postgres {
startup {
wfc-timeout 0;
degr-wfc-timeout
120;
}
disk { on-io-error detach; }
on node1.clusterbr.int {
device /dev/drbd0;
disk /dev/sdb;
address 172.16.0.1:7791;
meta-disk internal;
}
on node2.clusterbr.int {
device /dev/drbd0;
disk /dev/sdb;
address 172.16.0.2:7791;
meta-disk internal;
}
}
Основные пункты конфигурации:
resource: Ссылаемся на ресурс, который будет управлять по DRBD, и мы его называли «Postgres»
disk: Указываем устройство которое будет использовать DRBD (диск или раздел)
address: IP-адрес и порт, который будет использовать DRBD (мы указали Cross-Over интерфейсы)
syncer: Скорость передачи данных между узлами
Если у Вас возникли какие либо вопросы или сомнения Вы можете всегда воспользоваться мануалом: www.drbd.org/users-guide-emb
После этой конфигурации мы можем создать метаданные о ресурсах PostgreSQL
Выполнив следующее:
node1:
drbdadm create-md postgres
[root@node1 ~]# drbdadm create-md postgres
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
node2:
drbdadm create-md postgres
[root@node2 ~]# drbdadm create-md postgres
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
Далее нам нужно создать ресурс до подключения, опять же выполним на обоих узлах следующие действия:
drbdadm up postgres
Теперь мы можем сделать начальную синхронизацию между узлами, делаем синхронизацию на основной узел выбрав node1:
drbdadm -- --overwrite-data-of-peer primary postgres
Что бы проверить синхронизацию смотрим:
cat /proc/drbd
[root@node1 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
ns:48128 nr:0 dw:0 dr:48128 al:0 bm:2 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:8340188
[>....................] sync'ed: 0.6% (8144/8188)M delay_probe: 7
finish: 0:11:29 speed: 12,032 (12,032) K/sec
Дождемся завершения синхронизации. Процесс может занять долгое время, все зависит от размера, производительности дисков и конечно скорость интерфейсов кластера сети.
После того как процесс синхронизации закончился мы можем взглянуть на состояние ресурсов postgre
node1:
cat /proc/drbd
[root@node1 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
ns:8388316 nr:0 dw:0 dr:8388316 al:0 bm:512 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
node2:
cat /proc/drbd
[root@node2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----
ns:0 nr:8388316 dw:8388316 dr:0 al:0 bm:512 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
5. Настройка PostgreSQL
Во первых нам нужно запустить сервис DRBD на обоих узлах
/etc/init.d/drbd start
Как ранее было сказано узел node1 у нас основной и поэтому выполним на нем команду:
cat /proc/drbd
[root@node1 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
ns:8388316 nr:0 dw:0 dr:8388316 al:0 bm:512 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
Primary/Secondary означает что локальный сервер является основным, а другой вторичным.
Далее нам нужно форматнуть DRBD и выберем в качестве файловой системы ext3.
node1:
mkfs.ext3 /dev/drbd0
После этого мы можем смонтировать устройство, в качестве стандартного расположения PostgreSQL.
Смонтируем раздел на узле:
node1:
mount -t ext3 /dev/drbd0 /var/lib/pgsql
Далее поменяем владельца и группу монтирования:
node1:
chown postgres.postgres /var/lib/pgsql
Теперь инициализируем базу данных PostgreSQL:
node1:
su - postgres
initdb /var/lib/pgsql/data
exit
Я предпочитаю проверять аутентификацию на узлах кластера и ip:
node1:
echo "host all all 10.0.0.191/32 trust" >> /var/lib/pgsql/data/pg_hba.conf
echo "host all all 10.0.0.192/32 trust" >> /var/lib/pgsql/data/pg_hba.conf
echo "host all all 10.0.0.190/32 trust" >> /var/lib/pgsql/data/pg_hba.conf
Далее мы сделаем настройку что бы PostgreSQL начал работать на всех интерфейсах:
node1:
vi /var/lib/pgsql/data/postgresql.conf
Раскомментируйте только эту строку:
listen_addresses = '0.0.0.0'
Запустим PostgreSQL:
node1:
/etc/init.d/postgresql start
Теперь создадим пользователя с правами администратора для управления PostgeSQL:
node1:
su - postgres
createuser --superuser admpgsql --pwprompt
Вам нужно установить пароль на admpgsql
После этого мы создадим БД и наполним ее:
node1:
su - postgres
createdb pgbench
pgbench -i pgbench
pgbench заполнит некоторой информацией базу:
pgbench -i pgbench
-bash-3.2$ pgbench -i pgbench
NOTA: tabela "pgbench_branches" não existe, ignorando
NOTA: tabela "pgbench_tellers" não existe, ignorando
NOTA: tabela "pgbench_accounts" não existe, ignorando
NOTA: tabela "pgbench_history" não existe, ignorando
creating tables...
10000 tuples done.
20000 tuples done.
30000 tuples done.
40000 tuples done.
50000 tuples done.
60000 tuples done.
70000 tuples done.
80000 tuples done.
90000 tuples done.
100000 tuples done.
set primary key...
NOTA: ALTER TABLE / ADD PRIMARY KEY criará à ndice implà cito "pgbench_branches_pkey" na tabela "pgbench_branches"
NOTA: ALTER TABLE / ADD PRIMARY KEY criará à ndice implà cito "pgbench_tellers_pkey" na tabela "pgbench_tellers"
NOTA: ALTER TABLE / ADD PRIMARY KEY criará à ndice implà cito "pgbench_accounts_pkey" na tabela "pgbench_accounts"
vacuum...done.
Теперь обратимся к базе для проверки:
node1:
psql -U admpgsql -d pgbench
select * from pgbench_tellers;
psql -U admpgsql -d pgbench
psql (8.4.5)
Digite "help" para ajuda.
pgbench=# select * from pgbench_tellers;
tid | bid | tbalance | filler
-----+-----+----------+--------
1 | 1 | 0 |
2 | 1 | 0 |
3 | 1 | 0 |
4 | 1 | 0 |
5 | 1 | 0 |
6 | 1 | 0 |
7 | 1 | 0 |
8 | 1 | 0 |
9 | 1 | 0 |
10 | 1 | 0 |
(10 registros)
На этом настройка закончена.
Проверяем работу PostgreSQL на node2:
Но прежде чем на начнем работать с сервисом Pacemaker, лучше убедится что postgre будет работать на node2.
Во первых, на node1 мы должны остановить postgresql:
node1:
/etc/init.d/postgresql stop
Далее раз монтировать DRBD:
umount /dev/drbd0
Теперь мы сделаем node1 как вторичный на DRBD:
drbdadm secondary postgres
Теперь на node2 сделаем DRBD первичным:
node2:
drbdadm primary postgres
Далее монтируем устройство DRBD:
mount -t ext3 /dev/drbd0 /var/lib/pgsql/
и наконец запускаем PostgreSQL:
/etc/init.d/postgresql start
Теперь проверим сможем ли мы получить доступ к pgbench по node2:
psql -U admpgsql -d pgbench
select * from pgbench_tellers;
[root@node2 ~]# psql -U admpgsql -d pgbench
psql (8.4.5)
Digite "help" para ajuda.
pgbench=# select * from pgbench_tellers;
tid | bid | tbalance | filler
-----+-----+----------+--------
1 | 1 | 0 |
2 | 1 | 0 |
3 | 1 | 0 |
4 | 1 | 0 |
5 | 1 | 0 |
6 | 1 | 0 |
7 | 1 | 0 |
8 | 1 | 0 |
9 | 1 | 0 |
10 | 1 | 0 |
(10 registros)
После того как мы убедились что все работает нормально, мы должны инициализировать наш кластер:
node2:
/etc/init.d/postgresql stop
umount /dev/drbd0
drbdadm secondary postgres
/etc/init.d/drbd stop
node1:
drbdadm primary postgres
/etc/init.d/drbd stop
Нам нужно сделать так что бы все службы были отключены на обоих узлах, выполнив команды на обоих нодах:
chkconfig --level 35 drbd off
chkconfig --level 35 postgresql off
6. Настройка Corosync (openAIS)
Делаем настройку Corosync
node1:
export ais_port=4000
export ais_mcast=226.94.1.1
export ais_addr=`ip address show eth0 | grep "inet " | tail -n 1 | awk '{print $4}' | sed s/255/0/`
Затем проверим данные:
env | grep ais_
Переменная ais_addr должна содержать сетевой адрес, который кластер будет слушать В нашем случае это 10.0.0.0
Далее мы создам файл конфигурации corosync:
cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
sed -i.gres "s/.*mcastaddr:.*/mcastaddr:\ $ais_mcast/g" /etc/corosync/corosync.conf
sed -i.gres "s/.*mcastport:.*/mcastport:\ $ais_port/g" /etc/corosync/corosync.conf
sed -i.gres "s/.*bindnetaddr:.*/bindnetaddr:\ $ais_addr/g" /etc/corosync/corosync.conf
Добавим в наш конфиг следующее:
cat <<-END >>/etc/corosync/corosync.conf
aisexec {
user: root
group: root
}
END
cat <<-END >>/etc/corosync/corosync.conf
service {
# Load the Pacemaker Cluster Resource Manager
name: pacemaker
ver: 0
}
END
Файл
/etc/corosync/corosync.conf
выглядит следующим образом:compatibility: whitetank
totem {
version: 2
secauth: off
threads: 0
interface {
ringnumber: 0
bindnetaddr: 10.0.0.0
mcastaddr: 226.94.1.1
mcastport: 4000
}
}
logging {
fileline: off
to_stderr: yes
to_logfile: yes
to_syslog: yes
logfile: /tmp/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}
aisexec {
user: root
group: root
}
service {
# Load the Pacemaker Cluster Resource Manager
name: pacemaker
ver: 0
}
Из node1 мы перекинем конфигу на node2:
scp /etc/corosync/* node2:/etc/corosync/
На обоих нодах нам нужно создать каталог лоя голов:
mkdir /var/log/cluster/
Теперь запустим corosync
node1:
/etc/init.d/corosync start
Давайте проверим в порядке ли наша служба:
node1:
grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages
[root@node1 bin]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages
Apr 7 12:37:21 node1 corosync[23533]: [MAIN ] Corosync Cluster Engine ('1.2.0'): started and ready to provide service.
Apr 7 12:37:21 node1 corosync[23533]: [MAIN ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
Проверим наши интерфейсы которые должен слушать corosync:
grep TOTEM /var/log/messages
[root@node1 bin]# grep TOTEM /var/log/messages
Apr 7 12:37:21 node1 corosync[23533]: [TOTEM ] Initializing transport (UDP/IP).
Apr 7 12:37:21 node1 corosync[23533]: [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
Apr 7 12:37:21 node1 corosync[23533]: [TOTEM ] The network interface [10.0.0.191] is now up.
Apr 7 12:37:21 node1 corosync[23533]: [TOTEM ] A processor joined or left the membership and a new membership was formed.
Далее смотрим pacemaker:
grep pcmk_startup /var/log/messages
[root@node1 bin]# grep pcmk_startup /var/log/messages
Apr 7 12:37:21 node1 corosync[23533]: [pcmk ] info: pcmk_startup: CRM: Initialized
Apr 7 12:37:21 node1 corosync[23533]: [pcmk ] Logging: Initialized pcmk_startup
Apr 7 12:37:21 node1 corosync[23533]: [pcmk ] info: pcmk_startup: Maximum core file size is: 4294967295
Apr 7 12:37:21 node1 corosync[23533]: [pcmk ] info: pcmk_startup: Service: 9
Apr 7 12:37:21 node1 corosync[23533]: [pcmk ] info: pcmk_startup: Local hostname: node1
Смотрим в процессах наш corosync:
ps axf
[root@node1 bin]# ps axf
(should contain something like this)
23533 ? Ssl 0:00 corosync
23539 ? SLs 0:00 \_ /usr/lib/heartbeat/stonithd
23540 ? S 0:00 \_ /usr/lib/heartbeat/cib
23541 ? S 0:00 \_ /usr/lib/heartbeat/lrmd
23542 ? S 0:00 \_ /usr/lib/heartbeat/attrd
23543 ? S 0:00 \_ /usr/lib/heartbeat/pengine
23544 ? S 0:00 \_ /usr/lib/heartbeat/crmd
Если все прошло успешно, то мы можем corosync перенести на node2
node2:
/etc/init.d/corosync start
Выполняем проверку кластера на обоих узлах:
crm_mon -1
[root@node1 ~]# crm_mon -1
============
Last updated: Fri Oct 29 17:44:36 2010
Stack: openais
Current DC: node1.clusterbr.int - partition with quorum
Version: 1.0.9-89bd754939df5150de7cd76835f98fe90851b677
2 Nodes configured, 2 expected votes
0 Resources configured.
============
Online: [ node1.clusterbr.int node2.clusterbr.int ]
Мы должны быть уверены в том что оба узла определяются как online
Добавим corosync в автозагрузку на обоих узлах:
chkconfig --level 35 corosync on
7. Настройка Pacemaker
Важные команды для управления кластером:
Проверка конфигурации кластера:
crm_verify -L
Получаем список и статус кластера:
crm_mon -1
Список конфигурации кластера:
crm configure show
Список открытых crm консолей
crm
Настройка Stonith
При проверки конфигурации кластера мы должны получить некоторые ошибки:
crm_verify -L
Таким образом, что бы отключить Stonith мы должны выполнить следующую команду на одной из ноде:
crm configure property stonith-enabled=false
Теперь проверка конфигурации кластера должна пройти без ошибок:
crm_verify -L
Основные настройки кластера
Выполним команду на любом узле из наших нод:
crm configure property no-quorum-policy=ignore
Настройка значения поменяет ресурс на другой узел, тем самым при сбое синхронизации на одной из ноде произойдет перехват синхронизации другим узлом.
crm configure rsc_defaults resource-stickiness=100
Посмотрим нашу конфигурацию:
crm configure show
[root@node1 ~]# crm configure show
node node1.clusterbr.int
node node2.clusterbr.int
property $id="cib-bootstrap-options" \
dc-version="1.0.9-89bd754939df5150de7cd76835f98fe90851b677" \
cluster-infrastructure="openais" \
expected-quorum-votes="2" \
stonith-enabled="false" \
no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
resource-stickiness="100"
Конфигурация DBIP
Добавим в конфиг DBIP ip-адрес нашего кластера:
crm configure primitive DBIP ocf:heartbeat:IPaddr2 \
params ip=10.0.0.190 cidr_netmask=24 \
op monitor interval=30s
Проверяем статус:
crm_mon -1
[root@node1 ~]# crm_mon -1
============
Last updated: Fri Oct 29 17:47:53 2010
Stack: openais
Current DC: node1.clusterbr.int - partition with quorum
Version: 1.0.9-89bd754939df5150de7cd76835f98fe90851b677
2 Nodes configured, 2 expected votes
1 Resources configured.
============
Online: [ node2.clusterbr.int node1.clusterbr.int ]
DBIP (ocf::heartbeat:IPaddr2): Started node2.clusterbr.int
Отметим, что состояние кластера показывает где работает наш ресурс, в данный момент работа происходит на node2, но также он может работать и на node1
Конфигурация DRBD на кластере
Добавим DRBD в наш кластер:
crm configure primitive drbd_postgres ocf:linbit:drbd \
params drbd_resource="postgres" \
op monitor interval="15s"
Настроим первичный и вторичный нод:
crm configure ms ms_drbd_postgres drbd_postgres \
meta master-max="1" master-node-max="1" \
clone-max="2" clone-node-max="1" \
notify="true"
Смонтируем DRBD:
crm configure primitive postgres_fs ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/var/lib/pgsql" fstype="ext3"
Настройка PostgreSQL на кластере
Добавим postgresql в наш кластер:
crm configure primitive postgresql ocf:heartbeat:pgsql \
op monitor depth="0" timeout="30" interval="30"
Теперь мы должны наши сервисы добавить в группу postgres
crm configure group postgres postgres_fs DBIP postgresql
crm configure colocation postgres_on_drbd inf: postgres ms_drbd_postgres:Master
Конфигурируем postgre для запуска после:
DRBDcrm configure order postgres_after_drbd inf: ms_drbd_postgres:promote postgres:start
Посмотрим конфигурацию кластера
crm configure show
[root@node1 ~]# crm configure show
node node1.clusterbr.int
node node2.clusterbr.int
primitive DBIP ocf:heartbeat:IPaddr2 \
params ip="10.0.0.190" cidr_netmask="24" \
op monitor interval="30s"
primitive drbd_postgres ocf:linbit:drbd \
params drbd_resource="postgres" \
op monitor interval="15s"
primitive postgres_fs ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/var/lib/pgsql" fstype="ext3"
primitive postgresql ocf:heartbeat:pgsql \
op monitor interval="30" timeout="30" depth="0" \
meta target-role="Started"
group postgres postgres_fs DBIP postgresql \
meta target-role="Started"
ms ms_drbd_postgres drbd_postgres \
meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
colocation postgres_on_drbd inf: postgres ms_drbd_postgres:Master
order postgres_after_drbd inf: ms_drbd_postgres:promote postgres:start
property $id="cib-bootstrap-options" \
dc-version="1.0.9-89bd754939df5150de7cd76835f98fe90851b677" \
cluster-infrastructure="openais" \
expected-quorum-votes="2" \
stonith-enabled="false" \
no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
resource-stickiness="100"
[root@node1 ~]#
Настраиваем предпочтительный узел:
crm configure location master-prefer-node1 DBIP 50: node1.clusterbr.int
Проверяем статус:
crm_mon -1
[root@node2 ~]# crm_mon -1
============
Last updated: Fri Oct 29 19:54:09 2010
Stack: openais
Current DC: node2.clusterbr.int - partition with quorum
Version: 1.0.9-89bd754939df5150de7cd76835f98fe90851b677
2 Nodes configured, 2 expected votes
2 Resources configured.
============
Online: [ node2.clusterbr.int node1.clusterbr.int ]
Master/Slave Set: ms_drbd_postgres
Masters: [ node2.clusterbr.int ]
Slaves: [ node1.clusterbr.int ]
Resource Group: postgres
postgres_fs (ocf::heartbeat:Filesystem): Started node2.clusterbr.int
DBIP (ocf::heartbeat:IPaddr2): Started node2.clusterbr.int
postgresql (ocf::heartbeat:pgsql): Started node2.clusterbr.int
Если у Вас появятся ошибки вы должны перегрузить оба узла, что бы новые конфигурации corosync были приняты системой. Также после ребута системы, мы должны подключиться к DBIP (10.0.0.190) по TCP 5432 порту к сервису postgres.
Управление кластером
Перенос ресурса на другой узел:
crm resource migrate postgres node1.clusterbr.int
Удаление команды migrate:
crm resource unmigrate postgres
Чистим наши сообщения:
crm resource cleanup postgres
Остановка сервиса PostgreSQL
crm resource stop postgresql
Запуск сервиса PostgreSQL
crm resource start postgresql
8. Создаем веб интерфейс для статуса сервиса
Веб интерфейс будет удобен для мониторинга нашего кластера
Стартуем apache:
/etc/init.d/httpd start
chkconfig --level 35 httpd on
Создаем директорию для кластера (DocumentRoot):
mkdir /var/www/html/cluster/
Для генерации страниц делаем следующее:
crm_mon --daemonize --as-html /var/www/html/cluster/index.html
и сделаем положим это все дело в автозагрузку:
echo "crm_mon --daemonize --as-html /var/www/html/cluster/index.html" >> /etc/rc.d/rc.local
Проверяем доступность нашей морды в браузере:
10.0.0.190/cluster
9. Установка phppgAdmin для работы с postgresql
Выполняем действия на обоих узлах:
mkdir /download
cd /download
wget 'http://downloads.sourceforge.net/project/phppgadmin/phpPgAdmin%20%5Bbeta%5D/phpPgAdmin-5.0/phpPgAdmin-5.0-beta2.tar.bz2?r=http%3A%2F%2Fphppgadmin.sourceforge.net%2F%3Fpage%3Ddownload&ts=1288189530&use_mirror=ufpr'
Устанавливаем:
tar -jxvf phpPgAdmin-5.0-beta2.tar.bz2
mv phpPgAdmin-5.0-beta2 /var/www/html/cluster-pgadmin
chown apache.apache -R /var/www/html/cluster-pgadmin
Идем в браузере по адресу 10.0.0.190/cluster-pgadmin
П.С. Логин и пароль были введены при установке postgresql
10. Доступ по сети
Если Вам потребуется доступ к postgresql из локальной сети, не забудьте настроить проверку подлиности на Postgres
Здесь мы установим MD5 аутентификацию по сети к 10.0.0.0/24
echo "host all all 10.0.0.0/24 md5">> /var/lib/pgsql/data/pg_hba.conf
Перезапустим postgres:
crm resource stop postgresql
crm resource start postgresql
11. Мониторинг
Мониторинг кластера является обязательной частью всего процесса выполнения скриптов. Я предлагаю Вам проводить мониторинг с помощью Zabbix, для этого на каждом узле установите Zabbix agent и настраивайте мониторинг по этим пунтам:
1. Проверка пинга на доступность (10.0.0.191, 10.0.0.192 и 172.16.0.1, 172.16.0.2)
2. Проверка доступности DBIP (ip кластера) 10.0.0.190
3. Проверка порта TCP 5432 на DBIP 10.0.0.190
4. Проверка цпу, озу и диск
5. Вы можете использовать скрипт monitor_drbd.sh (Результат возвращает 1 когда все в порядке и 0 когда есть проблемы)
Скрипт monitor_drbd.sh для Zabbix:
#!/bin/bash
CHECK=`cat /proc/drbd | grep UpToDate/UpToDate | cut -d: -f5 | cut -c1-17`
STRING_OK="UpToDate/UpToDate"
# Comparando as duas.
if [ "$CHECK" == "$STRING_OK" ] ; then
# Is ok, returning 1
echo 1;
else
# Not ok, returning 0
echo 0;
fi
P.S. Если Вы увидели опечатки или же не соответствие в переводе, очень сильно Вас прошу написал в ЛС.
Я быстренько все поправлю во благо обществу.