Pull to refresh

Настройка Active/Passive PostgreSQL Cluster с использованием Pacemaker, Corosync, и DRBD (CentOS 5,5)

Reading time 16 min
Views 28K
Original author: Рафаэль Марангони
В этой статье объясняется, как настроить Active/Passive кластера PostgreSQL, с использованием Pacemaker, Corosync и DRBD.
Подготовлено Рафаэль Марангони, из команды 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. Если Вы увидели опечатки или же не соответствие в переводе, очень сильно Вас прошу написал в ЛС.
Я быстренько все поправлю во благо обществу.
Tags:
Hubs:
+22
Comments 12
Comments Comments 12

Articles