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


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

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

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

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

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

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

Установка

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

root@master:/# dpkg -i keepalived-eltex_1.4.2-16.04_amd64.deb

Установка сразу со всеми зависимостями:

apt-get install -f ./keepalived-eltex_1.4.2-32-16.04_amd64.deb


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

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

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                                     # Режим в котором будет запускаться демон, на мастер сервере установите state MASTER
    interface eth0                                   # Интерфейс на котором будет работать VRRP
    virtual_router_id 1                              # Уникальное значения для различия между разными vrrp-instance. Должен совпадать на обоих узлах.
    track_script {
        check_network
    }
    track_interface {                                # мониторинг состояния интерфейсов
        eth0 weight 50
    }
    priority 150
    advert_int 1                                     # Интервал опроса VRRP
    nopreempt
    authentication {                                 # Блок аутентификации
        auth_type PASS                               # PASS - по паролю.
        auth_pass eltex                              # keepalived обрезает пароль до 8 символов. Так что делать пароль длиннее не имеет смысла.
    }
    virtual_ipaddress {
        <virtual_ip> dev eth0 label eth0:1           # Указваем общий виртуальный ip-адрес для членов VRRP instance.
    }
 
    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 адресов серверов, на которые будут рассылаться VRPP пакеты.
        <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 .

  • Нет меток