Skip to main content

Hướng dẫn cài đặt, cấu hình Keepalived và HAproxy trên CentOS

12,October 2016
hướng dẫn cài đặt và cấu hình Keepalived và HAproxy

Hôm nay itlabvn.net sẽ hướng dẫn các bạn cách cài đặt và cấu hình chi tiết chương trình Keepalived và HAproxy trên CentOS 6. Keepalived và HAproxy là chương trình mã nguồn mở dùng để tăng khả năng chịu tải của hệ thống nhờ vào các thuật toán điều hướng các gói dữ liệu đi vào những server khác nhau

1. Khái niệm

+ Keepalived là gì : hiểu đơn giản keepalived là phần mền để tạo ra 1 VIP ( Virtual IP - IP ảo ). VIP này đại  diện cho 2 hay nhiều IP thật trên các máy chủ hay các thiết bị. Khi người dùng truy cập vào website hay các ứng dụng sử dụng VIP này. Keepalived sẽ sử dụng các thuật toán để ánh xạ VIP vào những IP thật của các máy chủ, thiết bị 

+ HAproxy là gì: HAproxy là phần mền cân bằng tải TCP/HTTP mã nguồn mở phổ biến hiện nay, HAproxy sử dụng các thuật toán để điều hướng các gói tin đi vào những server khác nhau để xử lý giúp hệ thống server không bị quá tải. HAproxy thường kết hợp với Keepalived để đem lại giải pháp cho hệ thống chịu tải cao.  

2. Mô hình

+ Bài lab được thực hiện trên Vmware. Có 2 máy ảo CentOS 6, mỗi máy có 1 card mạng đặt ở chế độ brigde ở dải mạng 192.168.1.x. Máy ảo CentOS1 có đị chỉ IP 192.168.1.128, máy ảo CentOS2 có địa chỉ IP 192.168.1.130

3. Cài đặt  và cấu hình

a. Cài đặt ( thực hiện cài đặt Keepalived và HAproxy, Apache trên cả hai server CentOS1 và CentOS2 )

yum -y install keepalived
yum -y install haproxy
yum -y install httpd  ( dùng để test failover cho dịch vụ httpd )

b. Cấu hình keepalived ( Failover trên CentOS1 & CentOS2 ) 

+  Thực hiện cấu hình keepalived trên CentOS1 - 192.168.1.128

+  vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   notification_email {
     admin@itlabvn.net
   }
   smtp_server 192.168.1.111
   smtp_connect_timeout 30
   router_id LVS_MASTER
}
vrrp_script chk_httpd {
        script "killall -0 httpd"       # verify the pid is exist or not
        interval 2                      # check every 2 seconds
        weight 2                        # add 2 points of prio if OK
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456  #password phải giống nhau trên cả 2 server
    }
    virtual_ipaddress {
        192.168.1.10
    }
    track_script {
        chk_httpd
    }
}

Cấu hình keepalived trên CentOS2 - 192.168.1.130

+  vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   notification_email {
     admin@itlabvn.net
   }
   smtp_server 192.168.1.111
   smtp_connect_timeout 30
   router_id LVS_BACKUP
}
vrrp_script chk_httpd {
        script "killall -0 httpd"       # verify the pid is exist or not
        interval 2                      # check every 2 seconds
        weight 2                        # add 2 points of prio if OK
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456   #password phải giống nhau trên cả 2 server
    }
    virtual_ipaddress {
        192.168.1.10
    }
    track_script {
        chk_httpd
    }
}

+ Enable iptable rule trên Master & Slave server

iptables -I INPUT -p vrrp -j ACCEPT

+ Khởi động lại dịch vụ

service keepalived restart && chkconfig keepalived on
service httpd restart && chkconfig httpd on 

+ Giải thích: Như trong file cấu hình keepalived  của 2 server sẽ tạo ra 1 địa chỉ ảo VIP 192.168.1.10. CentOS1 sẽ ở trạng thái MASTER ( giữ VIP điều này có nghĩa toàn bộ request từ người dùng tới địa chỉ VIP sẽ được CentOS1 xử lý và phản hồi lại người dùng ), CentOS2 sẽ ở trạng thái BACKUP. Trong file cấu hình Keepalived trên CentOS1, CentOS2 đều có track_script (nghĩa là cả 2 server sẽ check process ID (PID) của chương trình apache (httpd), nếu dịch vụ httpd trên CentOS1 ( Keepalived Master ) bị chết. Keepalived sẽ trừ trọng số (priority 100 - 2 =98) trên CentOS1. Trọng số này nhỏ hơn trọng số trên file cấu hình Keepalived của CentOS2 (99). Do đó Keepalived sẽ chuyển trạng thái của CentOS1 từ Master sang Backup và trạng thái của CentOS2 từ Backup sang Master ( giữ VIP) . Lúc này toàn bộ yêu cầu của người dùng tới địa chỉ VIP sẽ được CentOS2 xử lý và phản hồi tới người dùng. Keepalived sẽ tiếp tục check 2s 1 lần. Nếu dịch vụ httpd trên CentOS1 khởi động lại, priorty của CentOS1 sẽ là 100 lớn hơn priority của CentOS2 priroty 99. Keepalived sẽ chuyển trạng thái của CentOS1 sang Master và CentOS2 sang Backup

+  Kiểm tra

+ Thực hiện trên CentOS1 - 192.168.1.128

 tail /var/log/messages -n 100

Oct 13 22:58:42 CentOS1 Keepalived_vrrp[2058]: VRRP_Instance(VI_1) Transition to MASTER STATE
Oct 13 22:58:42 CentOS1 Keepalived_vrrp[2058]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election
Oct 13 22:58:43 CentOS1 Keepalived_vrrp[2058]: VRRP_Instance(VI_1) Entering MASTER STATE
Oct 13 22:58:43 CentOS1 Keepalived_vrrp[2058]: VRRP_Instance(VI_1) setting protocol VIPs.
Oct 13 22:58:43 CentOS1 Keepalived_vrrp[2058]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.10
Oct 13 22:58:48 CentOS1 Keepalived_vrrp[2058]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.10

 [root@CentOS1 ~]# ip addr sh

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:2e:57:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.128/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.10/32 scope global eth0  #this is VIP and CentOS1 kept it 
inet6 fe80::250:56ff:fe2e:5700/64 scope link
   valid_lft forever preferred_lft forever

+ Thực hiện trên CentOS2 - 192.168.1.130

+  tail /var/log/messages -n 100

Oct 14 00:57:29 CentOS2 Keepalived_vrrp[2627]: VRRP_Instance(VI_1) Received higher prio advert
Oct 14 00:57:29 CentOS2 Keepalived_vrrp[2627]: VRRP_Instance(VI_1) Entering BACKUP STATE
Oct 14 00:57:29 CentOS2 Keepalived_vrrp[2627]: VRRP_Instance(VI_1) removing protocol VIPs.

 [root@CentOS2 ~]# ip addr sh

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:b7:a0:97 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.130/24 brd 192.168.1.255 scope global eth0
inet6 fe80::20c:29ff:feb7:a097/64 scope link
   valid_lft forever preferred_lft forever

+ Bây giờ chúng ta sẽ test failover của hệ thống . Chúng ta sẽ tắt dịch vụ httpd trên CentOS1 , lúc này track script "chk_httpd" trên keepalived sẽ kiểm tra xem process ID của apache có tồn tại hay không và nhận thấy trên CentOS1 không tồn tại process ID của dịch vụ apache. Lúc này trên CentOS1, keepalived sẽ trừ priority từ 100 - 2 = 98 ( weight ) và nhận thấy priority trên CentOS2 (99) lơn hơn nên keepalived sẽ chuyển từ chế độ Master sang Backup và trên CentOS2 sẽ chuyển từ chế độ Backup sang Master và giữ giữ VIP. Chúng ta check bằng câu lệnh sau

+ Trên CentOS1 - 192.168.1.128

+  #service httpd stop  

+  tail /var/log/messages -n 100

Oct 14 22:16:03 CentOS1 dhclient[1117]: bound to 192.168.1.128 -- renewal in 786 seconds.
Oct 14 22:28:49 CentOS1 Keepalived_vrrp[1856]: VRRP_Script(chk_httpd) failed
Oct 14 22:28:51 CentOS1 Keepalived_vrrp[1856]: VRRP_Instance(VI_1) Received higher prio advert
Oct 14 22:28:51 CentOS1 Keepalived_vrrp[1856]: VRRP_Instance(VI_1) Entering BACKUP STATE
Oct 14 22:28:51 CentOS1 Keepalived_vrrp[1856]: VRRP_Instance(VI_1) removing protocol VIPs.
Oct 14 22:28:51 CentOS1 Keepalived_healthcheckers[1855]: Netlink reflector reports IP 192.168.1.10 removed

+ Trên CentOS2 - 192.168.1.130

+  tail /var/log/messages -n 100

Oct 14 22:17:51 CentOS2 dhclient[1215]: bound to 192.168.1.129 -- renewal in 717 seconds.
Oct 14 22:28:51 CentOS2 Keepalived_vrrp[1958]: VRRP_Instance(VI_1) forcing a new MASTER election
Oct 14 22:28:51 CentOS2 Keepalived_vrrp[1958]: VRRP_Instance(VI_1) forcing a new MASTER election
Oct 14 22:28:52 CentOS2 Keepalived_vrrp[1958]: VRRP_Instance(VI_1) Transition to MASTER STATE
Oct 14 22:28:53 CentOS2 Keepalived_vrrp[1958]: VRRP_Instance(VI_1) Entering MASTER STATE
Oct 14 22:28:53 CentOS2 Keepalived_vrrp[1958]: VRRP_Instance(VI_1) setting protocol VIPs.
Oct 14 22:28:53 CentOS2 Keepalived_vrrp[1958]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.10
Oct 14 22:28:53 CentOS2 Keepalived_healthcheckers[1957]: Netlink reflector reports IP 192.168.1.10 added
Oct 14 22:28:58 CentOS2 Keepalived_vrrp[1958]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.10

+ Sau khi dịch vụ apache (httpd) trên CentOS1 chạy trở lại , keepalived sử dụng script check chk_httpd kiểm tra thấy processID và không trừ priority weight trên CentOS1 (100), Lúc này priority weight của CentOS1 lơn hơn priority weight của CentOS2 ( 99 ). Keepalived sẽ chuyển từ BACKUP state sang MASTER trên CentOS1 và từ MASTER sang BACKUP state trên CentOS2

+ Đến đây chúng ta đã kết thúc cấu hình keepalived ( failover ) cho hệ thống. Phần tiếp theo itlabvn.net sẽ hướng dẫn các bạn cách cấu hình HAproxy ( Loadbalancer ) kết hợp với chương trình Keepalived dể tạo ra hệ thống vừa có khả năng chống lỗi vừa chịu tải cao 

c. Cấu hình HAproxy ( Loadbalancer ) thực hiện trên CentOS1 và CentOS2

+ vim /etc/haproxy/haproxy.cfg  (CentOS1 & CentOS2)

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80
    default_backend             app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
    balance     roundrobin
    server      static 192.168.1.10:80 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    server  app1 192.168.1.128:8080 check  //weight 2 => app1 received 2 req -> app2 1 req
    server  app2 192.168.1.130:8080 check  //weight 1 => app2 = 50% app1


+ Cấu hình apache listen trên port 8080 trên 2 server CentOS1 & CentOS2 

+ vim /etc/httpd/conf/httpd.conf

Listen 8080  #change default listen port từ 80 thành 8080

+ Tạo file index.html trên 2 web server CentOS1 & CentOS2 để check loadbalancer 

+ vim /var/www/html/index.html ( Trên CentOS1 - 192.168.1.128 )

CentOS1 - 192.168.1.128

+ vim /var/www/html/index.html ( Trên CentOS2 - 192.168.1.130 )   

CentOS2 - 192.168.1.130

+ Khởi động lại dịch vụ Apache & HAproxy & Keepalived trên cả 2 server CentOS1, CentOS2

chkconfig httpd on && service httpd restart
chkconfig haproxy on && service httpd restart 
chkconfig keepalived on && service keepalived restart 

+ Kiểm tra 

+ Truy cập địa chỉ VIP bằng trình duyệt web http://192.168.1.10 và làm mới trình duyệt web. HAproxy sẽ sử dụng thuật toán roundrobin thực hiện chia đều tải cho cả 2 server CentOS1 & CentOS2 

cấu hình keepalived và haproxy trên CentOS 6

cấu hình keepalived và haproxy trên CentOS 6

+ Tiếp theo chúng ta kiểm tra khả năng chịu lỗi ( failover ) của hệ thống. Thực hiện tắt dịch vụ apache ( httpd ) trên CentOS1 bằng câu lệnh " Service httpd stop " . Sau đó các bạn truy cập bằng trình duyệt web http://192.168.1.10 và làm mới trình duyệt web bạn sẽ thấy chỉ server CentOS2 - 192.168.1.130 xử lý yêu cầu từ người dùng do trên CentOS1 đã tắt dịch vụ apache ( httpd )

cấu hình keepalived và haproxy trên CentOS 6

+ Đến đây chúng ta đã hoàn thành xong bài lab cấu hình dịch vụ Keepalived và HAproxy trên CentOS 6. Các bạn có thể đặt câu hỏi trong phần bình luận, itlabvn.net sẽ giải đáp thắc mắc của các bạn

4. Video hướng dẫn