Load-Balancing

keepalived virtual_server - 只在keepalived盒子上回答是打開的

  • July 4, 2015

我有一個由 3 台伺服器組成的平面網路(還沒有路由),每台伺服器都有一個服務(http、mysqld,沒關係)監聽 0.0.0.0(ip_nonlocal_bind 和 ip_forward 已打開)並執行 keepalived。

virtual_server 10.0.0.80 3306 {
 delay_loop 2
 lb_algo rr
 lb_kind DR
 protocol TCP

 real_server 10.0.0.81 3306 {
   weight 10
   TCP_CHECK {
    connect_timeout 1
   }
 }

 real_server 10.0.0.82 3306 {
   weight 10
   TCP_CHECK {
     connect_port    3306
     connect_timeout 1
   }
 }

 real_server 10.0.0.83 3306 {
   weight 10
   TCP_CHECK {
     connect_port    3306
     connect_timeout 1
   }
 }
}

keepalived(作為服務)正在工作,並且在每個盒子上都失敗了。但是,virtual_server 僅從 keepalived 目前具有 IP 的框提供頁面(或數據庫查詢,或其他),它們在另外 2/3 的時間(平均加權)中失敗。

例子:當BOX1有keepalived地址時,請求會WORK,FAIL,FAIL,重複,它只回答“box1”。當BOX2作為keepalived地址時,請求會FAIL、WORK、FAIL,只回复“box2”。

我確信非保活 IP 框拒絕回答查詢,因為他們不擁有或不知道他們應該作為保活 IP 回答。如何讓未保存的框始終回答?

這不是我的第一個 keepalived 設置,但這是我的第一個 virtual_server 設置。我只需要一個負載均衡器,不需要 HAProxy 提供的高可用性。

感謝serverfault.com 問題中的幫助,我能夠解決我的問題。

簡短的回答:

我將虛擬 IP 添加到我的虛擬介面並確保net.ipv4.conf.default.accept_source_route0.

長答案:

虛擬介面的目的是在不停止和啟動服務的情況下輕鬆禁用/啟用/故障轉移 keepalived。只需啟動或關閉虛擬介面即可使 VIP 失敗到另一台伺服器。

為了輕鬆做到這一點,我創建了一個名為/usr/local/src/dummy.service.

[Unit]
Description=Create dummy network interface
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ip link set dummy0 up
ExecStop=/usr/sbin/ip link set dummy0 down
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

然後啟用它。

# systemctl enable /usr/local/src/dummy.service

此外,我載入了虛擬模組驅動程序。

文件/etc/modules-load.d/dummy.conf

dummy

文件/etc/modprobe.d/dummy.conf

alias dummy0 dummy
options dummy numdummies=1

shutdown -r now我發現此時證明它有效更容易,但如果你願意,你可以重新載入 modprobe。

然後你應該看到你有一個新的界面:

# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
3: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
   link/ether 12:23:34:45:56:7a brd ff:ff:ff:ff:ff:ff
      valid_lft forever preferred_lft forever

keepalived.conf我跟踪我的 vrrp_instance 中:

vrrp_instance mysql {
 ...
 track_interface {
   dummy0
 }
 ...
}

這是我需要改變的工作。

我需要將 VIP IP 地址添加到dummy0介面。修改/usr/local/src/dummy.service# systemctl daemon-reload

ExecStart=/usr/sbin/ip link set dummy0 up && ip addr add 10.0.0.100 dev dummy0

我需要確保未啟用源路由,以便任何網路設備都可以回答查詢,然後重新啟動。

# cat "net.ipv4.conf.default.access_source_route = 0" > /etc/sysctl.d/10-keepalived.conf

為了完整起見,我的整個/etc/sysctl.d/10-keepalived.conf

net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.conf.eno16777736.arp_ignore = 1
net.ipv4.conf.eno16777736.arp_announce = 2
net.ipv4.conf.eno16777736.rp_filter = 2
net.ipv4.conf.default.accept_source_route = 0

引用自:https://unix.stackexchange.com/questions/213738