Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных


Данное руководство касается версии keepalived 1.3.6

Ввиду того, что на версии 1.2.15 не стабильно работают некоторые критически важные функции, рекомендуется использовать только версию 1.3.6

Описание пакета

Пакет keepalived это open source программное обеспечение, предназначенное для обеспечения функций высокой надежности (high availabilitty) и балансировки нагрузки (load-balancing). За первую функцию отвечает реализация протокола VRRP, а вторая основывается на модуле ядра Linux Vitrual Server (IPVS). Keepalived не разрабатывается сотрудниками Eltex и не включает доработок, за исключением конфигурации, выполняется сборка из исходных кодов из официального репозитория на GitHub (https://github.com/acassen/keepalived) необходимой версии под используемую операционную систему.

Keepalived используется для организации резервирования контроллеров SoftWLC, при этом используется только функционал VRRP.

Пакет keepalived для Ubuntu 14.04 можно запросить в Сервисном центре Wi-Fi и БШПД.

Установка

Для установки пакета необходимо загрузить его на сервер и выполнить следующую команду:

root@master:/# dpkg -i keepalived_1.3.6-eltexu14_amd64.deb

Установка должна производиться от имени суперпользователя root


Способ запуска/остановки

Для запуска сервиса воспользуйтесь командой:

service keepalived start

Ответ об успешном запуске будет такой:

keepalived start/running, process 2471

Остановка сервиса:

root@master:/# service keepalived stop

Ответ системы:

keepalived stop/waiting

Проверить состояние сервиса можно командой:

root@master:/# service keepalived status

Ответ:

keepalived start/running, process 2809

Конфигурация

Конфигурация keepalived состоит из следующих файлов

ФайлОписание
/etc/keepalived/keepalived.conf

главный файл конфигурации сервиса

/etc/keepalived/check_ping.shскрипт проверки состояния службы EMS
/etc/keepalived/keep_notify.shскрипт, который выполняется при смене состояния (при переходе в MASTER, BACKUP, FAULT)
/etc/sysconfig/keepalivedфайл конфигурации параметров запуска процесса keepalived
/etc/keepalived/mongo_switch.jsскрипт перевода члена replicaSet MongoDB в состояние, соответствующее состоянию VRRP

Основной файл конфигурации

Листинг основного файла конфигурации по умолчанию

/etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
    notification_email {
       admin@example.org
    }
    notification_email_from softwlc@example.org
    smtp_server mail.example.org
    smtp_connect_timeout 30
    router_id swlc1
    enable_traps
}

vrrp_script check_network {
    script "/etc/keepalived/check_ping.sh"
    interval 5
    weight 50
    fall 3
    rise 3
    init_fail
    user root
}

vrrp_instance VI_SWLC {
    state BACKUP
    interface eth0
    virtual_router_id 1
    track_script {
        check_network
    }
    track_interface {
        eth0 weight 50
    }
    priority 150
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass eltex
    }
    virtual_ipaddress {
        <virtual_ip> dev eth0 label eth0:1
    }
 
    notify_master "/etc/keepalived/keep_notify.sh master"
    notify_backup "/etc/keepalived/keep_notify.sh backup"
    notify_fault "/etc/keepalived/keep_notify.sh fault"
 
    unicast_peer {
        <ip_server1>
    }
}

Конфигурационный файл состоит из трех основных секций: global_defs, vrrp_script, vrrp_instance. Первая определяет глобальные параметры, вторая содержит конфигурацию скрипта проверки состояния, а третья описывает сам VRRP инстанс.


Тест-скрипт

В текущей реализации в качестве тестового скрипта предлагается использовать следующий:

/etc/keepalived/check_ping.sh
#!/bin/bash

# host to ping
# there - default gw
HOST=<default_gw_ip>
# -q quiet
# -c nb of pings to perform
ping -q -c5 $HOST > /dev/null

# $? var keeping result of execution
# previous command
if [ $? -eq 0 ]
    then
        echo `date +"%T %F"` "OK gw reachable"
        EXIT_CODE=0
    else
        echo `date +"%T %F"` "ERROR gw unreacheble!"
        EXIT_CODE=1
fi

exit $EXIT_CODE

скрипт пингует шлюз по умолчанию и возвращает код результата. Таким образом, при успешном выполнении скрипта гарантируется, что SoftWLC достижим для внешних клиентов.

Конфигурация смены роли

При смене состояния сервера выполняется скрипт keep_notify.sh

/etc/keepalived/keep_notify.sh
#!/bin/bash

MYSQL_USER="<mysql_user>"
MYSQL_PASSWORD="<mysql_password>"

mongo_set_role() {
    local role="$1"
    if [[ "$(which mongo)" ]]; then
        mongo --quiet --eval "var role=\"$role\"" admin /etc/keepalived/mongo_switch.js
        # Uncomment if using mongodb auth
        #mongo -u<username> -p<password> --quiet --eval "var role=\"$role\"" admin /etc/keepalived/mongo_switch.js
    fi
}

if ! lockfile-create --use-pid -r 5 /tmp/keep.mode.lock; then
    echo "Unable to lock"
    echo "Unable to lock" > /tmp/keep.mode.lock.fail
    exit 0
fi

case "$1" in
    master)
    #  ems_reload_all
    echo "MASTER" > /tmp/keep.mode
  
    mongo_set_role master
    service eltex-ems restart
    service tomcat7 restart
    service eltex-ngw restart

    # рестарт слейва MySQL чтобы при восстановлении связи - сразу получить изменения,
    # а не ждать периодического heartbeat от второго сервера
    mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "stop slave"
    mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "start slave"
  ;;
 backup)
    echo "BACKUP" > /tmp/keep.mode
    mongo_set_role slave
    service mongodb restart
    service eltex-ems stop
    service tomcat7 stop
    service eltex-ngw stop
    mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "stop slave"
    mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "start slave"
 ;;
 fault)
    echo "FAULT" > /tmp/keep.mode
    mongo_set_role slave
    service mongodb restart
 ;;
 *)
    echo "Usage: $0 {master|backup|fault}"
    exit 1
esac

lockfile-remove /tmp/keep.mode.lock;

exit 0


с доделками и пояснениями

Скрипт смены мастера replicaSet MongoDB.

/etc/keepalived/mongo_switch.js
// Предоставляется окружением
var role;

if (role != 'master' && role != 'slave') {
    throw "Role must be either master or slave";
}

var thisIsMaster = (role == 'master');
var status = rs.isMaster();
var thisHost = status.me;

print("Primary: " + status.ismaster + "; applying configuration ...");
var cfg = rs.conf();
for (var i = 0; i < cfg.members.length; i++) {
    var member = cfg.members[i];
    var self = (member.host == thisHost);
    if (self ^ thisIsMaster) {
        // Конфигурация для slave
        member.priority = 1;
        member.votes = 0;

        print(member.host + ": secondary");
    } else {
        // Конфигурация для master
        member.priority = 2;
        member.votes = 1;

        print(member.host + ": primary");
    }
}

var result = rs.reconfig(cfg, { force: !status.ismaster });
if (result.ok == 1) {
    print("Reconfiguration done");
} else {
    print(result);
}


Конфигурация демона keepalived

параметры запуска etc

Выделение лога в отдельный файл

По умолчанию keepalived записывает лог в файл /var/log/syslog . Для удобства отладки, мониторинга и контроля работы keepalived можно настроить ведение собственного, отдельного лог-файла. Ниже приведен пример настройки rsyslog:

nano -w /etc/rsyslog.d/10-keepalived.conf
if $programname contains 'Keepalived' then /var/log/keepalived.log
if $programname contains 'Keepalived' then ~

Затем нужно перезапустить rsyslog командой:

root@swlc01-server:/# service rsyslog restart

Теперь сообщения от демона keepalived попадут только в лог-файл /var/log/keepalived.log и не попадут в /var/log/syslog .

  • Нет меток