Инструменты пользователя

Инструменты сайта


gnulinux:centos_drbd_heartbeat

DRBD & heartbeat

Построение отказоустойчивого кластера c использованием ПО DRBD и heartbeat.
Названия виртуальных машин: netsrv1 и netsrv2. Домен gccc.ru.
Данная схема успешно поработала около трёх лет и позже была заменена на более высокопроизводительное решение от RedHat™.
Известные проблемы:

  • 1. Низкая производительность1).

Описание настройки

1. Создаём 2 виртуальные машины (xen) на разных физических хостах.

  • Конфигурация для netsrv1 / netsrv2:
    • имя (name): netsrv1 / netsrv2
    • процессор: 1;
    • память (ram): 512;
    • носители (hdd): hda ⇒ 8 Gb и hdb ⇒ 3 Gb;
      • диск hdb (образ на физической машине) создаётся с помощью команды:
 
  dd if=/dev/zero of=/var/lib/xen/images/drbd_netsrv?.img oflag=direct bs=1M seek=3000 count=1 
  • рекомендуется подключать после первого запуска установленной системы Linux CentOS.
  • сеть (network): xenbr1;

2. Устанавливаем Linux CentOS 5:

  • имя компьютеров: netsrv1 и netsrv2 соотвественно;
  • IP адрес: 10.6.0.126/24 для netsrv1 и 10.6.0.125/24 для netsrv2;
  • DNS адреса: 10.6.0.114 и 10.6.0.115
  • после установки подключаем дополнительные репозитарии и выполняем yum update.

3. Устанавливаем heartbeat, drbd и kmod-drbd командной:

# yum install heartbeat drbd kmod-drbd
# yum install heartbeat

Добавляем drbd и heartbeat в автозагрузку:

# chkconfig drbd on
# chkconfig heartbeat on  

4. Правим конфигурационный файл drbd (drbd.conf) на всех нодах до следующего состояния (желательно текст после '#'):

# vi /etc/drbd.conf
resource r0 { # имя ресурса => r0
  protocol C; # протокол ''C''
  startup { wfc-timeout 30; degr-wfc-timeout 120; }
  disk  { on-io-error detach; }     # в случае ошибки отключаться
  net   { timeout 60;               # параметры сети
          connect-int 10;
          ping-int 10;
          max-buffers 2048;
          max-epoch-size 2048;
          after-sb-0pri discard-younger-primary;
          after-sb-1pri consensus;
  }
  syncer  { rate 500M; }            # скорость синхронизации: 500 мегабит в секунду
  on netsrv1.gccc.ru {              # описание первой ноды
    address 10.6.0.126:7790;        # IP адрес и порт подключения
    disk /dev/hdb;                  # устройство хранения (/dev/hdb - диск на 15Gb)
    device /dev/drbd0;              # устройство drbd
    meta-disk "internal";
  }
  on netsrv2.gccc.ru {              # описание второй ноды
    address 10.6.0.127:7790;        # IP адрес и порт подключения
    disk /dev/hdb;                  # устройство хранения (/dev/hdb - диск на 15Gb)
    device /dev/drbd0;              # устройство drbd
    meta-disk "internal";
  }
}


5. Настраиваем heartbeat (правим файлы authkeys, ha.cf и haresources): Конфигурация для netsrv1.gccc.ru (для первой ноды кластера)

# vi /etc/ha.d/authkeys
auth 1
1 sha1 PLASE_SET_SECRET_PHRASE
# vi /etc/ha.d/ha.cf
logfacility daemon
node netsrv1.gccc.ru
node netsrv2.gccc.ru
keepalive 1
deadtime 10
ucast eth0 10.6.0.127
ping 10.6.0.1
auto_failback yes
respawn hacluster /usr/lib/heartbeat/ipfail

# vi /etc/ha.d/haresources

netsrv1.gccc.ru drbddisk::r0 Filesystem::/dev/drbd0::/repdata::ext3::defaults,acl,usrquota,grpquota IPaddr::10.6.0.125/24/eth0 httpd

Если нужно чтобы работал механизм управления acl (через getfacl и setfacl), то нужно добавить ::defaults,acl\\
Конфигурация для netsrv2.gccc.ru (второй ноды кластера)

auth 1
1 sha1 PLASE_SET_SECRET_PHRASE
# vi /etc/ha.d/ha.cf
logfacility daemon
node netsrv1.gccc.ru
node netsrv2.gccc.ru
keepalive 1
deadtime 10
ucast eth0 10.6.0.126
ping 10.6.0.1
auto_failback yes
respawn hacluster /usr/lib/heartbeat/ipfail
# vi /etc/ha.d/haresources
netsrv1.gccc.ru drbddisk::r0 Filesystem::/dev/drbd0::/repdata::ext3 IPaddr::10.6.0.125/24/eth0 portmap nhttpd


Затем выполняем команды:
netsrv1.gccc.ru у нас будет являться главной нодой Создаем устройство r0

root@netsrv1 # drbdadm create-md r0

Создаём каталог /repdata в который будет монтироваться ресурс:

root@netsrv1 # mkdir /repdata
root@netsrv2 # mkdir /repdata  

Запускаем сервис drbd:

root@netsrv1 # /etc/init.d/drbd start
root@netsrv2 # /etc/init.d/drbd start

Проверяем состояние drbd:

root@netsrv1 # /etc/init.d/drbd status
root@netsrv2 # /etc/init.d/drbd status

Назначаем «главной» ноду netsrv1.gccc.ru:

root@netsrv1 # drbdadm -- --overwrite-data-of-peer primary r0
root@netsrv1 # watch -n 1 cat /proc/drbd 

Форматируем /dev/drbd0 в файловую систему ext3:

root@netsrv1 # mkfs.ext3 /dev/drbd0 

Монтируем /dev/drbd0 в /repdata:

root@netsrv1 # mount /dev/drbd0 /repdata/

Запускаем heartbeat:

root@netsrv1 # /etc/init.d/heartbeat start
root@netsrv2 # /etc/init.d/heartbeat start

Рекомендуется проверить состояние drbd:

root@netsrv1 # /usr/sbin/drbd-overview
Вывод на netsrv1.gccc.ru:
0:r0  Connected Primary/Secondary UpToDate/UpToDate C r--- /repdata ext3 2.9G 69M 2.7G 3% 
root@netsrv2 # /usr/sbin/drbd-overview
Вывод на netsrv2.gccc.ru:
0:r0  Connected Secondary/Primary UpToDate/UpToDate C r---

Теперь можно попробовать перезапустить netsrv1.gccc.ru: Запускаем ping на ноде netsrv2.gccc.ru - проверяем доступность:

root@netsrv2 # ping 10.6.0.125

Перезагружаем netsrv1:

root@netsrv1 # reboot

В процессе перезагрузки ping прерываться не должен (может быть незначительная задержка).
Вывод drbd-overview в процессе перезагрузки хоста netsrv1.
Хост [netsrv1] недоступен по ping:

root@netsrv2 # /usr/sbin/drbd-overview
0:r0  WFConnection Primary/Unknown UpToDate/DUnknown C r--- /repdata ext3 2.9G 69M 2.7G 3% 


Хост [netsrv1] доступен по ping, запущен heartbeat, но не запущен drbd:

root@netsrv2 # /usr/sbin/drbd-overview  
0:r0  Connected Secondary/Secondary UpToDate/UpToDate C r---


Хост [netsrv1] доступен по ping, запущен heartbeat, запущен drbd и выполнена полная синхронизация:

root@netsrv2 # /usr/sbin/drbd-overview  
0:r0  Connected Secondary/Primary UpToDate/UpToDate C r--- 
1) зато дёшево!
gnulinux/centos_drbd_heartbeat.txt · Последние изменения: 2014/05/27 16:21 — Alex