Создание высокопроизводительного отказоустойчивого кластера

Total votes: 47

Итак, первое что нужно будет сделать - это организовать связь между серверами по кросс-кабелю.

Предположим, что дополнительные сетевые карты видны в системе как eth0. Поднимем локальную сеть:

Первый сервер:
ifconfig eth0 192.168.1.1 up
Второй сервер:
ifconfig eth0 192.168.1.2 up

Проверяем - сервера должны пинговать друг-друга по этим IP. Если все в порядке, то нужно организовать автостарт этих IP, отредактировав файл /etc/network/interfaces:

 

Первый сервер:
auto eth0
iface eth0 inet static
    address 192.168.1.1
    netmask 255.255.255.0
Второй сервер:
auto eth0
iface eth0 inet static
    address 192.168.1.1
    netmask 255.255.255.0

Однако обращаться к серверам по IP неудобно. Назовем их node1 и node2, отредактировав файл /etc/hosts на каждом сервере:

192.168.1.1 node1
192.168.1.2 node2

Следующим шагом будет создание общего диска, на котором будут лежать файлы для работы сайта. Для этих целей разумно будет создать LVM, от которого мы отцепим кусок и сделаем его сетевым. Приемущества этого подхода дают возможность увеличивать диск по мере его использования в онлайне (впрочем для этого файловая система должна поддерживать такую возможность) и автоматическое создание копии всей файловой системы перед ее синхронизацией (резервное копирование).

В случае автоматической установки на серверах Hetzner большая часть дискового пространства отошла в программный raid /dev/md3, который подмонтирован в /home. Переделаем из него LVM, предварительно удалив строку монтирования из /etc/fstab:

На node1 и node2:
umount /dev/md3
apt-get install lvm2 psmisc
pvcreate /dev/md3
vgcreate datavg /dev/md3

Теперь создадим там два куска по 5G для Apache и MySQL:

На node1 и node2:
lvcreate -L 5G -n apache datavg
lvcreate -L 5G -n mysql datavg

Для паралельной работы mysql мы будем использовать настоящий MySQL-кластер, настройки которого выходят за рамки этой статьи. Достаточно упомянуть только то, что эта кластеризация создается с помощью хранилища NDB и не требует общего диска. Так что LVM раздел mysql будет подключен на каждом из серверов отдельно.

А вот с Apache ситуация иная. Там потребуется общий диск и кластерная файловая система. Кроме того нужно будет следить за тем, чтобы при выходе любого из компонент кластера (общем диске, кластерной файловой системе или apache) на каком-то из серверов, отключить там все и перевести его в "аварийное" состояние, мигрировав IP аварийного сервера на оставшийся рабочий.

Сначала установим и настроим drbd. На обоих серверах выполняем команду:

apt-get install drbd-utils

Создаем общий сетевой диск с пропускной способностью 30% (подробности по ссылке http://www.drbd.org/users-guide-8.3/s-configure-syncer-rate.html) и автоматическим бекапом, создав на node1 и node2 файл /etc/drbd.d/r1.res с содержимым:

Взять отсюда: http://rascal.su/blog/2011/02/06/debian-squeeze-drbd-ocfs2/

С учетом http://www.drbd.org/users-guide/s-enable-dual-primary.html

 

Для ускореняи первоначальной синхронизации можно временно отдать всю пропускную способность при помощи команды

drbdsetup /dev/drbd1 syncer -r 80M

Наблюдать процесс синхронизации в реальном режиме времени можно при помощи команды

watch  cat /proc/drbd

Отключаем автозапуск drbd и apache на node1 и node2. Теперь этим будет управлять кластер.

update-rc.d -f drbd remove
update-rc.d -f apache2 remove

Настраиваем http://publications.jbfavre.org/virtualisation/cluster-xen-corosync-pacemaker-drbd-ocfs2.en

Рабочий конфиг:

 

node node1
node node2
primitive apache_app ocf:heartbeat:apache \
params configfile="/etc/apache2/apache2.conf" httpd="/usr/sbin/apache2" port="80" statusurl="http://127.0.0.1:80/server-status" testregex="Apache" \
op monitor interval="30s"
primitive apache_fs ocf:heartbeat:Filesystem \
params device="/dev/drbd1" directory="/var/www" fstype="ocfs2"
primitive drbd1 ocf:linbit:drbd \
params drbd_resource="r1" \
operations $id="drbd1-ops" \
op monitor interval="20" role="Master" timeout="20" \
op monitor interval="30" role="Slave" timeout="20"
ms drbd1_ms drbd1 \
meta resource-stickines="100" master-max="2" notify="true" interleave="true" target-role="Started"
clone apache_fs_clone apache_fs \
meta interleave="true" ordered="true" target-role="Started"
clone www apache_app \
meta interleave="true" ordered="true" target-role="Started"
order ocfs_after_drbd1 inf: drbd1_ms:promote apache_fs_clone:start
order www_after_ocfs inf: apache_fs_clone:start www:start
property $id="cib-bootstrap-options" \
dc-version="1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b" \
cluster-infrastructure="openais" \
expected-quorum-votes="2" \
stonith-enabled="false" \
no-quorum-policy="ignore" \
last-lrm-refresh="1326795041"
rsc_defaults $id="rsc-options" \
resource-stickiness="100"
 
 

Категория:

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