keepalived virtual_server - 只在keepalived盒子上回答是打開的
我有一個由 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_route
是0
.長答案:
虛擬介面的目的是在不停止和啟動服務的情況下輕鬆禁用/啟用/故障轉移 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