AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1010917
Accepted
elbarna
elbarna
Asked: 2020-04-05 09:02:11 +0800 CST2020-04-05 09:02:11 +0800 CST 2020-04-05 09:02:11 +0800 CST

关于邮件服务器和imap ha双活集群

  • 772

我已经设置了一个邮件服务器,用于测试。我的目标是拥有一个带有 imaps 的 HA 邮件服务器,当客户端连接到虚拟 ip 时,它会重定向到两个真实服务器,如果一个真实服务器崩溃,另一个真实服务器“接受”连接。我已经设置了一个集群,其中包含两个 keepalived/haproxy lb 和两个带有 postfix 和 Dovecot 的真实服务器。两个 lb 是 Debian,邮件服务器是 Fedora 31。这是我在两个 lb(负载平衡器)上的配置

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 配置,但我已经对其进行了测试并且工作正常,作为单个服务器并使用 10.2.0.4 虚拟 IP。当然,真正的服务器使用 glusterfs 共享 /var/vmail/mydomain(我知道这很慢,但仅用于测试)。我已经连接了一个客户端,我可以使用 dovecot 接收电子邮件,并使用 imaps 和带有 starttls 的 smtp 发送带有 postfix 的电子邮件,没有任何问题。那么,问题是什么?我已经测试了集群关闭了一个客户端打开(Thunderbird)的真实服务器,并且客户端“冻结”,因为集群不存在并且无法读取电子邮件。如果我杀死客户端或重新启动它,它会毫无问题地重新连接到 10.2.0.4 虚拟 ip(mail.mydomain.priv)。怎么了?是否可以使用 keepalived 和 haproxy 创建一个 ha 集群活动/活动?

cluster email-server
  • 1 1 个回答
  • 496 Views

1 个回答

  • Voted
  1. Best Answer
    elbarna
    2020-04-15T16:52:11+08:002020-04-15T16:52:11+08:00

    多亏了 unix 论坛的帮助,找到了解决方案:从 lo:0 中删除了 virtual-ip 并仅在 haproxy/keepalived 服务器上创建了一个 nm-team:0 别名。

    然后我编辑 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
      }
    }
    

    然后我在haproxy2上复制keepalived.conf并调整一些声音(MASTER变成BACKUP,id 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。

    • 0

相关问题

  • 是否有可能从多台计算机中创建一台速度更快的计算机?

  • LVS 集群帮助

  • 如何从 Windows 2008 故障转移群集中删除“额外”(不需要的)网络?

  • 如何在低负载期间关闭(关闭)集群节点?

  • 使用 Nagios 监视 Novell 集群服务

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve