Chuyện của sys

DevOps Blog

Cấu hình Load Balancing và Reverse Proxy sử dụng HAproxy và keepalived cho Web Server trên CentOS 6 June 29, 2015

Giới thiệu:
HAproxy là phần mềm cân bằng tải TCP/HTTP và là giải pháp reverse proxy mã nguồn mở phổ biến, thường được sử dụng kết hợp với keepalived đem lại 1 giải pháp high availability hữu hiệu với giá thành thấp hơn so với việc sử dụng các giải pháp cân bằng tải khác (dựa trên phần cứng).
Bài viết sẽ cung cấp 1 số các khái niệm có liên quan đến proxy, reverse proxy, các thuật toán cân bằng tải cho bộ cân bằng tải, HAproxy và các khái niệm liên quan, keepalived… Bài viết còn trình bày thêm hướng dẫn cấu hình giải pháp high availability cho hệ thống sử dụng HAproxy kết hợp keepalived trên CentOS 6
Các khái niệm:

  • Proxy

Proxy là 1 internet server làm nhiệm vụ chuyển tiếp, kiểm soát thông tin giữa client và server, proxy có 1 địa chỉ IP và 1 port cố định. Cách thức hoạt động: tất cả các yêu cầu từ client gửi đến server trước hết phải thông qua proxy, proxy kiếm tra xem yêu cầu nếu được phép sẽ gửi đến server và cũng tương tự cho server.
– Forward proxy: Là khái niệm proxy chúng ta dùng hàng ngày, nó là thiết bị đứng giữa 1 client và tất cả các server mà client đó muốn truy cập vào.
– Reverse proxy: là 1 proxy ngược, nó đứng giữa 1 server và tất cả các client và server mà server đó phục vụ, tương tự 1 nhà ga kiêm 1 trạm kiểm soát, các yêu cầu từ client gửi lên server bắt buộc phải ghé vào reverse proxy, tại đây yêu cầu sẽ được kiếm soát, lọc bỏ, và luân chuyển đến server. Ưu điểm của nó là khả năng quản lý tập trung, giúp chúng ta có thể kiếm soát mọi yêu cầu do client gửi lên server mà chúng ta cần bảo vệ.

  • Các kỹ thuật cân bằng tải

Các phần mềm cân bằng tải thường được cài đặt như 1 proxy, các kỹ thuật cần phải chú trọng đó là: kiểm tra trạng thái server (health checks), lựa chọn server tốt nhất để gửi yêu cầu và kỹ thuật duy trì kết nối của người dùng.
– Kiểm tra trạng thái server: có thể kiếm tra server bằng lệnh ping hoặc 1 phương pháp nào khác
– Lựa chọn server tốt nhất dựa trên các thuật toán cân bằng tải ( RR,…)
– Kỹ thuật Session Persistence: duy trì kết nối cho yêu cầu của người dùng trong suốt phiên làm việc, tất cả các yêu cầu của người dùng cần phải chuyển đến cùng 1 server, nếu server chết hoặc ngừng để bào trì , cần có cơ chế để chuyển session qua 1 server khác, cookie là phương pháp được sử dụng.

  • Các thuật toán cân bằng tải

– Thuật toán Round Robin (RR): phương pháp chia tải xoay vòng, hoạt động tốt với các server có khả năng xử lý tương tự nhau, điểm yếu của nó là 2 yêu cầu liên tục từ phía 1 người dùng có thể sẽ được gửi vào 2 server khác nhau, nên thường được cài đặt cùng với phương pháp duy trì session như sử dụng cookie.
– Thuật toán Weighted Round Robin (Ratio): tương tự như RR nhưng có quan tâm đến khả năng xử lý của các server, trong 1 chu kỳ 1 server có khả năng xử lý gấp đôi server khác sẽ nhận được gấp đôi số yêu cầu từ phía bộ cân bằng tải.
– Thuật toán Least Connections (LC): yêu cầu từ phía client sẽ được chuyển vào server có ít kết nối nhất trong hệ thống vào thời điểm đó.
Ngoài ra còn nhiều thuật toán khác được sử dụng.

  • HAproxy và các khái niệm liên quan

Haproxy là ứng dụng chạy độc lập, tất cả những gì người dùng cần phải làm là cài đặt HAproxy lên 1 máy server và thiết lập file cấu hình, trong đó ghi rõ địa chỉ cài đặt HAproxy và địa chỉ của các máy server. Mỗi server sẽ được cài đặt các thông số khác nhau về địa chỉ, cookie, trọng số… File cấu hình này cũng thiết lập các thông số về timeout của session, số lượng kết nối lớn nhất, cookie, thuật toán căn bằng tải, ACLs…

Các thuật ngữ cần quan tâm:
– ACL ( Access control list): Dùng để test 1 số điều kiện và thực hiện 1 hành động như lựa chọn máy chủ hoặc khóa 1 yêu cầu dựa trên kết quả kiếm tra. Dùng ACLs cho phép chuyển hướng lưu lượng mạng 1 cách linh động dựa trên nhiều tác nhân giống như pattern-matching và 1 số kết nối đến backend.
Ví dụ: acl url_static path_beg -i /static /images /javascript /stylesheets
Những url có đường dẫn bắt đầu bằng /static /images sẽ được gán cho url_static
– Backend : là tập hợp các server mà nhận các yêu cầu được chuyển hướng. Được định nghĩa trong phần backend trong file cấu hình với thông tin cơ bản như sau: thuật toán cân băng tải sử dụng và danh sách các máy chủ và port.
Một backend có thể chứa 1 hoặc nhiều máy chủ ở trong nó.
– Frontend: định nghĩa cách thức các yêu cầu sẽ được chuyển hướng đến backend, được định nghĩa trong phần frontend trong file cấu hình, định nghĩa bao gồm các thành phần: tập hợp các địa chỉ ip và cổng, ACLs, các quy tắc sử dụng backend (định nghĩa backend nào được sử dụng phụ thuộc vào điều kiện ACLs có khớp hay không hoặc 1 quy tắc default_backend để xử lý các trường hợp còn lại.
Ví dụ:
frontend main *:80 # toàn bộ ip port 80
acl url_static path_beg -i /static /images /javascript /stylesheets   # đường dẫn bắt đầu bằng
acl url_static path_end -i .jpg .gif .png .css .js     # đường dẫn kế thúc bằng
use_backend static if url_static # sẽ sử dụng backend static nếu như match ACL
default_backend app   # mặc định sẽ sử dụng backend defualt là app.

  • keepalived

là 1 phần mềm định tuyến được viết bằng C, cung cấp 1 công cụ đơn giản và mạnh mẽ cho việc cần bằng tải và HA cho hệ thống. Nói đơn giản hơn là keepalived dùng để cung cấp IP Failover cho 1 cluster. Cho phép 2 bộ cân bằng tải cài đặt cùng với nó hoạt động theo cơ chế active/backup.

Mô hình
topo
Trong đó:
GW1: server CentOS 6, đóng vai trò là Master
GW2: server CentOS6, đóng vai trò là Backup
APP1: server Ubuntu 14.04, chạy Apache
APP2: server Ubuntu 14.04, chạy Apache
(trong bài viết này không đề cập tới việc cài đặt và cấu hình Apache Web Server)
Card eth0 nối với public network, card th1 nối với private network
HAproxy được cài đặt trên cả 2 server GW1 và GW2, listen trên ip 192.168.1.200, đóng vai trò là reverse proxy.
ip 192.168.1.200: ip ảo được tạo ra từ GW1 và GW2 thông qua keepalived
IP list:

192.168.1.128 gw1
192.168.1.130 gw2
172.16.1.132 app1
172.16.1.133 app2
192.168.1.200 vip
Cài đặt haproxy và keepalived trên cả 2 server GW1 và GW2 bằng lệnh yum
yum -y install haproxy keepalived
Cấu hình keepalived
! Configuration File for keepalived
/etc/keepalived/keepalived.conf
#————————————————————————–#
# Global define để xác nhận thông tin notic qua email                      #
# ————————————————————————-#
global_defs {
   notification_email {
   }
   notification_email_from [email protected]
   smtp_server localhost
   smtp_connect_timeout 30
}
#————————————————————————–#
# Define Script để kiểm tra process haproxy                                #
# ————————————————————————-#
vrrp_script chk_haproxy {
  script “killall -0 haproxy” # check the haproxy process
  interval 200 # every 2 seconds
  weight 2 # add 2 points if OK
}
#————————————————————————–#
# VRRP                                                                     #
# ————————————————————————-#
vrrp_instance VI_1 {
    state MASTER            # MASTER ở gw1 , BACKUP ở gw2
    interface eth0          # interface để tạo ip ảo
    virtual_router_id 51
    priority 101            # độ ưu tiên, ở MASTER 101, ở BACKUP 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200       # ip ảo
    }
    track_script {
        chk_haproxy         # chạy script
    }

}

Khởi động keepalived:
service keepalived start
Sau đó kiểm tra hoạt động của keeaplived trên 2 server GW1 và GW2 (*)
Cấu hình haproxy
#———————————————————————
# 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#———————————————————————
# common defaults that all the ‘listen’ and ‘backend’ sections will
# use if not designated in their block
#———————————————————————
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    # Number of maximum connections#———————————————————————
# main frontend which proxys to the backends
#———————————————————————
frontend  main *:80
acl url_static       path_beg       -i /static /images /javascript /stylesheets
acl url_static       path_end       -i .jpg .gif .png .css .js#    use_backend static          if url_static
default_backend             app#———————————————————————
# static backend for serving up images, stylesheets and such
#———————————————————————
backend static
balance     roundrobin
server      static 127.0.0.1:4331 check
#———————————————————————
# round robin balancing between the various backends
#———————————————————————
backend app
balance     roundrobin       # sử dụng thuật toán RR
cookie webpool prefix        # sử dụng cookie rewrite
server  app1 172.16.1.132:80 cookie webpool-app1 check
server  app2 172.16.1.133:80 cookie webpool-app2 check
listen stats 192.168.1.200:1991   # lắng nghe qua ip ảo
stats uri /haproxy            # Link truy cập xem status của haproxy
stats enable                  # truy cập qua web
stats auth root:123456        # user và password đăng nhập
Cho haproxy và keepalived khởi động cùng hệ thống
chkconfig haproxy on
chkconfig keepalived on
service haproxy start
Như vậy bạn đã thực hiện xong phần cài đặt và cấu hình haproxy cho hệ thống, sau đó bạn tiến hành các bước kiểm tra và bắt đầu sử dụng hệ thống của bạn.
Link tham khảo:
http://www.haproxy.org/download/1.4/doc/configuration.txt
https://aaronwalrath.wordpress.com/2011/06/28/configure-haproxy-and-keepalived-for-load-balancing-and-reverse-proxy-on-red-hatscientificcentos-linux-56/
Categories: Cũ hơn

Leave a Reply

Your email address will not be published. Required fields are marked *