یک load balancer تکی خودش نقطهی شکست است. در این آموزش دو سرور lb01 (192.168.10.21) و lb02 (192.168.10.22) هر دو HAProxy دارند و IP مجازی 192.168.10.30 همیشه روی یکی از آنهاست. رکورد DNS سایت به IP مجازی اشاره میکند.
۱. نصب روی هر دو سرور
sudo apt install -y keepalived
echo 'net.ipv4.ip_nonlocal_bind = 1' | sudo tee /etc/sysctl.d/60-nonlocal-bind.conf
sudo sysctl --systemip_nonlocal_bind اجازه میدهد HAProxy روی سرور پشتیبان هم به IP مجازی bind کند، حتی وقتی IP هنوز روی آن سرور نیست.
۲. تنظیمات lb01
/etc/keepalived/keepalived.conf:
global_defs {
enable_script_security
script_user root
}
vrrp_script chk_haproxy {
script "/usr/bin/systemctl is-active --quiet haproxy"
interval 2
fall 2
rise 2
weight -30
}
vrrp_instance VI_WEB {
state BACKUP
interface ens18
virtual_router_id 51
priority 110
advert_int 1
unicast_src_ip 192.168.10.21
unicast_peer {
192.168.10.22
}
authentication {
auth_type PASS
auth_pass S4h0rVr
}
virtual_ipaddress {
192.168.10.30/24
}
track_script {
chk_haproxy
}
}۳. تنظیمات lb02
همان فایل، با این تفاوتها:
priority 100
unicast_src_ip 192.168.10.22
unicast_peer {
192.168.10.21
}اگر HAProxy روی lb01 متوقف شود، اولویت آن ۳۰ واحد کم میشود (110 − 30 = 80). چون 80 کمتر از 100 است، lb02 IP را میگیرد. virtual_router_id باید در هر دو یکسان و در کل شبکه یکتا باشد. auth_pass حداکثر ۸ کاراکتر است.
۴. فایروال
پروتکل VRRP شمارهی ۱۱۲ است و TCP یا UDP نیست، پس با دستور معمولی ufw allow باز نمیشود. در /etc/ufw/before.rules، پیش از خط COMMIT، این خط را اضافه کنید (روی lb02 آدرس lb01 را بنویسید):
-A ufw-before-input -p vrrp -s 192.168.10.22 -j ACCEPTsudo ufw reload۵. اجرا و آزمایش
sudo systemctl enable --now keepalived
ip -br addr show ens18 # VIP appears on the MASTER only
journalctl -u keepalived -n 20 --no-pagerآزمایش جابهجایی: روی lb01 دستور sudo systemctl stop haproxy را بزنید. در چند ثانیه IP مجازی به lb02 میرود. از کامپیوتر دیگری یک ping 192.168.10.30 پیوسته در جریان باشد تا ببینید فقط یکی دو بسته از دست میرود.
sudo systemctl start haproxy # VIP returns to lb01 (higher priority)تنظیمات HAProxy دو سرور را همیشه یکسان نگه دارید، مثلاً با یک اسکریپت rsync یا Ansible.