我想练习在一台机器上使用多个 Docker 容器创建高可用的 Web 应用程序。
我在 Docker 容器中启动了多个 Web 服务器。比如说,三台服务器rest1和rest2。rest3
我将 Docker 与 HAProxy 平衡器结合使用,该平衡器绑定到服务器127.0.0.1:80并将查询路由到rest服务器。这使我可以确定,当一两台rest服务器发生故障时,我将能够进行查询127.0.0.1:80并收到正确的结果。
坏事是:当 HAProxy 关闭时,Web 应用程序也会关闭。
我想使用多个 HAProxy Docker 容器,每个容器中都带有 Keepalived 服务。问题是:我需要几个Docker容器来监听一个IP和一个PORT。例如,我将拥有haproxy1和,它将通过 Keepalivedhaproxy2绑定到。localhost
当我在 HAProxy 配置文件中设置 IP(不是当前 Docker 容器的 IP)时,它显示一个错误,HAProxy 无法侦听此 IP 和端口。
是否可以使用HAProxy和Keepalived配置多个Docker容器来监听一个IP和PORT?
HAProxy的配置:
defaults
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
mode http
bind 172.17.0.10:80
default_backend BACKEND
backend BACKEND
option httpchk
server rest1 …Run Code Online (Sandbox Code Playgroud) 我想在某个接口上使用 keepalived,该接口将在某个时候获得 IP 但最初没有 IP,我可以在配置中以某种方式设置它吗?如果我现在尝试启动它,keepalived 会出错,因为 keepalived 不知道在发送 VRRP 数据包时要使用哪个源 IP 地址。会议:
!keepalived的配置文件
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass pwd
}
virtual_ipaddress {
192.168.0.13
}
notify /etc/state_change.py
}
Run Code Online (Sandbox Code Playgroud)
日志:
keepalived -f /etc/keepalived.conf --log-console --dont-fork
Thu Jun 28 11:25:53 2018: Starting Keepalived v1.4.4 (05/08,2018)
Thu Jun 28 11:25:53 2018: Running on Linux 4.7.8 #9 SMP Wed Jun 27 17:25:18 IST
2018 (built for Linux 4.7.8)
Thu Jun 28 11:25:53 …Run Code Online (Sandbox Code Playgroud) 我正在 Linode 上运行一个应用程序。他们的网络不支持多播。许多用于故障转移的工具(keepalived、spread/wackamole、heartbeat)需要多播才能工作(据我所知)。我已经阅读了所有这些的文档,即使在“单播”模式下(如果有的话)它仍然通过多播发送。
我知道通过 GRE 隧道,我可以在路由器不知道的情况下有效地发送多播,这将使我能够使用其中一种工具(现在我想使用 keepalived)。
我在设备“gretun”上设置了我的隧道,如下所示:
10.0.0.1 是指向 www1
的隧道接口点 10.0.0.2 是指向 www2 的隧道接口点
我可以nc 10.0.0.2 80从 www1 和nc 10.0.0.1 80www2,所以它似乎正在工作。假设我要共享的公共 IP 是 69.164.69.69。
我有两个问题:
配置keepalived监控隧道(gretun)后,两台机器还是看不到对方。这是我的配置:
global_defs {
notification_email {
info@app.com
}
notification_email_from alerts@app.com
smtp_server localhost
smtp_connect_timeout 30
router_id www1.app.com
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface gretun
virtual_router_id 51
priority 100
advert_int 1
garp_master_delay 2
smtp_alert
authentication {
auth_type PASS
auth_pass …Run Code Online (Sandbox Code Playgroud) 我在 Debian(Lenny、Squeeze)下以相当简单的设置运行keepalived,我只是(ab)将它用作 VRRP 守护程序来决定某些虚拟 IP 的两台相同机器之间的主控权。所有的魔法都发生在notify脚本中。
当我完全停止守护进程(使用 debian 的 init-script)时,keepalived 不会运行用于备份或至少故障模式的通知脚本,这是我怀疑和需要的。
我可以用一些不需要的效果“修复” rc 脚本 - 通知脚本将被硬编码到 rc 脚本中,从而引入了这两者的不必要的耦合以及将补丁移植到下一个 debian 版本的混乱,所以这是不是我真正想要的方式...
对此问题的更清洁解决方案的任何提示?
vrrp_instance FOORRP {
virtual_router_id 42
interface eth0
state BACKUP
priority 200
nopreempt
authentication {
auth_type AH
auth_pass foobar42
}
notify "/usr/local/bin/vrrp-state"
virtual_ipaddress {
127.0.0.2
}
}
Run Code Online (Sandbox Code Playgroud)
PS:使用“三个notify_”脚本不会改变任何东西
PPS:在变更日志(1.1.16 版)中提到了一些内容,它以某种方式适合我的问题(虽然我没有在 keepalived 中使用任何与 lvs 相关的东西),但我使用的是更新版本(1.1.20):“notify_down不会为在 keepalived 关闭时工作的真实服务器执行。”
两台服务器都开始keepalived,BACKUP服务器立即转为MASTER STATE。两人现在都成为了大师。
两个节点都在发送 VRRP 广告消息。
在主服务器上:
[root@zhsq1 ~]# tcpdump -c 3 -i em1 host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:01:35.526355 IP zhsq1 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 153, authtype simple, intvl 1s, length 20
11:01:36.526497 IP zhsq1 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 153, authtype simple, intvl 1s, length 20
11:01:37.527561 IP zhsq1 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, …Run Code Online (Sandbox Code Playgroud) 我们有一些 PHP-FPM 服务器,当它们需要数据库连接时,它们会连接到 HAProxy 服务器,该服务器会选择要使用的数据库服务器并打开连接。当我们想要对 HAProxy 服务器进行一些维护(例如需要重新启动 HAProxy 的配置更改)时,过程如下:
当第 2 步发生时,此时打开的 mysql 连接会发生什么?根据此 TCP 会话和 IP 更改问题,连接将被丢弃。真的是这样吗?如果是这样,可以采取什么措施来防止这种情况发生?是否可以以某种方式强制连接使用服务器的主要(非浮动)IP?
我们也有一个类似的设置,两个 Nginx 服务器上运行了 Keepalived,我们计划执行相同的过程。如果我们这样做,同样的问题也适用 - 当 IP 移动到另一台服务器时,现有的 http 连接会发生什么?
我感谢您的帮助。
我可能不明白这应该如何工作,但我无法弄清楚为什么带有这个基本 vrrp_instance 的 BACKUP 系统会立即过渡到 master 并且似乎从不尊重优先级。
当两者都健康且在线时,为什么虚拟 IP 地址不会从备份系统中删除?
看起来两个系统都在广播 vrrp 广告。从tcpdump备份系统开始:
betaproxyslc01.fakecorp.com > vrrp.mcast.net: vrrp betaproxyslc01.fakecorp.com > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51 , prio 150 , authtype simple, intvl 1s, length 20, >addrs: virtual-app .fakecorp.com auth "password" 15:52:24.541637 IP (tos 0xc0, ttl 255, id 1611, offset 0, flags [none], proto VRRP (112), length 40)
betaproxyslc02.fakecorp.com > vrrp.mcast.net: vrrp betaproxyslc02.fakecorp.com > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51 , prio 100, authtype simple, intvl 1s, length 20, >addrs: virtual-app …
我希望有人能看到我做错了什么并提供帮助来运行 keepalived track_script 。
我将主 keepalived 框的 vrrp_instance 的优先级设置为 101,将故障转移框的优先级设置为 100。断开网络连接或停止主设备上的 keepalived 会导致 VIP 按预期转移到辅助设备。
如果脚本要运行,如果脚本返回成功,我希望它会将优先级添加 2。然而 atcpdump始终显示优先级不变。即使我对脚本定义进行了虚假设置,我也从未在 /var/log/messages 中看到任何有关该脚本的信息。停止 HAProxy 服务不会产生任何影响,而且我对脚本所做的其他测试表明它永远不会运行。
输出tcpdump:
172.18.8.2 > 224.0.0.18: vrrp 172.18.8.2 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 101, authtype simple, intvl 1s, length 20, addrs: 172.18.8.4 auth "password"
Run Code Online (Sandbox Code Playgroud)
这是 keepalived 配置:
global_defs {
router_id BETAPROXYSLC01
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority …Run Code Online (Sandbox Code Playgroud) 我已经设置 keepalived 来管理两个主机之间的虚拟 IP。
Server #1: Hostname folmer, ip 192.168.0.1/22 dev p2p1
Server #2: Hostname flemming, ip 192.168.0.2/22 dev p2p1
VIP: 192.168.0.3/22
Run Code Online (Sandbox Code Playgroud)
Keepalived 正在工作,当一台服务器出现故障时,VIP 会在服务器之间切换。
问题:在本地网络上,我可以 ping 通 192.168.0.3,但是当我将默认路由设置为 192.168.0.3 而不是 192.168.0.1 时,我无法再通过服务器 #1 访问互联网。
global_defs {
notification_email {
[SNIP]
[SNIP]
}
notification_email_from [SNIP]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id folmer
}
vrrp_instance VI_1 {
state MASTER
interface p2p1
virtual_router_id 52
priority 150
advert_int 1
garp_master_delay 2
smtp_alert
authentication {
auth_type PASS
auth_pass [SNIP] …Run Code Online (Sandbox Code Playgroud) 我们有几个后端养殖场(HTTP,FTP等),基本上是一个农场的每一位客户,我将重建我们的负载平衡的基础设施,移动Piranha到HAProxy。
由于我们使用了几个不同的后端服务器群,Piranha 配置目前看起来像这样(示例显示了服务器场webserv01,第二个服务器场webserv02使用相同的配置,但不同的虚拟 IP):
virtual webserv01 {
active = 1
address = 10.11.11.1 eth2:30
vip_nmask = 255.255.255.0
port = 80
send = "GET / HTTP/1.0\r\n\r\n"
expect = "HTTP"
use_regex = 0
load_monitor = none
scheduler = rr
protocol = tcp
timeout = 6
reentry = 15
quiesce_server = 0
server webserv01v {
address = 192.168.101.64
active = 1
port = 80
weight = 1
}
server webserv02v {
address = …Run Code Online (Sandbox Code Playgroud) keepalived ×10
haproxy ×3
linux ×3
nginx ×2
backend ×1
debian ×1
docker ×1
failover ×1
load-balance ×1
networking ×1
routing ×1
tcp ×1
tcpip ×1
tunneling ×1
vrrp ×1