Назад | Перейти на главную страницу

О почтовом сервере и imap ha активно-активный кластер

Я установил почтовый сервер для тестирования. Моя цель - иметь почтовый сервер HA с imaps, когда клиент подключается к виртуальному ip, он перенаправляет на два реальных сервера, если реальный сервер выходит из строя, другой реальный сервер "берет" соединение. Я установил кластер с двумя keepalived / haproxy lb и двумя реальными серверами с postfix и Dovecot. Два lb - это Debian, почтовые серверы - Fedora 31. Это моя конфигурация, на двух фунтах (балансировщики нагрузки)

Keepalived.conf

global_defs {
}
vrrp_instance VI_1 {
       interface nm-team
       state MASTER
       virtual_router_id 51
       priority 101                    # 101 on master, 100 on backup
       advert_int 1
       smtp_alert
authentication {
auth_type PASS
auth_pass mypass

}
}

       virtual_ipaddress {
           10.2.0.4/24 brd 10.2.0.255 dev nm-team
}

 virtual_server 10.2.0.4 25 {
   delay_loop 30
   lb_algo rr
   lb_kind DR
   protocol TCP
   persistence_timeout 360

   real_server 10.2.0.5 25 {
   weight 1
       TCP_CHECK {
               connect_timeout 10
       connect_port 25
       delay_before_retry 3
       }
   }
   real_server 10.2.0.6 25 {
       weight 1
       TCP_CHECK {
               connect_timeout 10
       connect_port 25
       delay_before_retry 3
       }
   }
}

virtual_server 10.2.0.4 993 {
delay_loop 30
lb_algo rr
lb_kind DR
protocol TCP
persistence_timeout 360

real_server 10.2.0.5 993 {
weight 1
    TCP_CHECK {
            connect_timeout 10
    connect_port 993
    nb_get_retry 3
    delay_before_retry 3
    }
}
real_server 10.2.0.6 993 {
    weight 1
    TCP_CHECK {
            connect_timeout 10
    connect_port 993
    nb_get_retry 3
    delay_before_retry 3
    }
}
}

haproxy.cfg

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    # Default ciphers to use on SSL-enabled listening sockets.
    # For more information, see ciphers(1SSL). This list is from:
    #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
    # An alternative list with additional directives can be obtained from
    #  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    ssl-default-bind-options no-sslv3

defaults
    log global
    mode    tcp

#postfix
listen smtp
bind mail.mydomain.priv:25
balance roundrobin
timeout client 30s
timeout connect 10s
timeout server 1m
no option http-server-close
mode tcp
option smtpchk
option tcplog
server mail1 mail1.mydomain.priv:25 send-proxy
server mail2 mail2.mydomain.priv:25 send-proxy

#dovecot
listen imap
bind mail.mydomain.priv:993
timeout client 30s
timeout connect 10s
timeout server 1m
no option http-server-close
balance leastconn
stick store-request src
stick-table type ip size 200k expire 30m
mode tcp
option tcplog
server mail1 mail1.mydomain.priv:993 send-proxy
server mail2 mail2.mydomain.priv:993 send-proxy

Как видите, mail.domain.priv - это «виртуальный» сервер, привязанный к виртуальному IP-адресу 10.2.0.4 (созданный keepalived), настоящие серверы - 10.2.0.5 и 10.2.0.6. Виртуальный ip 10.2.0.4 - это псевдоним интерфейса lo, я создал его с этими строками в lb

ip addr add 10.2.0.4/32 dev lo label lo:0

и на реальных серверах

echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
ip addr add 10.2.0.4/32 dev lo label lo:0

Я пропускаю публикацию конфигурации dovecot / postfix, потому что она слишком длинная, но я протестировал ее и отлично работает как с одним сервером, так и с виртуальным IP-адресом 10.2.0.4. Конечно, на реальном сервере есть / var / vmail / mydomain, совместно используемый glusterfs (я знаю, что это медленно, но только для тестирования). Я подключил клиента, и я могу без проблем получать электронные письма с dovecot и отправлять электронные письма с postfix, используя imaps и smtp с starttls. Так в чем проблема? Я протестировал кластер, отключив один из реальных серверов с открытым клиентом (Thunderbird), и клиент «завис», поскольку кластера не существует и он не может читать электронные письма. Если я убью клиента или перезапущу его, он без проблем переподключится к виртуальному ip 10.2.0.4 (mail.mydomain.priv). Что случилось? Можно ли создать активный / активный кластер ha с помощью keepalived и haproxy?

Решение найдено благодаря помощи форума unix: удален virtual-ip из lo: 0 и создан псевдоним nm-team: 0 только на серверах haproxy / keepalived.

Потом редактирую haproxy.cfg

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    # Default ciphers to use on SSL-enabled listening sockets.
    # For more information, see ciphers(1SSL). This list is from:
    #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
    # An alternative list with additional directives can be obtained from
    #  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    ssl-default-bind-options no-sslv3

defaults
    log         global
    mode            tcp
        option                  dontlognull
        option                  redispatch
        retries                 3
        timeout http-request    10s
        timeout queue           1m
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check           10s
        maxconn                 3000

frontend mail-in
    bind mail.mydomain.priv:25
    mode tcp
    option tcplog
    default_backend             mail-in-back

backend mail-in-back
    balance     roundrobin
    server      mail1.mydomain.priv mail1.mydomain.priv:25 check
    server      mail2.mydomain.priv mail2.mydomain.priv:25 check


frontend imaps-in
    bind mail.mydomain.priv:993
    mode tcp
    option tcplog
    default_backend             imaps-in-back

backend imaps-in-back
    balance     roundrobin
    server      mail1.mydomain.priv mail1.mydomain.priv:993 check
    server      mail2.mydomain.priv mail2.mydomain.priv:993 check

Затем редактирую keepalived.conf

vrrp_script chk_haproxy {
  script "killall -0 haproxy"           # check the haproxy process
  interval 2                            # every 2 seconds
  weight 2                              # add 2 points if OK
}

vrrp_instance VI_1 {
  interface nm-team                     # interface to monitor
  state MASTER                          # MASTER on haproxy1, BACKUP on haproxy2
  virtual_router_id 51
  priority 100                          # 100 on haproxy1, 101 on haproxy2
  advert_int 1
  smtp_alert
  authentication {
  auth_type PASS
  auth_pass yourpass
}

  virtual_ipaddress {
       10.2.0.4                        # virtual ip address
  }
  track_script {
       chk_haproxy
  }
}

Затем я копирую keepalived.conf на haproxy2 и настраиваю несколько голосов (МАСТЕР становится РЕЗЕРВНЫМ, а идентификатор 100 становится 101). На серверах haproxy я сохраняю эту конфигурацию для sysctl

net.ipv4.tcp_syncookies=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.team0.send_redirects = 0
net.ipv4.conf.nm-team.send_redirects = 0

И после перезапуска keepalived и haproxy все работает нормально, я протестировал клиентское соединение, выключил один почтовый сервер, и после 5-10 секунд бездействия соединение восстановилось без перезапуска MUA.