Устанавливаем Heartbeat штатным для ALT Linux способом:
[root@m1 heartbeat]# apt-get install heartbeat
Установка Heartbeat для других дистрибутивов Linux описана на сайте проекта (http://www.linux-ha.org/DownloadSoftware). На главной странице проекта также сказано, что кроме Linux Heartbeat собирается и запускается на FreeBSD, Solaris и даже MacOS X.
После установки Heartbeat на оба узла кластера на каждом узле необходимо создать файл /etc/ha.d/authkeys с правами доступа 600 и случайной строкой (ее можно придумать самому, а лучше сгенерировать с помощью apg), которая будет использоваться узлами для авторизации друг друга:
auth 1 1 sha1 RcBkJzU8ClnrjWVRLv5EDsdRFQP1j1C
Также необходимо создать конфигурационный файл Heartbeat, который на узле m1 будет выглядеть так:
Logfacility local0 ucast eth2 192.168.200.2 auto_failback on node m1.mydomain.com m2.mydomain.com
а на m2 "-- так:
Logfacility local0 ucast eth2 192.168.200.1 auto_failback on node m1.mydomain.com m2.mydomain.com
Затем необходимо описать ресурсы кластера в файле /etc/ha.d/haresources на каждом узле:
m1.mydomain.com drbddisk Filesystem::/dev/drbd0::/d0::ext3
Такая запись означает, что кластер в штатном режиме будет использовать ресурсы drbddisk и Filesystem узла m1, а в случае его смерти "-- аналогичные ресурсы узла, оставшегося в живых, то есть m2. Для ресурса Filesystem заданы параметры: имя drbd-устройства, каталог, в который оно должно быть смонтировано (этот каталог мы должны создать самостоятельно на каждом узле кластера), и тип файловой системы. Узнать больше о ресурсах, поддерживаемых heartbeat, можно заглянув в каталог /etc/ha.d/resource.d "-- каждый ресурс представлен там соответствующим скриптом.
Теперь можно запустить сервис heartbeat (не забыв перед этим размонтировать устройство /dev/drbd0, если оно было смонтировано):
[root@m1 ~]# service heartbeat start logd is already running Starting High-Availability services: [ DONE ]
После старта сервиса на ведущем узле кластера в логах можно увидеть такие сообщения:
m1 heartbeat: [3372]: info: Status update for node m2.mydomain.com: status active m1 harc[3395]: info: Running /etc/ha.d/rc.d/status status m1 heartbeat: [3406]: info: Local Resource acquisition completed. m1 harc[3431]: info: Running /etc/ha.d/rc.d/ip-request-resp ip-request-resp m1 ip-request-resp[3431]: received ip-request-resp drbddisk OK yes m1 ResourceManager[3446]: info: Acquiring resource group: m1.mydomain.com drbddisk Filesystem::/dev/drbd0::/d0::ext3 m1 ResourceManager[3446]: info: Running /etc/ha.d/resource.d/drbddisk start m1 Filesystem[3569]: INFO: Running status for /dev/drbd0 on /d0 m1 Filesystem[3569]: INFO: /d0 is unmounted (stopped) m1 Filesystem[3505]: INFO: Filesystem Resource is stopped m1 ResourceManager[3446]: info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /d0 ext3 start m1 Filesystem[3678]: INFO: Running start for /dev/drbd0 on /d0 m1 kernel: kjournald starting. Commit interval 5 seconds m1 kernel: EXT3 FS on drbd0, internal journal m1 kernel: EXT3-fs: mounted filesystem with ordered data mode. m1 Filesystem[3614]: INFO: Filesystem Success
В логах ведомого узла можно будет увидеть следующее:
m2 heartbeat: [3739]: info: Status update for node m1.mydomain.com: status up m2 harc[3752]: info: Running /etc/ha.d/rc.d/status status m2 heartbeat: [3739]: info: remote resource transition completed. m2 heartbeat: [3773]: info: No local resources [/usr/lib/heartbeat/ResourceManager listkeys m2.mydomain.com] to acquire.
После старта heartbeat на обоих узлах кластера устройство /dev/drbd0 будет смонтировано на ведущем узле. Если остановить сервис heartbeat на ведущем узле m1, ведомый m2 возьмет на себя функции ведущего, и устройство /dev/drbd0 будет смонтировано на нем, при этом в логах мы увидим:
m2 kernel: drbd0: Secondary/Primary --> Secondary/Secondary m2 heartbeat: [3739]: info: Received shutdown notice from 'm1.mydomain.com'. m2 heartbeat: [3739]: info: Resources being acquired from m1.mydomain.com. m2 heartbeat: [3850]: info: acquire local HA resources (standby). m2 heartbeat: [3851]: info: No local resources [/usr/lib/heartbeat/ResourceManager listkeys m2.mydomain.com] to acquire. m2 heartbeat: [3850]: info: local HA resource acquisition completed (standby). m2 heartbeat: [3739]: info: Standby resource acquisition done [all]. m2 harc[3870]: info: Running /etc/ha.d/rc.d/status status m2 mach_down[3880]: info: Taking over resource group drbddisk m2 ResourceManager[3900]: info: Acquiring resource group: m1.mydomain.com drbddisk Filesystem::/dev/drbd0::/d0::ext3 m2 ResourceManager[3900]: info: Running /etc/ha.d/resource.d/drbddisk start m2 kernel: drbd0: Secondary/Secondary --> Primary/Secondary m2 Filesystem[4023]: INFO: Running status for /dev/drbd0 on /d0 m2 Filesystem[4023]: INFO: /d0 is unmounted (stopped) m2 Filesystem[3959]: INFO: Filesystem Resource is stopped m2 ResourceManager[3900]: info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /d0 ext3 start m2 Filesystem[4132]: INFO: Running start for /dev/drbd0 on /d0 m2 kernel: kjournald starting. Commit interval 5 seconds m2 kernel: EXT3 FS on drbd0, internal journal m2 kernel: EXT3-fs: mounted filesystem with ordered data mode. m2 Filesystem[4068]: INFO: Filesystem Success m2 mach_down[3880]: info: /usr/lib/heartbeat/mach_down: nice_failback: foreign resources acquired m2 mach_down[3880]: info: mach_down takeover complete for node m1.mydomain.com. m2 heartbeat: [3739]: info: mach_down takeover complete.
Если просто выключить питание узла m1, чтобы он не успел оповестить m2 о том, что он завершает свою работу, m2 обнаружит отсутствие m1 и точно так же возьмет на себя функции ведущего узла и примонтирует раздел /dev/drbd0:
m2 kernel: drbd0: PingAck did not arrive in time. m2 kernel: drbd0: drbd0_asender [3566]: cstate Connected --> NetworkFailure m2 kernel: drbd0: asender terminated m2 kernel: drbd0: drbd0_receiver [3510]: cstate NetworkFailure --> BrokenPipe m2 kernel: drbd0: short read expecting header on sock: r=-512 m2 kernel: drbd0: worker terminated m2 kernel: drbd0: drbd0_receiver [3510]: cstate BrokenPipe --> Unconnected m2 kernel: drbd0: Connection lost. m2 kernel: drbd0: drbd0_receiver [3510]: cstate Unconnected --> WFConnection m2 heartbeat: [3739]: WARN: node m1.mydomain.com: is dead m2 heartbeat: [3739]: WARN: No STONITH device configured. m2 heartbeat: [3739]: WARN: Shared disks are not protected. m2 heartbeat: [3739]: info: Resources being acquired from m1.mydomain.com. m2 heartbeat: [3739]: info: Link m1.mydomain.com:eth2 dead. m2 harc[4383]: info: Running /etc/ha.d/rc.d/status status m2 heartbeat: [4384]: info: No local resources [/usr/lib/heartbeat/ResourceManager listkeys m2.mydomain.com] to acquire. m2 mach_down[4403]: info: Taking over resource group drbddisk m2 ResourceManager[4423]: info: Acquiring resource group: m1.mydomain.com drbddisk Filesystem::/dev/drbd0::/d0::ext3 m2 ResourceManager[4423]: info: Running /etc/ha.d/resource.d/drbddisk start m2 kernel: drbd0: Secondary/Unknown --> Primary/Unknown m2 Filesystem[4546]: INFO: Running status for /dev/drbd0 on /d0 m2 Filesystem[4546]: INFO: /d0 is unmounted (stopped) m2 Filesystem[4482]: INFO: Filesystem Resource is stopped m2 ResourceManager[4423]: info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /d0 ext3 start m2 Filesystem[4655]: INFO: Running start for /dev/drbd0 on /d0 m2 kernel: kjournald starting. Commit interval 5 seconds m2 kernel: EXT3 FS on drbd0, internal journal m2 kernel: EXT3-fs: recovery complete. m2 kernel: EXT3-fs: mounted filesystem with ordered data mode. m2 Filesystem[4591]: INFO: Filesystem Success m2 mach_down[4403]: info: /usr/lib/heartbeat/mach_down: nice_failback: foreign resources acquired m2 mach_down[4403]: info: mach_down takeover complete for node m1.mydomain.com. m2 heartbeat: [3739]: info: mach_down takeover complete.
При повторном запуске сервиса heartbeat на m1 или при включении узла m1 он снова станет ведущим.
Итак, мы построили отказоустойчивый кластер с общим дисковым пространством, состоящий из двух узлов: m1 и m2. Теперь нам необходимо построить систему виртуализации с виртуальными серверами, мигрирующими с узла m1 на m2 в случае отказа первого.