Cài đặt Keepalived và load-balancer cho Web Server

Cài đặt Keepalived và load-balancer cho Web Server

1. Giới thiệu

Cân bằng tải là một phương pháp phân phối khối lượng truy cập trên nhiều máy chủ nhằm tối ưu hóa tài nguyên hiện có đồng thời tối đa hóa thông lượng, giảm thời gian đáp ứng và tránh tình trạng quá tải cho một máy chủ.

Chú ý: Bài viết hướng dẫn Load-balancing cho Web Server với 2 load-balancer là nginx (sử dụng module có sẵn ngx_http_upstream_module) và HAProxy. Hãy chọn 1 trong 2 load-balancer để cấu hình cho server của bạn, không cài đặt 2 cùng lúc để tránh gây xung đột trong hệ thống. Xin cảm ơn!

Mô hình cài đặt

Thông tin chung:

OS: CentOS 6
NIC: eth0
Web server: LAMP hoặc LEMP server
Load-balancer: nginx hoặc HAProxy

Thông tin riêng:

lb1: 192.168.100.191
lb2: 192.168.100.192
Virtual IP: 192.168.100.123
WEB1: 192.168.100.196
WEB2: 192.168.100.198
GATEWAY: 192.168.100.1
NETWORK: 192.168.100.0/24

2. Cài đặt Keepalived để tạo Virtual IP

Trên Loadbalance1 (lb1) và Loadbalance2 (lb2), chúng ta cài đặt Keepalived để tạo một Virtual IP

yum install -y keepalived

Trên lb1, chúng ta cấu hình cho nó mode active (master):

vi /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy      # Requires keepalived-1.1.13
    script "killall -0 haproxy"   # cheaper than pidof
    interval 2           # check every 2 seconds
    weight 2            # add 2 points of prio if OK


vrrp_instance VI_1 
    interface eth0
    state MASTER
    virtual_router_id 51
    priority 101  # 101 on master, 100 on backup
    virtual_ipaddress 
      192.168.100.123
    
    track_script 
      chk_haproxy
    

  • priority 101: Chúng ta set lb1 làm master

Quan trọng: Cấu hình chia sẻ Virtual IP (Làm cả trên lb1 và lb2):

Thêm vào file sysctl.conf

echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf

Chạy lệnh để hệ thống nhận file cấu hình và kiểm tra lại xem đã có dòng vừa thêm chưa:

sysctl -p

Sau đó khởi động keepalived ở lb1

/etc/init.d/keepalived start
chkconfig keepalived on

Xem lại thông tin bằng lệnh:

ip addr sh eth0

Kết quả, chúng ta thấy một địa chỉ Virtual IP đã được tạo.

lb1:~# ip addr sh eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
  link/ether 00:0c:29:63:f7:5c brd ff:ff:ff:ff:ff:ff
  inet 192.168.100.191/24 brd 192.168.100.255 scope global eth0
  inet 192.168.100.123/32 scope global eth0
  inet6 fe80::20c:29ff:fe63:f75c/64 scope link
    valid_lft forever preferred_lft forever

Tương tự ở lb2, chúng ta mở fie cấu hình

vi /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy      # Requires keepalived-1.1.13
    script "killall -0 haproxy"   # cheaper than pidof
    interval 2           # check every 2 seconds
    weight 2            # add 2 points of prio if OK


vrrp_instance VI_1 
    interface eth0
    state MASTER
    virtual_router_id 51
    priority 100  # 101 on master, 100 on backup
    virtual_ipaddress 
      192.168.100.123
    
    track_script 
      chk_haproxy
    

  • priority 100: Chúng ta set lb2 làm backup

Sau đó cũng khởi động keepalived ở lb2

/etc/init.d/keepalived start
chkconfig keepalived on

Xem lại thông tin bằng lệnh:

ip addr sh eth0

Không giống như ở lb1, là chúng ta sẽ thấy Virtual IP ở phần thông tin. Chỉ khi nào lb1 ngưng hoạt động, chúng ta mới có thể thấy Virtual IP.

lb2:~# ip addr sh eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
  link/ether 00:0c:29:be:7b:3b brd ff:ff:ff:ff:ff:ff
  inet 192.168.100.192/24 brd 192.168.100.255 scope global eth0
  inet6 fe80::20c:29ff:febe:7b3b/64 scope link
    valid_lft forever preferred_lft forever

3. Cài đặt Load-balancer

Chọn 1 trong 2 module bên dưới để làm load-balancer

  • [NGINX – ngx_http_upstream_module] (#3.1)
  • [HAProxy] (#3.2)

3.1 Cài đặt nginx làm load-balancer

Ở trên lb1 và lb2, chúng ta cài thêm nginx để làm load-balancer.

Để cài đặt nginx, chúng ta phải cài gói epel-release trước.

yum install -y epel-release
yum install nginx -y

Sau khi cài đặt xong, chúng ta thêm vào file cấu hình của nginx tại lb1lb2

vi /etc/nginx/nginx.conf

Trong phần http của file cấu hình, chúng ta xóa hết những dòng mặc định và thêm

http 
   upstream backend 
		
    server 192.168.100.196 max_fails=3 fail_timeout=30s;
    server 192.168.100.198 max_fails=3 fail_timeout=30s;
  

  server 
    listen 80;
    location / 
      proxy_pass http://backend;
    
  

  • backend: chỉ là tên của upstream

Khởi động nginx và cho nó khởi động cùng với hệ thống:

service nginx start
chkconfig nginx on

Như vậy chúng ta đã cài đặt xong load-balancer bằng nginx. Ngoài ra, các bạn cũng có thể tham khảo thêm cách load-balancer bằng HAProxy theo hướng dẫn bên dưới.

3.2 Cài đặt HAProxy

Chúng ta cài đặt HAProxy ở trên cả 2 máy lb1 và lb2 như sau:

yum install -y haproxy

Sửa file cấu hình của HAProxy (Làm trên cả 2 máy lb1 và lb2)

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg_orig
cat /dev/null > /etc/haproxy/haproxy.cfg
vi /etc/haproxy/haproxy.cfg
global
    log 127.0.0.1  local0
    log 127.0.0.1  local1 notice
    #log loghost  local0 info
    maxconn 4096
    #debug
    #quiet
    user haproxy
    group haproxy

defaults
    log   global
    mode  http
    option httplog
    option dontlognull
    retries 3
    redispatch
    maxconn 2000
    timeout connect 5000
    timeout client 10000
    timeout server 10000
		
listen webfarm 192.168.100.123:80 # Lắng nghe IP ảo
    mode http
    stats enable
    stats auth admin:1
    balance roundrobin
    cookie JSESSIONID prefix
    option httpclose
    option forwardfor
    #option httpchk HEAD /check.txt HTTP/1.0
    server srv1 192.168.100.196:80 cookie A check
    server srv2 192.168.100.198:80 cookie B check

  • stats enable: Bật tính năng Webmin của HAProxy, truy cập vào: http://192.168.100.123/haproxy?stats
  • admin:1: là User và Password để đăng nhập vào webmin của HAProxy

Bật HAProxy và chạy cùng hệ thống khi khởi động:

service haproxy start
chkconfig haproxy on

4. Tham khảo:

  • Cài đặt keepalived và HAProxy: https://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-keepalived-on-debian-lenny-p2
  • nginx load-balancing: http://nginx.org/en/docs/http/load_balancing.html