LINUX.ORG.RU
ФорумAdmin

Логика кластера Виртуальных машин


0

1

Здравствуйте пишу скрипт для heartbeata вот здесь (bash такое может? (комментарий)) мне помогли очень. Для каждой машины свой DRBD диск используется в состоянии primary/secondary. Вопрос теперь в другом, в логике работы функций start и stop доменов
Изучая подобные скрипты заметил что старт домена производится командой

virsh create /patchtoconfig
а не
virsh start домен
Логично предположить что при stop нужно было бы использовать команду
virsh destroy домен #но сначало было бы не плохо попытаться остановить машину shutdown
virsh undefined домен
анализирую два скрипта тот который ниже (простите полный листинг) и xen-drbd на питоне (его не привожу)
t -e
SELF=10.1.1.1
PEER=10.1.1.2
if [ $(hostname) = xen2 ]; then
    SELF=10.1.1.2
    PEER=10.1.1.1
fi
SSH_OPTS="-o ConnectTimeout=15"
configfile=$1
command=$2
function usage {
    echo "Usage: $0 CFG start|stop|status"
    exit 1
}
if [ ! -r "$configfile" ]; then
    usage
fi
. $configfile
function is_alive {
    #xm list | grep -q "^$1 "
    xm list $1 >/dev/null 2>&1
}
function safe_to_migrate {
    case "$(drbdadm cstate $DRBD)" in
    Connected|SyncSource|SyncTarget)
        return 0
        ;;
    *)
        return 1
        echo "$DRBD is disconnected, NOT safe to migrate"
        ;;
    esac
}
function prepare_migration {
    echo "Preparing for migration:"
    ssh $SSH_OPTS $PEER "drbdadm primary $DRBD && vgscan && vgchange -a y $LVM";
    if [ "$EXTRA_DRBD" ]; then
        ssh $SSH_OPTS $PEER "drbdadm primary $EXTRA_DRBD"
    fi
}
function dom_names {
    ls $CFGDIR | egrep '^[0-9a-z]+$'
}
function start_disk {
    echo "Starting volumes:"
    drbdadm primary $DRBD
    vgscan
    vgchange -a y $LVM
    if [ "$EXTRA_DRBD" ]; then
        drbdadm primary $EXTRA_DRBD
    fi
}
function stop_disk {
    echo "Stopping volumes:"
    vgchange -a n $LVM || true
    drbdadm secondary $DRBD || true
    if [ "$EXTRA_DRBD" ]; then
        drbdadm secondary $EXTRA_DRBD || true
    fi
}
function update_mac_cache {
    arp -d $name >/dev/null 2>&1 || true
    ping -c1 -w1 $name >/dev/null 2>&1 || true
}
function start_domains {
    start_disk
    local name
    for name in $(dom_names); do
        echo -n "Starting $name: "
        if is_alive $name; then
            echo "already running."
        else
            if safe_to_migrate &&
                    ssh $SSH_OPTS $PEER "xm migrate --live $name $SELF"; then
                update_mac_cache
                echo "migrated back."
            else
                xm create -q $CFGDIR/$name
                echo "created."
                sleep 2
            fi
        fi
    done
    if safe_to_migrate; then
        ssh $SSH_OPTS $PEER "vgchange -a n $LVM; drbdadm secondary $DRBD" || true
        if [ "$EXTRA_DRBD" ]; then
            ssh $SSH_OPTS $PEER "drbdadm secondary $EXTRA_DRBD" || true
        fi
    fi
    touch $LOCKFILE
}
function stop_domains {
    rm -f $LOCKFILE
    local migration
    if safe_to_migrate && prepare_migration; then
        migration="OK"
    else
        migration="NG"
    fi
    local name
    for name in $(dom_names); do
        echo -n "Stopping $name: "
        if ! is_alive $name; then
            echo "not running."
        else
            if [ $migration = "OK" ] && xm migrate --live $name $PEER; then
                update_mac_cache
                echo "migrated."
            else
                xm shutdown $name
                echo "shutting down..."
            fi
        fi
    done
    echo -n "Waiting for shutdown complete..."
    local n=0
    while [ $n -lt 60 ]; do
        alive=0
        for name in $(dom_names); do
            if is_alive $name; then
                alive=1
            fi
        done
        if [ $alive = 0 ]; then
            echo "ok"
            break
        fi
        echo -n "."
        sleep 1
        n=$(expr $n + 1)
    done
    for name in $(dom_names); do
        if is_alive $name; then
            echo "Destroying $name"
            xm destroy $name
        fi
    done
    stop_disk
}
function print_status {
    if [ -f $LOCKFILE ]; then
        echo "OK"
    else
        echo "Stopped"
        exit 1
    fi
}
case $command in
start)
    start_domains
    ;;
stop)
    stop_domains
    ;;
status)
    print_status
    ;;
*)
    usage
    ;;
esac
я не заметил что бы при вызове stop домен удалялся ни в одном из скриптов взятых за образцы.

Так как лучше организовать:
sart/destroy
или
create/undefined

★★★★★

Идея проста как швабра: virsh create делает define (определить конфиг домена) и start (запустить домен). shutdown/destroy выключают домен (причем shutdown является аналогом нажатия на кнопку выключения, а destroy - аналогом выдергивания шнура питания). undefine удаляет из памяти virsh конфигурацию домена. В твоем случае это совершенно не нужно, т.к. определение домена поверх существующего работает совершенно нормально. При запуске домена лучше использовать create (на случай, если конфиг домена еще не был прочитан).

Таким образом, в твоем случае при старте - create, при остановке shutdown (если после shutdown долго не останавливается, можно автоматически делать destroy).

anonymous
()

Правда, непонятно, при чем тут virsh, в выложенном скрипте все через xm делается, а там логика немного другая (операция start намертво зашита в create, и конфиг удаляется из памяти при остановке домена).

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

>Правда, непонятно, при чем тут virsh, в выложенном скрипте все через xm делается, а там логика немного другая (операция start намертво зашита в create, и конфиг удаляется из памяти при остановке домена).

Просто не смог найти примера для KVM только ZEN.

petav ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Экспериментировал с create если такой домен уже существовал, он просто ругается на то что домен существует и все. Но домен существовать может в двух состояниях «работает/выключен» Так вот если поверх существующего домена сделать еще раз create то состояние не меняется. Т.е надо отслеживать что домен существует и запускать его если нет то создавать, либо после остановки stop удалять домен. Что логичнее? Мне кажется что удалять. А ваше мнение?

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

>Экспериментировал с create если такой домен уже существовал, он просто ругается на то что домен существует и все.

Если он в момент create уже работает, это вполне логично.

Так вот если поверх существующего домена сделать еще раз create то состояние не меняется.

Хм. Мне помнилось, что не запущенный домен должен запуститься. Возможно, мне помнится фигня.

Т.е надо отслеживать что домен существует и запускать его если нет то создавать, либо после остановки stop удалять домен. Что логичнее? Мне кажется что удалять. А ваше мнение?

По-моему, можно и так и так.

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

>Если он в момент create уже работает, это вполне логично.

Он в любой момент ругается

Хм. Мне помнилось, что не запущенный домен должен запуститься. Возможно, мне помнится фигня.

Перепроверил не запускается :)

А еще вопросик. Вот работает первый узел и втрой узел. Вылетает первый узел, все виртуалки запускаются на втором heartbet`ом. Но поднимаем первый узел. Heartbeat видит это и останавливает виртуалки на втором узле что бы запустить их на первом. НО drbd диски еще синкаются поэтому диск не перевести в Primary,а виртуалки не запустятся. Как это состояния отрабатывать. А то получим что на втором узле все остановилось, а на первом узле еще не может запуститься. Это самому нужно отрабатывать или heartbeat за этим следит.

petav ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Углубился в тесты и что получилось:

если домен создается командой create то после destroy он исчезает, а если командой define то остается выключенным. Но create не запускает домен если он уже был. Но если не использовать define то и доменов выключенных не будет. Каждый раз на время работы создавать новый!

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