Автоматическое отслеживание узлов: Heartbeat

Устанавливаем 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 в случае отказа первого.



Eugene 2012-05-28