martedì 19 luglio 2011

Continue riallocazioni delle VM

Risolti i problemi di cui al post precedente, adesso il cluster con RedHat Cluster Suite e libvirt funziona alla grande.
Così alla grande che ogni due minuti le VM vengono riallocate, quelle che erano sull'host1 finiscono nell'host2 e viceversa. E mi raccomando, non migrate, riallocate.

Nei log questo simpatico errorino:

Jul 19 17:25:21 rgmanager status on vm "prometeo" returned 127 (unspecified)
Jul 19 17:25:21 rgmanager No other nodes have seen vm:prometeo

Criptico come poche volte, no? Come si risolve un problema del genere?

Provo a testare con rg_test:

# rg_test test /etc/cluster/cluster.conf status vm prometeo
...
Hypervisor URI: qemu:///system
Migration URI format: qemu+ssh://target_host/system
Virtual machine prometeo is running
Status check of prometeo failed

Coerente, direi. Quindi c'è un errore nel check dello status. Lo script inciminato è /usr/share/cluster/vm.sh, che usa due funzioni per verificare lo status, virsh_status e do_status (ci sarebbe anche xm_status, ma in questo momento non ci interessa):

virsh_status()
{
        declare state pid

        if [ "$OCF_RESKEY_hypervisor" = "xen" ]; then
                service xend status &> /dev/null
                if [ $? -ne 0 ]; then 
                        echo indeterminate
                        return $OCF_APP_ERR_INDETERMINATE
                fi
        fi

        #
        # libvirtd is required when using virsh even though
        # not specifically when also using Xen.  This is because
        # libvirtd is required for migration.
        #
        pid=$(pidof libvirtd)
        if [ -z "$pid" ]; then 
                echo indeterminate
                return $OCF_APP_ERR_INDETERMINATE
        fi

        state=$(virsh domstate $OCF_RESKEY_name)

        echo $state

        if [ "$state" = "running" ] || [ "$state" = "paused" ] ||
           [ "$state" = "no state" ] || 
           [ "$state" = "idle" ]; then
                return 0
        fi

        if [ "$state" = "shut off" ]; then
                return $OCF_NOT_RUNNING
        fi

        return $OCF_ERR_GENERIC
}


#
# Simple status check: Find the VM in the list of running
# VMs
#
do_status()
{
        if [ "$OCF_RESKEY_use_virsh" = "1" ]; then
                virsh_status
                return $?
        fi

        xm_status
        return $?
}

Guardatele quanto volete, l'errore non è in nessuna delle due funzioni: se la VM è viva, virsh_status ritorna 0 e do_status pure (era dura visto che non fa altro che richiamare virsh_status).

Dov'è il problema? Si verifica più avanti, per la precisione nel case che decide quale azione è stata richiamata:

status|monitor)
                validate_all || exit $OCF_ERR_ARGS
                echo -n "Virtual machine $OCF_RESKEY_name is "
                do_status
                rv=$?
                if [ $rv -ne 0 ]; then
                        exit $rv
                fi
                [ -z "$OCF_RESKEY_status_program" ] && exit 0
                [ -z "$OCF_CHECK_LEVEL" ] && exit 0
                [ $OCF_CHECK_LEVEL -lt 10 ] && exit 0

                bash -c "$OCF_RESKEY_status_program" &> /dev/null
                exit $?
                ;;


Qual è il problema? Il valore di status_program (uno dei parametri di configurazione della risorsa vm) di default è 0. Non vuoto (cosa che gli farebbe passare indenne il test in rosso e quindi farebbe uscire vm.sh), ma 0.

<parameter name="status_program" reconfig="1">
    <longdesc lang="en">
        Ordinarily, only the presence/health of a virtual machine
        is checked.  If specified, the status_program value is
        executed during a depth 10 check.  The intent of this 
        program is to ascertain the status of critical services
        within a virtual machine.
    </longdesc>
    <shortdesc lang="en">
        Additional status check program
    </shortdesc>
    <content type="string" default="0"/>
</parameter> 

A questo punto, salutati i santi che uno ha tirato giù dal Paradiso, la soluzione è aggiungere l'ennesimo parametro alla configurazione della VM in /etc/cluster/cluster.conf:

<vm autostart="0" domain="domainseminole" exclusive="0" migrate="live" 
    status_program="" name="prometeo" 
    xmlfile="/etc/libvirt/qemu/prometeo.xml" recovery="relocate"/>

1 commento:

  1. Bello questo post, molto interessante, comunque ho visto che questo errore stato corretto in REDHAT 6 :-)

    RispondiElimina