标签: keepalived

如何将 Docker 与 HAProxy+Keepalived 结合使用?

我想练习在一台机器上使用多个 Docker 容器创建高可用的 Web 应用程序。

我在 Docker 容器中启动了多个 Web 服务器。比如说,三台服务器rest1rest2rest3

我将 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)

high-availability haproxy failovercluster keepalived docker

4
推荐指数
1
解决办法
8018
查看次数

在接口上没有 IP 的情况下启动 keepalived?

我想在某个接口上使用 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)

linux vrrp keepalived

4
推荐指数
1
解决办法
2865
查看次数

Keepalived over GRE 隧道,用于 VPS 环境中的故障​​转移

我正在 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)

tunneling failover high-availability keepalived

3
推荐指数
1
解决办法
3459
查看次数

keepalived 关闭 - 在守护程序关闭时不运行“通知”钩子

我在 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 关闭时工作的真实服务器执行。”

debian keepalived

3
推荐指数
1
解决办法
4467
查看次数

运行keepalived的两台服务器都成为主服务器并拥有相同的虚拟IP

两台服务器都开始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)

networking linux nginx keepalived

3
推荐指数
3
解决办法
4万
查看次数

当服务器 IP 更改时,现有 TCP(例如 http/mysql)连接是否保持运行

我们有一些 PHP-FPM 服务器,当它们需要数据库连接时,它们会连接到 HAProxy 服务器,该服务器会选择要使用的数据库服务器并打开连接。当我们想要对 HAProxy 服务器进行一些维护(例如需要重新启动 HAProxy 的配置更改)时,过程如下:

  1. 关闭 HAProxy 服务器上的 Keepalived
  2. 等待浮动IP转移到备份HAProxy服务器(也运行Keepalived)
  3. 等到 HAProxy stats 只报告一个连接(我们检查有多少连接)
  4. 重启HAProxy
  5. 重启Keepalived

当第 2 步发生时,此时打开的 mysql 连接会发生什么?根据此 TCP 会话和 IP 更改问题,连接将被丢弃。真的是这样吗?如果是这样,可以采取什么措施来防止这种情况发生?是否可以以某种方式强制连接使用服务器的主要(非浮动)IP?

我们也有一个类似的设置,两个 Nginx 服务器上运行了 Keepalived,我们计划执行相同的过程。如果我们这样做,同样的问题也适用 - 当 IP 移动到另一台服务器时,现有的 http 连接会发生什么?

我感谢您的帮助。

tcpip nginx tcp haproxy keepalived

3
推荐指数
1
解决办法
1332
查看次数

VIP 不会从备份 keepalived 中删除

我可能不明白这应该如何工作,但我无法弄清楚为什么带有这个基本 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 …

linux load-balance keepalived

3
推荐指数
1
解决办法
7723
查看次数

keepalived track_script 似乎没有运行

我希望有人能看到我做错了什么并提供帮助来运行 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

3
推荐指数
1
解决办法
1万
查看次数

虚拟 IP 上的 Keepalived 路由器无法访问

我已经设置 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 访问互联网。

服务器 #1 上的 Keepalived 配置:

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)

routing keepalived

3
推荐指数
1
解决办法
1万
查看次数

HAProxy + keepalived + 多个后端农场/虚拟 IP 地址

我们有几个后端养殖场(HTTP,FTP等),基本上是一个农场的每一位客户,我将重建我们的负载平衡的基础设施,移动PiranhaHAProxy
由于我们使用了几个不同的后端服务器群,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)

load-balancing haproxy keepalived backend

3
推荐指数
1
解决办法
8011
查看次数