понедельник, 25 апреля 2016 г.

Как осуществить балансировку исходящей почты.

Балансировка исходящей почты может пригодиться, когда в качестве следующего получателя (next-hop) письма есть несколько серверов. Для одного домена можно указать несколько MX записей и/или несколько IP адресов (Round robin DNS). Этот вариант широко распространен для публичного интернета. Однако, этот вариант не подходит, если вы не имеете возможность менять DNS зону. Или к примеру, для почтового сервера используемого внутри LAN: пересылка всех писем может осуществляется на next-hop, который указан в (или для определенных случаев в таблице transport). Уточню, в postfix в директиве relayhost нельзя указать перечень серверов. Усложним задачу: необходимо определять доступность next-hop серверов. Сделать требуемое позволит haproxy. Его можно развернуть на этом же почтовом сервере. Haproxy будет слушать на loopback'е, перенаправляя входящий трафик на сервера next-hop. Помимо пересылки трафика он так же будет мониторить доступность серверов. Пример конфигурации haproxy:

# cat /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

# turn on stats unix socket
stats socket /var/lib/haproxy/stats

defaults
log global
option tcplog
option log-health-checks
option dontlognull
option redispatch
retries 3
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
maxconn 3000

listen stats gwip:5111
mode http
stats enable
stats hide-version
stats auth admin:password
stats uri /admin?stats
stats show-desc server.domain.com

listen base_relay 127.0.0.1:5222
mode tcp
balance roundrobin
option smtpchk HELO server.domain.com
server nexthop1 ip1:25 check inter 5000 fall 3 rise 3
server nexthop2 ip2:25 check inter 5000 fall 3 rise 3
server nexthop3 ip3:25 check inter 5000 fall 3 rise 3
server nexthop4 ip4:25 check inter 5000 fall 3 rise 3

Кратко по листингу:
  • listen stats gwip:5111 — блок описания графического интерфейса статистики и управления haproxy, gwip должен быть ip сервера. Не забудьте поменять пароль!
  • listen base_relay 127.0.0.1:5222 — блок описания балансировки исходящей почты.
    • balance roundrobin — политика балансировки соединений, название говорит само за себя.
    • option smtpchk HELO server.domain.com — проверка доступности серверов next-hop на седьмом уровне модели OSI, укажите свое имя сервера.
    • server nexthop1 ip1:25 check inter 5000 fall 3 rise 3 — информация по next-hop серверу, его имя — nexthop1, ip — ip1, и параметры проверки:
      • inter - временной интервал проверки, 5000 мс.
      • fall - количество неудачных попыток подряд, после чего сервер исключается из списка балансировки соединений.
      • rise - количество удачных попыток подряд, после чего сервер возвращается в список.

Теперь осталось только поменять в конфигурации postfix адрес в директиве relayhost на 127.0.0.1:5222. Данная статья хорошо сочетается с этой публикацией. Могу добавить, что в моем случае количество проходящих писем составляет более миллиона в сутки.