LINUX.ORG.RU
ФорумAdmin

настройка простейшего failover-а (Pacemaker + Corosync)


0

1

Всем привет.

Есть задача настроить failover.

Исходные данные: Есть некая программа, в случае падения которой надо переключать shared ip. Всё это должно быть настроено параллельно с drbd. CentOS 5.8

Что удалось сделать. 1. Настроил shared ip, drbd. 2. Создал ocf скрипт, чтобы он возвращал мне нужные значения ошибок, реагируя на которые конфигуация crm давала сигнал для переключения shared ip.

Что не удалось: настроить конфигурацию crm, чтобы переключался shared ip в случае падения программы. Под падением программы понимаю, например, исчезновение pid-a соотвествующего процесса.

Привожу конфигурационный скрипт, где «custom_primitive» - примитив для наблюдения (программа, за которой надо следить):

node srv01 \
	attributes standby="off"
node srv02 \
	attributes standby="off"
primitive custom_primitive ocf:heartbeat:custom_primitive_ocf_script \
	op monitor interval="5s"
primitive ClusterDRBD ocf:linbit:drbd \
	params drbd_resource="r0" \
	op monitor interval="5s"
primitive ClusterIP ocf:heartbeat:IPaddr2 \
	params ip="10.0.0.3" cidr_netmask="27" \
	op monitor interval="5s" \
	meta target-role="Started"
primitive fs_ClusterDRBD ocf:heartbeat:Filesystem \
	params device="/dev/drbd1" directory="/mnt/drbd0" fstype="ext3" \
	meta target-role="Started"
ms ms_custom_primitive custom_primitive \
	meta master-max="1" clone-max="2" notify="true" target-role="Started"
ms ms_ClusterDRBD ClusterDRBD \
	meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" target-role="Started" is-managed="true"
colocation FSwithDRBD inf: ClusterIP fs_ClusterDRBD ms_custom_primitive ms_ClusterDRBD:Master
order FSafterDRBD inf: ms_ClusterDRBD:promote fs_ClusterDRBD:start ms_custom_primitive:promote
property $id="cib-bootstrap-options" \
	dc-version="1.0.12-unknown" \
	cluster-infrastructure="openais" \
	expected-quorum-votes="2" \
	stonith-enabled="false" \
	no-quorum-policy="ignore" \
	default-resource-stickiness="1"

пробовал помещать ocf скрипт в ocf:pacemaker - ничего не получилось. Буду рад любым идеям, подсказкам, решениям. Спасибо.

P.S. Прочитал существующие на форуме темы - ответ на свой вопрос не смог найти.

drbd_resource=«r0» device=«/dev/drbd1»

Тут точно всё правильно?

Скрипт я так понял самописный? Он поддерживает все функции, требуемые менеджером кластера?

blind_oracle ★★★★★
()

Что не удалось: настроить конфигурацию crm, чтобы переключался shared ip в случае падения программы.

  1. Порог для миграции указал?
    crm_resource --meta --resource=my-resource --set-parameter migration-threshold --parameter-value 2
    crm_resource --meta --resource=my-resource --set-parameter failure-timeout --parameter-value 120s
  2. Ты в курсе что не все ошибки одинаково полезны? Ошибка во время stop блокирует ресурс до ручного вмешательства админа. Скрипт для останова должен быть абсолютно надёжным
  3. Ресурсы группировал?
    crm configure group my-resource-greoup my-resource1 my-resource2
router ★★★★★
()
Ответ на: комментарий от cm26inc

Что говорят crm_verify -L, crm_mon -1 ?

На вкус и цвет все фломастеры разные, но я бы посоветовал

crm_mon --inactive --failcount
router ★★★★★
()

правильнее использовать не colocation, а location c условием в духе такого:

-inf: not_defined custom_primitive or custom_primitive lte 0

а вместо master-slave использовать clone для custom-resource

в качестве хорошего примера можно посмотреть вот это

koshk0der
()
Ответ на: комментарий от cm26inc

1. Выполнение crm_verify -L никакого результата не показало ни на одной из двух нод.
2. Выполнение crm_mon -1:

============
Last updated: Mon May 13 15:09:20 2013
Stack: openais
Current DC: srv01 - partition with quorum
Version: 1.0.12-unknown
2 Nodes configured, 2 expected votes
4 Resources configured.
============

Online: [ srv01 srv02 ]

 ClusterIP	(ocf::heartbeat:IPaddr2):	Started srv01
ru_core
() автор топика
Ответ на: комментарий от blind_oracle

1. Да, в строке

drbd_resource=«r0» device=«/dev/drbd1»
точно всё правильно. Именно так называется ресурс и устройство.

2. Скрипт самописный. Взял шаблон Dummy, находящийся по адресу: /usr/lib/ocf/resource.d/heartbeat

Собственно сам скрипт:

# Setting the resource:
  RESOURCE="custom_primitive"

# Initialization:

: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs

#######################################################################

meta_data() {
        cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="custom_resource_failover" version="0.9">
<version>1.0</version>

<longdesc lang="en">
This is a custom_resource_failover Resource Agent. It does absolutely nothing except 
keep track of whether its running or not.
Its purpose in life is for testing and to serve as a template for RA writers.

<shortdesc lang="en">Example stateless resource agent</shortdesc>
<parameters>
<parameter name="state" unique="1">
<longdesc lang="en">
Location to store the resource state in.
</longdesc>
<shortdesc lang="en">State file</shortdesc>
<content type="string" default="${HA_RSCTMP}/custom_resource_failover-${OCF_RESOURCE_INSTANCE}.state" />
</parameter>

<parameter name="fake" unique="0">
<longdesc lang="en">
Fake attribute that can be changed to cause a reload
</longdesc>
<shortdesc lang="en">Fake attribute that can be changed to cause a reload</shortdesc>
<content type="string" default="custom_resource_failover" />
</parameter>

</parameters>

<actions>
<action name="start"        timeout="20" />
<action name="promote"      timeout="90" />
<action name="demote"       timeout="90" />
<action name="notify"       timeout="90" />
<action name="stop"         timeout="20" />
<action name="monitor" depth="0"  timeout="10" interval="10" />
<action name="reload"       timeout="20" />
<action name="migrate_to"   timeout="20" />
<action name="migrate_from" timeout="20" />
<action name="meta-data"    timeout="5" />
<action name="validate-all"   timeout="20" />
</actions>
</resource-agent>
END
}

#######################################################################

custom_resource_usage() {
        cat <<END
usage: $0 {start|stop|monitor|migrate_to|migrate_from|validate-all|meta-data}

Expects to have a fully populated OCF RA-compliant environment set.
END
}

custom_resource_start() {
    echo "custom_resource: in the start function" >> /tmp/custom.log

    custom_resource_monitor
    if [ $? =  $OCF_SUCCESS ]; then
        echo "custom_resource: in the start function when monitor is okay" >> /tmp/custom.log
        return $OCF_SUCCESS
    else
        echo "custom_resource: in the start function when monitor is failured" >> /tmp/custom.log
        return $?
    fi
}

custom_resource_stop() {
    echo "custom_resource: in the stop function" >> /tmp/custom.log

    return $OCF_SUCCESS
}

custom_resource_status() {
    #get response from custom software by sending query to it
    return $some_response
}

custom_resource_good_response='is okay'

custom_resource_monitor() {
	custom_resource_status
	real_custom_resource_answer = ?$
        if [[ "$real_custom_resource_answer" != "$custom_resource_good_response" ]]
        then
                echo "custom resource is not running and error code to return is $OCF_ERR_UNIMPLEMENTED" >> /tmp/custom.log
                return $OCF_ERR_UNIMPLEMENTED
        else
                echo "custom resource is running and error code to return is $OCF_SUCCESS"  >> /tmp/custom.log
                return $OCF_SUCCESS
        fi
}

custom_resource_validate() {
    echo "custom_resource: in the validate function" >> /tmp/custom.log

    return $OCF_SUCCESS
}

: ${OCF_RESKEY_state=${HA_RSCTMP}/custom_resource_failover-${OCF_RESOURCE_INSTANCE}.state}
: ${OCF_RESKEY_fake="custom_resource_failover"}

case $__OCF_ACTION in
meta-data)      meta_data
                exit $OCF_SUCCESS
                ;;
start)          custom_resource_start;;
stop)           custom_resource_stop;;
monitor)        custom_resource_monitor;;
migrate_to)     ocf_log info "Migrating ${OCF_RESOURCE_INSTANCE} to ${OCF_RESKEY_CRM_meta_migrate_target}."
                custom_resource_stop
                ;;
migrate_from)   ocf_log info "Migrating ${OCF_RESOURCE_INSTANCE} from ${OCF_RESKEY_CRM_meta_migrate_source}."
                custom_resource_start
                ;;
reload)         ocf_log info "Reloading ${OCF_RESOURCE_INSTANCE} ..."
                ;;
validate-all)   custom_resource_validate;;
usage|help)     custom_resource_usage
                exit $OCF_SUCCESS
                ;;
*)              custom_resource_usage
                exit $OCF_ERR_UNIMPLEMENTED
                ;;
esac
rc=$?
ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc"
exit $rc

ru_core
() автор топика
Ответ на: комментарий от router

Спасибо большое за совет про порог миграции. Сейчас указал и скрипт выглядит так:

node srv01 \
	attributes standby="off"
node srv02 \
	attributes standby="off"
primitive custom_script ocf:heartbeat:custom_script_failover \
	op monitor interval="5s" \
	meta migration-threshold="0" failure-timeout="5s" target-role="Started"
primitive ClusterDRBD ocf:linbit:drbd \
	params drbd_resource="r0" \
	op monitor interval="4s" \
	meta target-role="Stopped"
primitive ClusterIP ocf:heartbeat:IPaddr2 \
	params ip="192.168.100.57" cidr_netmask="27" \
	op monitor interval="5s" \
	meta target-role="Started"
primitive fs_ClusterDRBD ocf:heartbeat:Filesystem \
	params device="/dev/drbd1" directory="/mnt/drbd0" fstype="ext3" \
	meta target-role="Started"
ms ms_ClusterDRBD ClusterDRBD \
	meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" target-role="Started" is-managed="true"
property $id="cib-bootstrap-options" \
	dc-version="1.0.12-unknown" \
	cluster-infrastructure="openais" \
	expected-quorum-votes="2" \
	stonith-enabled="false" \
	no-quorum-policy="ignore" \
	default-resource-stickiness="1"

2. Про возвращаемые ошибки: логика работы такова: наблюдаемая программа запущена на двух нодах, в случае исчезновения pid-a на активной ноде надо тут же переключить shared ip. Поэтому ocf скрипт был максимально упрощён и в его monitor функции возвращается $OCF_ERR_UNIMPLEMENTED ошибка.

3. Ресурсы ранее не группировал. Сейчас сгруппировал, но посыпались ошибки, эксперементирую.

Спасибо за советы. Позже отпишусь.

ru_core
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.