Posts Tagged ‘KeepAlived’

Load balancing Haproxy + KeepAlived for Nginx web server

Trong mô hình này

  • Phần Frontend, chúng ta sẽ sử dụng 02 server HAProxy + KeepAlived làm cân bằng tải (LB) cho các web server phần backend. Tại sao lại 02 server? 01 server HAProxy có thể được sử dụng làm LB cho các server Backend. Nhưng bản thân 01 server HAProxy không đảm bảo tính High availability (HA) của hệ thống, nếu nó down thì cả hệ thống down. Vì vậy, chúng ta sẽ sử dụng ít nhất 02 server HAProxy. Trên 02 server này, chúng ta cài KeepAlived để tạo ra một địa chỉ IP ảo – Virtual IP (VIP), mà client sẽ truy cập web qua địa chỉ IP này.
  • Phần Backend, chúng sẽ có thể sử dụng các web server như Apache, Nginx, … Trong trường hợp này, tôi sử dụng Nginx – một phần mềm web server rất phổ biến hiện nay.

I. Cài đặt và cấu hình KeepAlived để tạo VIP

Chúng ta sẽ cài đặt và cấu hình KeepAlived để tạo địa chỉ IP ảo (VIP) là 192.168.10.153

Step1: Installing KeepAlived trên cả 2 server

yum -y install keepalived

Step2: Cấu hình trên server 01 (Master server) – 192.168.10.151/24

Tạo tệp /etc/keepalived/keepalived.conf với nội dung sau:

! Configuration File for keepalived
global_defs {
   notification_email {
     dungnv@example.local
   }
   smtp_server mail.example.local
   notification_email_from info@example.local
   smtp_connect_timeout 30
   ! router_id LVS_MASTER
}
vrrp_script chk_haproxy {
        script "/usr/bin/killall -0 haproxy"    # 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  #Setting network interface for configuration
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass KeepWalking  #same for all machines
    }
    virtual_ipaddress {
        192.168.10.153
    }
    track_script {
        chk_haproxy
    }
}

Trong phần cấu hình global, thay đổi thông tin email mà cho phép gửi thông báo về sự kiện về thay đổi master server. Trong phần cấu hình mail này, không có phần thiết lập xác thực để gửi mail. Vì vậy, chúng ta cần tạo email trên mail server mà bỏ qua bước xác thực để có thể gửi mail.

Phần vrrp_script, chúng ta định nghĩa  một vrrp_script với tên chk_haproxy để track quá trình định tuyến để tạo VIP. Ở đây, chúng ta sẽ check dựa trên pid của daemon haproxy, nó sẽ check mỗi 2 giây (interval 2), và tăng trọng số lên 2 (weight 2) nếu pid haproxy tồn tại (chú ý ta chỉ tăng 1 lần)

Phần vrrp_instance, chúng ta định nghĩa và cấu hình cho phần giao diện mạng. Tùy thuộc cấu hình server mà chọn giao diện mạng phù hợp để cho phép giao tiếp với bên ngoài và tương tác với backup server. Ở đây, tôi sử dụng giao diện eth0, thiết lập trọng số có priority là 100, nó sẽ tăng thêm 2 khi kiểm tra ở phần vrrp_script tồn tại pid cho haproxy. Dựa vào giá trị priority này để xác định state là MASTER hay BACKUP. Server nào có priority cao hơn, server đó là MASTER và ngược lại. Cuối cùng thông tin VIP là 192.168.10.153

Step3: Cấu hình trên server 02 (Backup server)-192.168.10.152/24

Soạn thảo tệp tin /etc/keepalived/keepalived.conf với nội dung sau

! Configuration File for keepalived
global_defs {
   notification_email {
     dungnv@example.local
   }
   smtp_server mail.example.local
   notification_email_from info@example.local
   smtp_connect_timeout 30
   ! router_id LVS_MASTER
}
vrrp_script chk_haproxy {
        script "/usr/bin/killall -0 haproxy"    # 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 KeepWalking  #same for all machines
    }
    virtual_ipaddress {
        192.168.10.153
    }
    track_script {
        chk_haproxy
    }
}

Thông tin cấu hình keepalived.conf giống ở master server, chỉ khác ở thiết lập giá trị priority là 99 và tùy thuộc vào phần giao diện mạng lựa chọn.

Step4: Kiểm tra hoạt động của VIP

Sau khi đã cấu hình xong haproxy, chúng ta start haproxy và kiểm tra thông tin VIP

systemctl start keepalived

Chúng ta thực hiện lệnh sau để kiểm tra hoạt động của địa chỉ VIP trên các server.

ip address
link/ether 08:00:27:72:5b:b6 brd ff:ff:ff:ff:ff:ff inet 192.168.10.151/24 brd 192.168.1.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.10.153/32 scope global eth0 valid_lft forever preferred_lft forever

Khi đó, chúng ta thấy địa chỉ IP 192.168.10.153/32 được sinh ra trên server01.

Hoặc sử dụng một trong các lệnh dưới đây để show ip

nmcli
ip addr show eth0 #ip address list

Note:

  • Trên CentOS 7 mặc định chưa có lệnh killall hoặc sử dụng lệnh **pkill**. Cài đặt psmisc
yum install psmisc
  • Add firewall rules để cho phép truyền thông VRRP
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 \
--in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 \
--out-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload

II. Cài đặt và cấu hình HAProxy làm Load Balancing

Trong phần này, chúng ta sẽ cấu hình cân bằng tải cho site “example.local”, listen với port 80, cho các web server có địa chỉ 192.168.10.155 và 192.168.10.156 với cổng là 80.

Step1: Cài đặt HAProxy trên cả 2 máy HAproxy (master + backup)

yum install haproxy

Step2: Cấu hình HAProxy trên Master

Thực hiện chỉnh sửa hoặc tạo tệp tin /etc/haproxy/haproxy.cfg trên Master HAProxy với nội dung sau:

# Global settings
global
        pidfile     /var/run/haproxy.pid
        maxconn 100000
        user haproxy
        group haproxy
        daemon
        quite
        stats socket /var/lib/haproxy/stats
        log 127.0.0.1   local0

# Proxies settings
## Defaults section
defaults
        log     global
        mode    http
        option  tcplog
        option  dontlognull
        retries 3
        option      redispatch
        maxconn     100000
        retries                 3
        timeout http-request    5s
        timeout queue           10s
        timeout connect         10s
        timeout client          10s
        timeout server          10s
        timeout http-keep-alive 10s
        timeout check           10s

## Frontend section
frontend http-in
        bind *:80
        acl example-acl hdr(host) -i example.local
        use_backend example if example-acl
## Backend section
backend example
        balance roundrobin
        server server1 192.168.10.155:80 weight 1 check
        server server2 192.168.10.156:80 weight 1 check
## Statistics settings
listen statistics
        bind *:1986
        stats enable
        stats hide-version
        stats realm Haproxy\ Statistics
        stats uri /stats
        stats refresh 30s
        stats auth keepwalking86:ILoveVietnam$

Ở tệp cấu hình trên haproxy.cfg, chúng ta chia thành 02 phần: global và proxies

Phần global: thiết lập các tham số chung của HAProxy như: pidfile, user, group, daemon, … Các tham số này được áp dụng đến toàn bộ hệ thống.

Phần proxies: dùng thiết lập proxy. Trong tệp tin haproxy.cfg ở trên, nó được chia làm các phần con sau:

  • defaults: thiết lập các tham số mặc định cho các phần sau của nó. Các thiết lập trong phần này sẽ được reset nếu có tùy chọn ở các phần tiếp theo như frontend, backend, listen
  • frontend: Các thông tin thiết lập trong phần này mà HAProxy chấp nhận yêu cầu kết nối từ client. Ở đây, chúng ta tạo một frontend với tên http-in (chúng ta có thể tạo ra nhiều frontend với các tên khác nhau, tùy thuộc vào nhu cầu), gán cổng sẽ listen là 80, chỉ định tên backend là example, kết hợp nếu đúng ACL là example-acl
  • backend: thiết lập nhóm server mà HAProxy sẽ kết nối để chuyển tiếp kết nối incoming. Ở đây, chúng ta tạo ra backend với tên example (tùy thuộc vào hệ thống chúng ta cần dựng bao nhiêu site). Sử dụng thuật toán cân bằng tải là “roundrobin” – là thuật toán mặc định được sử dụng nếu không chỉ định thuật toán khác. Khai báo các web server có địa chỉ là 192.168.10.155 và 192.168.10.156, cổng listen trên web server là 80 và trọng số weight=1. Ta có thể thay đổi giá trị weight để yêu cầu tải trên mỗi server khác.
  • listen: định nghĩa một proxy hoàn chỉnh, mà kết hợp được cả frontend và backend. Ở đấy, tôi tạo một listen cho phần thống kê HAProxy. Khi đó chúng ta truy cập http://ip-address-haproxy:1986/stats với thông tin chứng thực keepwalking86/IloveVietnam$

Mặc định SELinux chưa cho phép sử dụng port 1986, chúng ta enable nó như sau:

setsebool -P haproxy_connect_any=1

Hoặc disable SELinux và restart servers

sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config

Step3: Copy tệp cấu hình haproxy.conf sang máy HAProxy backup

rsync -avzhP /etc/haproxy/haproxy.cfg root@192.168.10.152:/etc/haproxy/haproxy.cfg

Step4: Cấu hình haproxy log

Sửa nội dung tệp cấu hình rsyslog như sau:

cat >> /etc/rsyslog.conf <<EOF
\$ModLoad imudp
\$UDPServerRun 514
\$UDPServerAddress 127.0.0.1 #allow only rsyslog on 127.0.0.1 UDP port 514
EOF

Tạo tệp tin /etc/rsyslog.d/haproxy.conf

cat >> /etc/rsyslog.d/haproxy.conf <<EOF
local0.* /var/log/haproxy.log
EOF

III.  Cấu hình Nginx web server

Step1: Cài đặt Nginx web server

Có thể tham khảo cách Cài đặt Nginx web server 

Trong phạm vi bài viết này, chúng ta có thể cài đặt Nginx web server trên 02 server đơn giản  như sau:

yum -y install nginx
systemctl start nginx.service
systemctl enable nginx.service

Step2: Tạo tệp index.html

Cho mục đích kiểm tra, chúng ta sẽ tạo tệp index.htm đơn giản. Trong môi trường ứng dụng thực tế, chúng ta thực hiện cài đặt đầy đủ stack như LEMP.

Tạo tệp /usr/share/nginx/html/index.html đơn giản sau:

Trên server01:

echo “This is web server01” >/usr/share/nginx/html/index.html

Trên server02:

echo “This is web server02” >/usr/share/nginx/html/index.html

IV. Kiểm tra hoạt động HAProxy

Sau khi cấu hình xong KeepAlived, HAProxy, Nginx, chúng ta thực hiện kiểm tra hoạt động cân bằng tải.

Trên máy kiểm tra, thêm nội dung sau vào tệp /etc/hosts để truy cập site example.local ở LAN

echo "192.168.10.153 example.local" >>/etc/hosts

Step1: Kiểm tra hoạt động cân bằng tải HAProxy

Thực hiện tạo vòng lặp cho kiểm tra

check haproxy with while

Ta thấy HAProxy phân bổ tải lần lượt đến từng web server, với giá trị trọng số weight=1.

Step2: Thống kê hoạt động của HAProxy

Mở trình duyệt web, và truy cập http://example.local:1986/stats với thông tin chứng thực keepwalking86/IloveVietnam$

haproxy statistics