Setup Haproxy and Keepalived
White

manhdung viết ngày 14/03/2016

Haproxy đóng vai trò như một reverse proxy thực hiện load balancer. Bản thân một haproxy thì không ấn định high availabilty (HA) cho chính nó. Tính chất HA là ấn định cho cac backend server đằng sau nó. Nếu chỉ có một haproxy thì mô hình sẽ có một SPOF (Single Point Of Failure). Nó down thì cả hệ thống down theo. Để giải quyết, chúng ta có thể thêm một haproxy để dự phòng (redundancy). Nhưng phương án đó lại phát sinh thêm vấn đề . Khi failover xảy ra client làm sao kết nối đến haproxy dự phòng. Tôi không thể gán cùng một IP lên hai haproxy được. IP conflict sẽ khiến mạng không ổn định. Tôi cũng không thể gán IP khác nhau cho mỗi haproxy được. Khi failover, tôi sẽ phải thông báo cho tất cả client về IP mới. Việc đó thật quá sức. Xem chừng lúc này chúng ta cần đến keepalived. Sử dụng keepalived sẽ cho phép tôi tạo ra một VIP - Virtual IP, một số nơi gọi là float IP. Client sẽ kết nối đến haproxy qua VIP này. VIP này sẽ được keepalived luân chuyển sang haproxy dự phòng khi failover. Tất cả đều trong suốt với client. Client không biết được nó đang kết nối đến VIP, nó nghĩ nó đang kết nối trực tiếp đến một single backend thay vì một nhóm backend nằm sau VIP. Client sẽ không biết đến real IP của proxy và IP của backend cũng như sự luân chuyển VIP này khi failover.

VIP là gì ?

Thực sự nó là một IP được gán thêm trên một network alias (virtual interface) của haproxy. Tính chất virtual của nó nằm ở chỗ nó không gắn cố định trên một network interface thật sự nào cả. Khi có sự cố xảy ra, keepalived sẽ hủy ip trên network alias của haproxy down và tạo trên haproxy backup.

Bạn có thể tự tạo một network alias và gán ip lên đó như sau:
Giả sử network interface của bạn được nhận dạng là eth0. Trong terminal, bạn gõ

ifconfig eth0:0 1.2.3.4 up

ip a
inet 192.168.2.100/24 brd 192.168.2.255 scope global eth0
inet 1.2.3.4/8 brd 1.255.255.255 scope global eth0:0

Để gỡ bỏ network alias, trong terminal, bạn gõ:
ifconfig eth0:0 down

Cài đặt

yum install haproxy keepalived

Cấu hình

Haproxy config trên master và backup

vim /etc/haproxy/haproxy.cfg

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  dontlognull
    option http-server-close
    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

listen  backend_example
    bind *:<PROXY PORT>
    mode tcp
    balance leastconn
    option httpchk
    server backend_db_1 <IP1>:<BACKEND_PORT> check port <CHECK PORT>
    server backend_db_2 <IP2>:<BACKEND_PORT> check port <CHECK PORT>
    server backend_db_3 <IP3>:<BACKEND_PORT> check port <CHECK PORT>

listen stats
    bind *:<STATS PORT >
    mode http
    option httplog
    option httpclose
    stats enable
    stats hide-version
    stats realm Haproxy\ Statistics
    stats uri /
    stats auth <stats_user>:<stats_passwd>
    stats refresh 5s

Bộ config này dựa trên config mẫu của haproxy nên rất đơn giản. Mặc định các giá trị inter, rise, fall trong mỗi backend lần lượt là 2s,2,3. Tham số rise định nghĩa số lần một backend được check thành công trước khi proxy xem backend đó hoạt động để forward request vào. Tham số fall định nghĩa số lần check backend không thành công trước khi proxy xem backend đó ngừng hoạt động để không forward request vào backend đó nữa. Tham số inter sẽ đinh nghĩa khoảng thời gian giữa hai lần check liên tiếp.

Ở trên haproxy sẽ check trạng thái backend qua một http CHECK_PORT. Bản thân backend sẽ không phục vụ các check request này từ haproxy mà một service khác cũng nằm trên backend sẽ xử lý check request. Do là httpchk nên nếu kết quả nhận được là một response status code 200 thì thành công còn response status code 500 thì thất bại. Kỹ thuật này được sử dụng nhiều trong việc check trạng thái các node trong galera cluster.

Các bạn có thể tham khảo hướng dẫn sử dụng haproxy để check trạng thái node của cluster tại đây:
https://www.percona.com/doc/percona-xtradb-cluster/5.6/howtos/haproxy.html
https://github.com/olafz/percona-clustercheck

Trên backup haproxy, bạn cũng cấu hình tương tự hoặc viết một script để đồng bộ config hai bên:
vim /usr/local/bin/rsync_haproxy_config

#!/bin/bash
rsync -avzP  root@<MASTER HAPROXY IP>:/etc/haproxy/haproxy.cfg /etc/haproxy

Phải đảm bảo bạn đã thực hiện ssh based key authentication trên master proxy cho backup proxy.

crontab -e

* * * * * /usr/local/bin/rsync_haproxy_config

Keepalived trên master proxy

vim /etc/keepalived/keepalived.cfg

vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
}

vrrp_instance example_VI {
    state MASTER
    interface eth0
    virtual_router_id 10
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass <pass>
    }
    virtual_ipaddress {
         <VIP>/<NETMASK> dev eth0 label eth0:0
    }

    track_script {
        chk_haproxy
    }
}

Keepalived trên backup proxy

vim /etc/keepalived/keepalived.cfg

vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
}

vrrp_instance example_VI {
    state BACKUP
    interface eth0
    virtual_router_id 10
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass <pass>
    }
    virtual_ipaddress {
        <VIP>/<NETMASK> dev eth0 label eth0:0
    }

    track_script {
        chk_haproxy
    }
}

Cần chú ý:

- vrrp_instance phải khai báo tên giống nhau trên cả keepalived master và backup
- virtual_router_id cũng phải khai báo giống nhau trên cả keepalived master và backup
- interface eth0 sẽ chỉ định interface được chọn đến gán VIP
- keepalived master sẽ có state MASTER và priority cao hơn keepalived backup có state là BACKUP
- phần authentication type và pass phải giống nhau
- <VIP>/<NETMASK> dev eth0 label eth0:0, chỉ định VIP và netmask tương ứng, cùng với interface gán VIP

Lần lượt start service haproxy và keepalived trên server master và backup nữa là xong. Bạn sẽ thấy VIP luân chuyển giữa master và backup khi bạn cố tình đánh sập proxy :D

Tham khảo:

https://www.digitalocean.com/community/tutorials/how-to-use-haproxy-to-set-up-mysql-load-balancing--3
https://www.digitalocean.com/community/tutorials/how-to-set-up-highly-available-haproxy-servers-with-keepalived-and-floating-ips-on-ubuntu-14-04
https://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-keepalived-on-debian-lenny-p2

-Bài gốc-
https://coffeecode101.blogspot.com/2016/02/quick-setup-haproxy-and-keepalived.html

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

manhdung

44 bài viết.
263 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
76 11
Giới thiệu RabbitMQ là một message broker ( messageoriented middleware) sử dụng giao thức AMQP Advanced Message Queue Protocol (Đây là giao thức ph...
manhdung viết 3 năm trước
76 11
White
48 4
Giả định bạn tiếp nhận một server mới toanh, bạn cần tìm một số thông tin về nó như loại CPU, loại main, loại memory, memory dùng của hãng nào... c...
manhdung viết gần 2 năm trước
48 4
White
41 12
Trong phần 1, tôi đã giới thiệu về sơ lược rabbitmq, vai trò của rabbitmq trong hệ thống phân tán và hướng dẫn cài đặt. Trong phần này, tôi sẽ trìn...
manhdung viết 3 năm trước
41 12
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
44 bài viết.
263 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!