پرش به محتوا

IP مجازی با keepalived برای دو load balancer

با VRRP یک IP مشترک بین دو سرور HAProxy بسازید تا اگر یکی از کار افتاد، دیگری در چند ثانیه IP را بگیرد و سرویس قطع نشود.

Ubuntu 24.04 LTSسطح: پیشرفتهبرای: Ubuntu 24.04 LTS، Ubuntu 26.04 LTS، Ubuntu 22.04 LTSبه‌روزرسانی: ۱۷ آبان ۱۴۰۵

یک load balancer تکی خودش نقطه‌ی شکست است. در این آموزش دو سرور lb01 (192.168.10.21) و lb02 (192.168.10.22) هر دو HAProxy دارند و IP مجازی 192.168.10.30 همیشه روی یکی از آن‌هاست. رکورد DNS سایت به IP مجازی اشاره می‌کند.

۱. نصب روی هر دو سرور

bash
sudo apt install -y keepalived
echo 'net.ipv4.ip_nonlocal_bind = 1' | sudo tee /etc/sysctl.d/60-nonlocal-bind.conf
sudo sysctl --system

ip_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 ACCEPT
bash
sudo ufw reload

۵. اجرا و آزمایش

bash
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 پیوسته در جریان باشد تا ببینید فقط یکی دو بسته از دست می‌رود.

bash
sudo systemctl start haproxy   # VIP returns to lb01 (higher priority)

تنظیمات HAProxy دو سرور را همیشه یکسان نگه دارید، مثلاً با یک اسکریپت rsync یا Ansible.