我已经设置了一个邮件服务器,用于测试。我的目标是拥有一个带有 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 集群活动/活动?
多亏了 unix 论坛的帮助,找到了解决方案:从 lo:0 中删除了 virtual-ip 并仅在 haproxy/keepalived 服务器上创建了一个 nm-team:0 别名。
然后我编辑 haproxy.cfg
然后我编辑keepalived.conf
然后我在haproxy2上复制keepalived.conf并调整一些声音(MASTER变成BACKUP,id 100变成101)。在 haproxy 服务器上,我为 sysctl 保留此配置
在重新启动keepalived和haproxy后一切正常,我已经测试了一个客户端连接,关闭了一个邮件服务器,在5-10秒不活动后连接恢复活动而不重新启动MUA。