Hướng dẫn cấu hình Keepalived thực hiện IP Failover cho hệ thống High Avaiability

Hướng dẫn cấu hình Keepalived thực hiện IP Failover cho hệ thống High Availability | Chào các bạn, trong bài viết ngày hôm nay chúng ta sẽ tìm hiểu thực hành bài Lab liên quan đến mô hình dịch vụ cần đảm bảo tính sẵn sàng cao (High Availability – HA). Đối với mô hình này thì việc hệ thống bị down là điều cần ưu tiên hạn chế và thực hiện tốt nhất có thể. Hiện tại thì có khá nhiều giải pháp, ứng dụng để đảm bảo tính HA cho các dịch vụ trên Linux. Tuy vậy trong bài viết này chúng ta sẽ chỉ tìm hiểu về dịch vụ Keepalived với tính năng Failover IP đảm bảo tính năng tự động chuyển đổi Virtual IP giữa các máy chủ dịch vụ theo mô hình Active/Passive.

 

cấu hình keepalived thực hiện ip failover

Có thể bạn cũng quan tâm chủ đề khác
Keepalive là gì ? Tìm hiểu kĩ thuật Keepalive trong hệ thống HA

Keepalived là gì ?

Chương trình keepalived cho phép nhiều máy tính cùng chia sẻ một địa chỉ IP ảo với nhau theo mô hình Active – Passive (ta có thể cấu hình thêm một chút để chuyển thành mô hình Active – Active nâng cao). Khi người dùng cần truy cập vào dịch vụ, người dùng chỉ cần truy cập vào địa chỉ IP ảo dùng chung này thay vì phải truy cập vào những địa chỉ IP thật của các thiết bị kia.

Bạn có thể xem chi tiết tổng quan về Keepalived tại: Keepalived là gì ? Tìm hiểu dịch vụ Keepalived High Availability

Cơ chế VRRP trong mô hình HA Keepalived

Như đã nói ở trên, các router/server vật lý dùng chung VIP sẽ có 2 trạng thái là MASTER/ACTIVEBACKUP/SLAVE. Cơ chế failover được xử lý bởi giao thức VRRP, khi khởi động dịch vụ, toàn bộ các server dùng chung VIP sẽ gia nhập vào một nhóm multicast. Nhóm multicast này dùng để gởi/nhận các gói tin quảng bá VRRP. Các router/server sẽ quảng bá độ ưu tiên (priority) của mình, server với độ ưu tiên cao nhất sẽ được chọn làm MASTER. Một khi nhóm đã có 1 MASTER thì MASTER này sẽ chịu trách nhiệm gởi các gói tin quảng bá VRRP định kỳ cho nhóm multicast.

Nếu vì một sự cố gì đó mà các server BACKUP không nhận được các gói tin quảng bá từ MASTER trong một khoảng thời gian nhất định thì cả nhóm sẽ bầu ra một MASTER mới. MASTER mới này sẽ tiếp quản địa chỉ VIP của nhóm và gởi các gói tin ARP báo là nó đang giữ địa chỉ VIP này. Khi MASTER cũ hoạt động bình thường trở lại thì router này có thể lại trở thành MASTER hoặc trở thành BACKUP tùy theo cấu hình độ ưu tiên của các router.

Mô hình Lab Keepalived IP Failover

Trong mô hình lab của bài này, ta sẽ có 2 Nginx Web Server (bạn có thể đổi thành HAProxy tùy ý) phục vụ xử lý request HTTP Web cơ bản. Hai Nginx WEB1WEB2 này sẽ được cấu hình dùng chung một VIP là 10.12.166.80. Bình thường thì VIP này sẽ do node Master phụ trách, node Backup sẽ ở trạng thái chờ.

mô hình keepalived lab nginx 1Khi có sự cố xảy ra với node Master như die server hay dịch vụ die thì node Backup sẽ nhận lấy VIP này và chịu trách nhiệm xử lý tiếp nội dung dịch vụ đang chạy cụ thể ở bài lab này là Nginx Web Server.

mô hình keepalived nginx 2

1. Cài đặt chương trình Keepalived

Hiện tại chương trình Keepalived đã có trên các repository mặc định của CentOS nên bạn dễ dàng cài đặt với lệnh ‘yum‘. Điểm trừ duy nhất là phiên bản Keepalived trên các Repository thường không phải bản mới nhất. Bạn cần thực hiện cài đặt chương trình Keepalived trên cả 2 con WEB1WEB2, với các lệnh yum dưới đây sẽ cài đặt chương trình hỗ trợ và cả ‘Keepalived‘.

# yum groupinstall -y "Development Tools" 
# yum install -y gcc kernel-headers kernel-devel curl gcc openssl-devel libnl3-devel net-snmp-devel psmisc ipset-libs
# yum install -y keepalived

2. Cài đặt chương trình Web Server

Chúng ta sẽ thực hiện cài đặt chương trình Web Server Nginx (Hướng dẫn cài đặt Nginx trên CentOS) trên cả 2 server để test chức năng cơ bản của máy chủ web trên cả 2 Web Server sẽ được cấu hình. Gói chương trình “nginx” nằm ở EPEL Repository (Đọc thêm: Hướng dẫn cài đặt EPEL Repository trên CentOS).

# yum install -y epel-release 
# yum install -y nginx
# systemctl start nginx

Do nhu cầu chỉ là thực hiện lab test chức năng IP Failover với web server cơ bản, nên chúng ta không cần quan tâm đến việc tối ưu hoá cấu hình Nginx.

+ WEB1
Đối với máy chủ WEB1 chúng ta sẽ tạo 1 file .html ở thư mục web global của Nginx để truy cập test với nội dung cơ bản thể hiện được thông tin cho bạn biết là bạn đang truy cập máy chủ Web Server WEB1.

[root@web1]# rm -rf /usr/share/nginx/html/*
[root@web1]# vi /usr/share/nginx/html/index.html
<h1> BAN DANG TRUY CAP WEB1 - 10.12.166.81 </h1>

+ WEB2

[root@web2]# rm -rf /usr/share/nginx/html/*
[root@web2]# vi /usr/share/nginx/html/index.html
<h1> BAN DANG TRUY CAP WEB2 - 10.12.166.82 </h1>

keepalived web2

3. Cấu hình dịch vụ Keepalived

Cấu hình cho phép gắn địa chỉ IP ảo lên card mạng và IP Forward.

# echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p

Cú pháp cấu hình Keepalived cơ bản

global_defs {
   notification_email {
        admin@cuongquach.com
   }
   notification_email_from keepalived-web1@cuongquach.com
   smtp_server x.x.x.x
   smtp_connect_timeout 30

}

vrrp_script chk_haproxy {
        script "command"     
        interval <time>
        weight <n>
}

vrrp_instance string {
    state MASTER|BACKUP
    interface string
    mcast_src_ip @IP
    virtual_router_id num
    priority num
    advert_int num
    smtp_alert
    authentication {
        auth_type PASS|AH
        auth_pass string
    }
    virtual_ipaddress { # Block limited to 20 IP addresses
        @IP
        @IP
    }
    notify_master "/path_to_script/script_fault.sh <arg_list>"
    notify_backup "/path_to_script/script_fault.sh <arg_list>"
    notify_fault "/path_to_script/script_fault.sh <arg_list>"
}

Để cấu hình dịch vụ keepalived, ta cần phải chỉnh sửa file /etc/keepalived/keepalived.conf. Một số block cấu hình đáng chú ý trong file này như sau:

  • global_defs: cấu hình thông tin toàn cục (global) cho keepalived như gởi email thông báo tới đâu, tên của cluster đang cấu hình.
  • vrrp_script: chứa script, lệnh thực thi hoặc đường dẫn tới script kiểm tra dịch vụ (Ví dụ: nếu dịch vụ này down thì keepalived sẽ tự chuyển VIP sang 1 server khác).
  • vrrp_instance: thông tin chi tiết về 1 server vật lý trong nhóm dùng chung VRRP. Gồm các thông tin như interface dùng để liên lạc của server này, độ ưu tiên để, virtual IP tương ứng với interface, cách thức chứng thực, script kiểm tra dịch vụ….

Chú thích cấu hình block vrrp_instance
– Trong các phần giải thích dưới, router sẽ đồng nghĩa với máy chủ dịch vụ .

  • state (MASTER|BACKUP): chỉ trạng thái MASTER hoặc BACKUP được sử dụng bởi máy chủ. Nếu là MASTER thì máy chủ này có nhiệm vụ nhận và xử lý các gói tin từ host đi lên. Nếu con MASTER tèo, những con BACKUP này sẽ dựa vào 1 cơ chế bầu chọn và nhảy lên làm Master.
  • interface: chỉ định cổng mạng nào sẽ sử dụng cho hoạt động IP Failover – VRRP
  • mcast_src_ip: địa chỉ IP thực của card mạng Interface của máy chủ tham gia vào VRRP. Các gói tin trao đổi giữa các VRRP Router sử dụng địa chỉ thực này.
  • virtual_router_id: định danh cho các router (ở đây là máy chủ dịch vụ) thuộc cùng 1 nhóm VRRP. Hiểu nôm na là 1 router có thể tham gia nhiều nhóm VRRP (các nhóm hoạt động động lập nhau), và VRRP-ID là tên gọi của từng nhóm.
  • priority: chỉ định độ ưu tiên của VRRP router (tức độ ưu tiên máy chủ dịch vụ trong quá trình bầu chọn MASTER). Các VRRP Router trong cùng một VRRP Group tiến hành bầu chọn Master sử dụng giá trị priority đã cấu hình cho máy chủ đó. Priority có giá trị từ 0 đến 255. Nguyên tắc có bản: Priority cao nhất thì nó là Master, nếu priority bằng nhau thì IP cao hơn là Master.
  • advert_int: thời gian giữa các lần gởi gói tin VRRP advertisement (đơn vị giây).
  • smtp_alert: kích hoạt thông báo bằng email SMTP khi trạng thái MASTER có sự thay đổi.
  • authentication: chỉ định hình thức chứng thực trong VRRP. ‘auth_type‘, sử dụng hình thức mật khẩu plaintext hay mã hoá AH. ‘auth_pass‘, chuỗi mật khẩu chỉ chấp nhận 8 kí tự.
  • virtual_ipaddress: Địa chỉ IP ảo của nhóm VRRP đó (Chính là địa chỉ dùng làm gateway cho các host). Các gói tin trao đổi, làm việc với host đều sử dụng địa chỉ ảo này.
  • notify_master: chỉ định chạy shell script nếu có sự kiện thay đổi về trạng thái MASTER.
  • notify_backup: chỉ định chạy shell script nếu có sự kiện thay đổi về trạng thái BACKUP.
  • notify_fault: chỉ định chạy shell script nếu có sự kiện thay đổi về trạng thái thất bại (fault).

3.1 Cấu hình Keepalived trên WEB1 – MASTER

Giờ chúng ta sẽ cấu hình cho máy chủ WEB1 làm máy chủ MASTER trong mô hình Failover IP giữa 2 WEB Server. Tức máy chủ WEB1 sẽ là người xử lý các request HTTP đến thông qua Virtual IP ‘10.12.166.80‘ và khi mà máy chủ WEB1 chết thì máy chủ WEB2 sẽ tự động lên làm MASTER và đảm nhận xử lý IP Virtual. Ta sẽ cho độ ưu tiên ‘priority‘ là 100 và state là ‘MASTER‘. Có Virtual_router_id giống nhau ví dụ là 50 .

[root@web1]# vi /etc/keepalived/keepalived.conf

vrrp_script chk_nginx {
        script "killall -0 nginx"     
        interval 2
        weight 4
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    mcast_src_ip 10.12.166.81
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type AH
        auth_pass cuongquach
    }
    virtual_ipaddress {
        10.12.166.80
    }
    track_script 
    {
        chk_nginx
    }
}

3.2 Cấu hình Keepalived trên WEB2 – BACKUP

Ta sẽ cho độ ưu tiên ‘priority‘ là 98 và state là ‘BACKUP‘. Có Virtual_router_id giống nhau ví dụ là 50 .

[root@web2]# vi /etc/keepalived/keepalived.conf

vrrp_script chk_nginx {
        script "killall -0 nginx"     
        interval 2
        weight 4
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    mcast_src_ip 10.12.166.82
    virtual_router_id 50
    priority 98
    advert_int 1
    authentication {
        auth_type AH
        auth_pass cuongquach
    }
    virtual_ipaddress {
        10.12.166.80
    }
    track_script 
    {
        chk_nginx
    }
}

4. Khởi động Keepalived và cấu hình iptables

Bạn cần khởi động Keepalived trên cả 2 máy chủ dịch vụ WEB.

# systemctl start keepalived
# systemctl enable keepalived

Cấu hình firewall rule cho phép VRRP giao tiếp sử dụng dãi địa chỉ multicast 224.0.0.0/8 qua giao thức VRRP (112) trên card mạng mà chúng ta cấu hình Keepalived hoạt động. Nếu bạn sử dụng AH (51) khi cấu hình mật khẩu chứng thực 2 bên thì thêm rule cho giao thức AH nữa.

# iptables -I INPUT -i eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
# iptables -I INPUT -i eth0 -d 224.0.0.0/8 -p ah -j ACCEPT
# iptables -I OUTPUT -o eth0 -s 224.0.0.0/8 -p vrrp -j ACCEPT
# iptables -I OUTPUT -o eth0 -s 224.0.0.0/8 -p ah -j ACCEPT.
# service iptables save

5. Kiểm tra hoạt động Keepalived

Chúng ta sẽ kiểm tra xem trên server WEB1 đảm nhận vai trò MASTER đã nhận được IP ảo ‘10.12.166.80‘ hay chưa nhé. Trong trường hợp server MASTER down, thì địa chỉ ảo VIP 10.12.166.80 sẽ được tự động gán cho máy chủ WEB2 BACKUP lên làm MASTER.

[root@web1]# ip a sh eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:92:26:7b brd ff:ff:ff:ff:ff:ff
    inet 10.12.166.81/24 brd 10.12.166.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.12.166.80/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe92:267b/64 scope link
       valid_lft forever preferred_lft forever

Kiểm tra log hoạt động của dịch vụ Keepalived.

[root@web1]# tail -n100 /var/log/messages
Feb 19 15:35:48 localhost Keepalived_vrrp[15089]: VRRP_Instance(VI_1) removing protocol VIPs.
Feb 19 15:35:48 localhost Keepalived_vrrp[15089]: Using LinkWatch kernel netlink reflector...
Feb 19 15:35:48 localhost Keepalived_vrrp[15089]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
Feb 19 15:35:49 localhost Keepalived_vrrp[15089]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 19 15:35:50 localhost Keepalived_vrrp[15089]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 19 15:35:50 localhost Keepalived_vrrp[15089]: VRRP_Instance(VI_1) setting protocol VIPs.
Feb 19 15:35:50 localhost Keepalived_vrrp[15089]: Sending gratuitous ARP on eth0 for 10.12.166.80
Feb 19 15:35:50 localhost Keepalived_vrrp[15089]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 10.12.166.80
Feb 19 15:35:50 localhost Keepalived_vrrp[15089]: Sending gratuitous ARP on eth0 for 10.12.166.80
Feb 19 15:35:50 localhost Keepalived_vrrp[15089]: Sending gratuitous ARP on eth0 for

Truy cập địa chỉ Virtual IP 10.12.166.80 thì bạn sẽ thấy index html Nginx Web Server MASTER hiện tại là 10.12.166.81.

keepalived vip cấu hình 1

5.1 Kiểm tra trường hợp server MASTER die

Trường hợp WEB1 Nginx down nguyên server (bạn thử off server WEB1 để test), thì WEB2 sẽ kiểm tra VRRP thấy thất bại sẽ tự bầu chọn WEB2 lên làm MASTER máy chủ. Kiểm tra địa chỉ IP bên server WEB2.

[root@web2]# ip a sh eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:49:08:77 brd ff:ff:ff:ff:ff:ff
inet 10.12.166.82/24 brd 10.12.166.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.12.166.80/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe49:877/64 scope link
valid_lft forever preferred_lft forever

Truy cập địa chỉ 10.12.166.80 sẽ ra html nội dung WEB2.

keepalived web2 vip

5.2 Kiểm tra trường hợp web server Nginx MASTER die

Trường hợp dịch vụ Nginx chết trên server MASTER (server không chết) thì ở phần cấu hình Keepalived có cấu hình “vrrp_script – chk_nginx” dùng để kiểm tra Process ID của dịch vụ Nginx. Nếu dịch vụ Nginx chết thì Keepalived sẽ trừ trọng số priority đi 4 (theo cấu hình) lúc này 104 – 4 = 100 , độ ưu tiên của con MASTER WEB1 thấp hơn độ ưu tiên của WEB2 (100 + 2 = 102) nên VRRP tiến hành bầu chọn lại MASTER. Server WEB2 sẽ lên làm MASTERgiữ VIP, còn server WEB1 sẽ chuyển sang trạng thái BACKUP.

Chúng ta coi log trong cùng thời điểm trên 2 WEB Server khi dịch vụ Nginx trên Master dừng hoạt động.

+ WEB1

[root@web1]# systemctl stop nginx
[root@web1]# tail -n 10 /var/log/messages
Feb 19 22:59:48 web1 Keepalived_vrrp[26772]: VRRP_Script(chk_nginx) failed
Feb 19 22:59:48 web1 Keepalived_vrrp[26772]: VRRP_Instance(VI_1) Changing effective priority from 104 to 100
Feb 19 22:59:49 web1 Keepalived_vrrp[26772]: VRRP_Instance(VI_1) Received advert with higher priority 102, ours 100
Feb 19 22:59:49 web1 Keepalived_vrrp[26772]: VRRP_Instance(VI_1) IPSEC-AH : Syncing seq_num - Decrement seq
Feb 19 22:59:49 web1 Keepalived_vrrp[26772]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 19 22:59:49 web1 Keepalived_vrrp[26772]: VRRP_Instance(VI_1) removing protocol VIPs.

+ WEB2

[root@web2]# tail -n 10 /var/log/messages
Feb 19 22:59:50 web2 Keepalived_vrrp[8425]: VRRP_Instance(VI_1) forcing a new MASTER election
Feb 19 22:59:51 web2 Keepalived_vrrp[8425]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 19 22:59:52 web2 Keepalived_vrrp[8425]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 19 22:59:52 web2 Keepalived_vrrp[8425]: VRRP_Instance(VI_1) setting protocol VIPs.
Feb 19 22:59:52 web2 Keepalived_vrrp[8425]: Sending gratuitous ARP on eth0 for 10.12.166.80
Feb 19 22:59:52 web2 Keepalived_vrrp[8425]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 10.12.166.80

Sau đó nếu dịch vụ Nginx trên WEB1 hoạt động trở lại, thì trọng số priority trên WEB1 sẽ khôi phục lại như lúc ban đầu. Lúc này priority WEB1 (104) sẽ lớn hơn (102) của WEB2, nên hoạt động bầu chọn MASTER lại diễn ra. WEB1 sẽ khôi phục lại quyền làm MASTER và nắm giữa VIP. WEB2 sẽ quay về làm BACKUP.

6. Cấu hình Server không khôi phục quyền MASTER

Trong một số trường hợp, bạn không muốn server WEB1 vừa chết xong quay lại chiếm quyền làm MASTER trong giữa 2 máy chủ Keepalived.

Bạn sẽ lưu ý một số cấu hình sau, có thể tự mình trải nghiệm cấu hình :

  • STATE của các server đều là BACKUP.
  • Cấu hình thêm ‘nopreempt‘.
  • Các priority chênh nhau một ít.

+ Cấu hình Keepalved trên Web1

vrrp_script chk_nginx {
        script "killall -0 nginx"     
        interval 2
        weight 4
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    mcast_src_ip 10.12.166.81
    virtual_router_id 50
    priority 51
    advert_int 1
    nopreempt
    authentication {
        auth_type AH
        auth_pass cuongquach
    }
    virtual_ipaddress {
        10.12.166.90
    }
    track_script 
    {
        chk_nginx
    }
}

+ Cấu hình Keepalived trên Web2

vrrp_script chk_nginx {
        script "killall -0 nginx"     
        interval 2
        weight 4
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    mcast_src_ip 10.12.166.82
    virtual_router_id 50
    priority 50
    advert_int 1
    nopreempt
    authentication {
        auth_type AH
        auth_pass cuongquach
    }
    virtual_ipaddress {
        10.12.166.90
    }
    track_script 
    {
        chk_nginx
    }
}

Tổng kết

Vậy là bạn đã biết cách để thực hiện cấu hình Keepalived cho hoạt động IP Failover với Virtual IP nhằm đảm bảo tính sẵn sàng cao High Availability cho các dịch vụ trên Linux rồi phải không nào ! Bạn có thể áp dụng bài lab này với các dịch vụ khác như FTP, HAProxy, Squid,…

Nguồn: https://cuongquach.com

Previous articleEbook Site Reliability Engineering PDF – Download Free
Next articleEbook Lập Trình Hướng Đối Tượng C++ Phạm Văn Ất PDF
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !