Перейти к основному содержанию

Keepalived для Postfix

Keepalived

Есть два сервера с операционной системой Ubuntu 20.04.4 LTS. На обоих серверах развёрнут Postfix сервер. Почтовики работают только на отправку писем, на них всё уже настроено. Пришла задача объединить их в один отказоустойчивый кластер Master — Slave с плавающим виртуальным IP-адресом с помощью keepalived. Главная задача: принимать почту на один IP адрес и обеспечить резервирование postfix.

keepalived — это open source программное обеспечение (написано на C), предназначенное для обеспечения функций высокой надежности (high availabilitty) и балансировки нагрузки (load-balancing) в кластерах Linux. За первую функцию отвечает реализация протокола VRRP, а вторая основывается на модуле ядра IPVS.

VRRP (Virtual Router Redundancy Protocol) — сетевой протокол, предназначенный для увеличения доступности маршрутизаторов, выполняющих роль шлюза по умолчанию. Это достигается путём объединения группы маршрутизаторов в один виртуальный маршрутизатор и назначения им общего IP-адреса, который и будет использоваться как шлюз по умолчанию для компьютеров в сети.

IPVS (IP Virtual Server) — модуль ядра Linux, реализующий балансировку нагрузки транспортного уровня, обычно называемую коммутацией уровня 4. L4-маршрутизатор.

Установка keepalived

В популярных ОС keepalived имеется в официальных репозиториях. Deb:

apt update
apt install keepalived

Rpm:

yum install keepalived

Настройка кластера

  • На первом сервере настроен IP адрес: 10.12.49.35
  • На втором сервере настроен IP адрес: 10.12.49.36

Выделяем новый IP адрес, который будет использоваться в качестве виртуального: 10.12.49.37.

Настраиваем конфигурационный файл /etc/keepalived/keepalived.conf на первом сервере:

cd /etc/keepalived
vim keepalived.conf

Содержимое:

vrrp_script chk_service {
        script "/opt/postfix.check.sh"
        interval 3
        weight 100
        user postfix
}

vrrp_instance VI_postfix {
        interface ens160
        state MASTER
        priority 100
        virtual_router_id 173
        advert_int 1
        unicast_src_ip 10.12.49.35
        unicast_peer {
                10.12.49.36
        }
        virtual_ipaddress {
                10.12.49.37
        }
        track_script {
                chk_service
        }
}

Настраиваем конфигурационный файл /etc/keepalived/keepalived.conf на втором сервере:

cd /etc/keepalived
vim keepalived.conf

Содержимое:

vrrp_script chk_service {
        script "/opt/postfix.check.sh"
        interval 3
        weight 100
        user postfix
}

vrrp_instance VI_postfix {
        interface ens160
        state BACKUP
        priority 100
        virtual_router_id 173
        advert_int 1
        unicast_src_ip 10.12.49.36
        unicast_peer {
                10.12.49.35
        }
        virtual_ipaddress {
                10.12.49.37
        }
        track_script {
                chk_service
        }
}

Давайте посмотрим, что у нас тут есть.

  • vrrp_script — скрипт проверки сервиса, chk_service — имя функции
    • script — скрипт может быть любым, он должен вернуть код ответа 0 если postfix работает нормально, или любой другой ответ если не работает
    • interval — периодичность запуска скрипта проверки в секундах
    • weight — значение, на которое будет уменьшен приоритет сервера, в случае перехода в состояние FAULT
    • user — пользователь, под которым запускается скрипт, в данном случае postfix — пользователь postfix
  • vrrp_instance — экземпляр сервиса, назовём VI_postfix
    • interface — имя сетевого интерфейса
    • state — начальное состояние при запуске. На главном MASTER, на втором BACKUP
    • priority — приоритет выбора главного сервера
    • virtual_router_id — уникальный идентификатор VRRP экземпляра, должен быть одинаковым на всех серверах экземпляра VRRP
    • advert_int — периодичность оповещения мастером других нод время в секундах, если за данное время мастер не успеет отправить широковещательный сигнал, начнутся выборы другого мастера на основе priority
    • unicast_src_ip — адрес источник VRRP пакетов
    • unicast_peer — адреса получатели VRRP пакетов
    • virtual_ipaddress — блок виртуальных IP адресов, которые будут активны на мастере, должны совпадать на всех серверах экземпляра VRRP
    • track_script — мониторинг с использованием скрипта, который должен возвращать 0 если проверка завершилась успешно

 Есть примеры с использованием опции authentication. Она устарела и была удалена из VRRPv2 в спецификации RFC3768 в 2004 году. Рекомендуется избегать использования этой опции.

 
Keepalived Configuration Manual Page

Создадим скрипт /opt/postfix.check.sh, он должен вернуть код ответа 0, если сервис Postfix работает нормально.

#!/bin/bash

systemctl is-active postfix > /dev/null 2>&1

Дадим права на него пользователю postfix:

chown postfix: /opt/postfix.check.sh
chmod 700 /opt/postfix.check.sh

Запуск кластера

На мастере:

systemctl enable keepalived
systemctl start keepalived

systemctl status keepalived
ip a

postfix

Мы увидели второй виртуальный IP адрес 10.12.49.137.

 На бэкапе:

systemctl enable keepalived
systemctl start keepalived

systemctl status keepalived
ip a

 

postfix

Проверяем на бэкапе работу VRRP:

Ловим VRRP пакеты с помощью tcpdump

Для проверки keepalived остановим на мастере службу postfix.

systemctl stop postfix

postfix

И виртуальный IP переехал на вторую ноду.

Ссылки

https://keepalived.org

Установка Postfix на Ubuntu 20.04 LTS в минимальной конфигурации

Теги

 

Похожие материалы

Postfix — отправка с использованием TLS

Рассмотрим случай, когда ваш почтовый сервер только отправляет почту. По умолчанию в postfix TLS при отправке писем отключён. Чтобы включить TLS, нужно в конфиг /etc/postfix/main.cf внести изменения: smtp_use_tls = yes.

Теги