Thứ hai, 02/12/2013 | 00:00 GMT+7

Cách sử dụng HAProxy để thiết lập cân bằng tải MySQL

HAProxy là một phần mềm open-souce có thể cân bằng tải các server HTTP và TCP. Trong bài viết trước về HAProxy, ta đã cấu hình cân bằng tải cho HTTP và trong bài viết này, ta sẽ thực hiện tương tự cho MySQL.

Tất cả các server MySQL của bạn phải được cấu hình để thực hiện sao chép Master-Master vì cân bằng tải liên quan đến cả việc đọc và ghi cho tất cả các phần backend .

Ba server sau sẽ được sử dụng trong bài viết này:

Server 1 - Cân bằng tải
Tên server : haproxy
Hệ điều hành: Ubuntu
IP riêng: 10.0.0.100

Server 2 - Nút 1
Tên server : mysql-1
Hệ điều hành: Debian 7
IP riêng: 10.0.0.1

Server 2 - Nút 2
Tên server : mysql-2
Hệ điều hành: Debian 7
IP riêng: 10.0.0.2

Trước khi tiếp tục, hãy đảm bảo tất cả các server MySQL đã hoạt động, đang chạy và đang sao chép chính xác các ghi database .

Chuẩn bị Server MySQL


Ta cần chuẩn bị các server MySQL bằng cách tạo thêm hai user cho HAProxy. User đầu tiên sẽ được sử dụng bởi HAProxy để kiểm tra trạng thái của server .

root@mysql-1# mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('10.0.0.100','haproxy_check'); FLUSH PRIVILEGES;"

Cần có user MySQL với quyền root khi truy cập cụm MySQL từ HAProxy. User root mặc định trên tất cả các server chỉ được phép đăng nhập local . Mặc dù điều này có thể được khắc phục bằng cách cấp thêm các quyền cho user root, nhưng tốt hơn là nên có một user riêng có quyền root.

root@mysql-1# mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'10.0.0.100' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES"

Thay thế haproxy_rootmật khẩu bằng các giá trị bảo mật của bạn . Chỉ cần thực thi các truy vấn này trên một MySQL master là đủ vì các thay đổi sẽ sao chép sang những người khác.

Cài đặt MySQL Client


Máy khách MySQL phải được cài đặt trên server HAProxy để kiểm tra kết nối.

root@haproxy# apt-get install mysql-client

Bây giờ, hãy thử thực hiện một truy vấn trên một trong những cái chính là user haproxy_root .

root@haproxy# mysql -h 10.0.0.1 -u haproxy_root -p -e "SHOW DATABASES"

Điều này sẽ hiển thị một danh sách các database MySQL.

Cài đặt HAProxy


Trên server HAProxy, hãy cài đặt gói.

root@haproxy# apt-get install haproxy

Bật HAProxy để được khởi động bởi init script.

root@haproxy# sed -i "s/ENABLED=0/ENABLED=1/" /etc/default/haproxy

Để kiểm tra xem thay đổi này có được thực hiện đúng hay không, hãy thực hiện đúng tập lệnh init của HAProxy mà không có bất kỳ tham số nào.

root@haproxy:~# service haproxy
Usage: /etc/init.d/haproxy {start|stop|reload|restart|status}

Cấu hình HAProxy


Đổi tên file cấu hình ban đầu

mv /etc/haproxy/haproxy.cfg{,.original}

Tạo và chỉnh sửa một cái mới

nano /etc/haproxy/haproxy.cfg

Khối đầu tiên là đoạn cấu hình chung và đoạn cấu hình mặc định.

global
    log 127.0.0.1 local0 notice
    user haproxy
    group haproxy

defaults
    log global
    retries 2
    timeout connect 3000
    timeout server 5000
    timeout client 5000

Thông tin thêm về từng tùy chọn này được đề cập trong bài viết này . Vì ta đã yêu cầu HAProxy gửi thông báo log đến 127.0.0.1, ta phải cấu hình rsyslog để lắng nghe nó. Điều này cũng đã được đề cập trong cùng một bài viết trong Định cấu hình ghi log cho HAProxy .

Chuyển sang phần cấu hình chính.

listen mysql-cluster
    bind 127.0.0.1:3306
    mode tcp
    option mysql-check user haproxy_check
    balance roundrobin
    server mysql-1 10.0.0.1:3306 check
    server mysql-2 10.0.0.2:3306 check

Không giống như cân bằng tải HTTP, HAProxy không có “chế độ” cụ thể cho MySQL nên ta sử dụng tcp . Ta đã đặt HAProxy chỉ lắng nghe trên địa chỉ loopback (giả sử rằng ứng dụng đó nằm trên cùng một server ) tuy nhiên, nếu ứng dụng của bạn nằm trên một server khác, hãy làm cho nó lắng nghe trên 0.0.0.0 hoặc địa chỉ IP riêng.

Ta cần thêm một đoạn cấu hình để xem số liệu thống kê về cân bằng tải. Điều này là hoàn toàn tùy chọn và có thể được bỏ qua nếu bạn không muốn có số liệu thống kê.

listen 0.0.0.0:8080
    mode http
    stats enable
    stats uri /
    stats realm Strictly\ Private
    stats auth A_Username:YourPassword
    stats auth Another_User:passwd

Thay thế tên user và password trong “xác thực số liệu thống kê”. Điều này sẽ làm cho HAProxy lắng nghe trên cổng 8080 đối với các yêu cầu HTTP và số liệu thống kê sẽ được bảo vệ bằng Xác thực cơ bản HTTP. Vì vậy, bạn có thể truy cập số liệu thống kê tại

http://<Public IP of Load Balancer>:8080/

Khi bạn đã hoàn tất việc cấu hình , hãy bắt đầu dịch vụ HAProxy.

service haproxy start

Sử dụng client mysql để truy vấn HAProxy.

root@haproxy# mysql -h 127.0.0.1 -u haproxy_root -p -e "SHOW DATABASES"

Tùy chọn “-h” phải có cùng với địa chỉ IP lặp lại. Bỏ qua nó hoặc sử dụng localhost sẽ làm cho client MySQL kết nối với file mysql.sock sẽ không thành công.

Kiểm tra cân bằng tải và chuyển đổi dự phòng


Để kiểm tra xem cân bằng tải có đang hoạt động hay không, hãy truy vấn biến server_id hai lần trở lên.

root@haproxy# mysql -h 127.0.0.1 -u haproxy_root -p -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
root@haproxy# mysql -h 127.0.0.1 -u haproxy_root -p -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+

Điều này chứng tỏ cân bằng tải roundrobin với trọng lượng bằng nhau, bây giờ ta sẽ thay đổi trọng lượng cho mysql-2 và xem kết quả.

nano /etc/haproxy/haproxy.cfg

server mysql-2 10.0.0.2:3306 check weight 2

Reload để áp dụng thay đổi này.

service haproxy reload

Truy vấn server_id nhiều lần.

root@haproxy:~# for i in `seq 1 6`
do
mysql -h 127.0.0.1 -u haproxy_root -ppassword -e "show variables like 'server_id'"
done

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+

Bây giờ cân bằng tải hoạt động theo tỷ lệ 1: 2 với một phần ba số yêu cầu đến mysql-1 và hai phần ba sẽ đến mysql-2.

Lỗi server MySQL bằng cách dừng dịch vụ

root@mysql-1# service mysql stop

hoặc đưa giao diện xuống.

root@mysql-1# ifconfig eth1 down

Hãy thử truy vấn "hiển thị biến" ngay bây giờ để xem kết quả. Các mục log sau sẽ cho biết thời điểm và cách thức HAProxy phát hiện ra lỗi.

tail /var/log/haproxy/haproxy.log

Nov 15 00:08:51 localhost haproxy[1671]: Server mysql-cluster/mysql-1 is DOWN, reason: Layer4 timeout, check duration: 2002ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.

Giảm khoảng thời gian chuyển đổi dự phòng


Khi server MySQL gặp sự cố, HAProxy sẽ mất một khoảng thời gian để phát hiện lỗi này và xóa nó khỏi cụm. Trong phần này, ta sẽ xem cách kiểm soát thời gian này. Trước tiên, ta sẽ xem cách đo giá trị này. Một cách là chặn cổng MySQL bằng iptables trong một khoảng thời gian nhất định, sau đó loại bỏ luật và kiểm tra log .

root@mysql-1:~# ifconfig eth1 down &&
date &&
sleep 20 &&
ifconfig eth1 up &&
date

Fri Nov 15 00:37:09 IST 2013
Fri Nov 15 00:37:29 IST 2013

Cổng 3306 đã bị chặn trong 20 giây, ta sẽ xem xét file log ngay bây giờ.

root@haproxy:~# tail /var/log/haproxy.log
Nov 15 16:49:38 localhost haproxy[1275]: Server mysql-cluster/mysql-1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Nov 15 16:49:56 localhost haproxy[1275]: Server mysql-cluster/mysql-1 is UP, reason: Layer7 check passed, code: 0, info: "5.5.31-0+wheezy1-log", check duration: 1ms. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.

Phải mất 6 giây để phát hiện lỗi (sự khác biệt giữa 16:49:38 và 16:49:32) và 4 giây để phát hiện rằng server có thể được truy cập (sự khác biệt giữa 16:49:56 và 16:49:52). Điều này được xác định bởi các tham số server tăng, giảm và liên.

Tham số tăng đặt số lần kiểm tra mà server phải vượt qua để được khai báo là hoạt động . Mặc định là 2.

Tham số Fall đặt số lần kiểm tra mà server phải vượt qua để được khai báo là đã chết . Mặc định là 3.

Tham số inter đặt khoảng thời gian giữa các lần kiểm tra này. Mặc định là 2000 mili giây.

Đặt thông tin này lại với nhau, một server phải không thực hiện được 3 lần kiểm tra liên tục trong repository ảng thời gian 2 giây để được coi là đã chết. Vì vậy, trong ví dụ ở trên, điều sau sẽ xảy ra.

16:49:32 - Port 3306 on mysql-1 was blocked
16:49:34 - Check - Failed - Failure No. 1
16:49:36 - Check - Failed - Failure No. 2
16:49:38 - Check - Failed - Failure No. 3 (server removed and event logged)

Và khi luật firewall bị loại bỏ.

16:49:52 - Firewall rule removed port 3306 accessible
16:49:54 - Check - Passed - Success No. 1
16:49:56 - Check - Passed - Success No. 2 (server added to cluster and event logged)

Các cài đặt sau sẽ giảm khoảng thời gian thử nghiệm xuống còn 1 giây và cũng giảm số lần thử nghiệm rơi.

nano /etc/haproxy/haproxy.cfg

server mysql-1 10.0.0.1:3306 check fall 2 inter 1000
server mysql-2 10.0.0.2:3306 check fall 2 inter 1000

Đôi khi bạn có thể không muốn làm ngập mạng riêng với quá nhiều gói “thử nghiệm”, đặc biệt nếu bạn có một lượng lớn server MySQL. Trong những trường hợp như vậy, các tham số Fastinter và downinter sẽ có ích.

Tham số Fastinter đặt khoảng thời gian giữa các lần kiểm tra trong khi server đang chuyển đổi LÊN hoặc XUỐNG.

Tham số downinter đặt khoảng thời gian kiểm tra khi server XUỐNG.

Lời giải thích đó có thể khó hiểu vì vậy ta sẽ xem nó với một ví dụ.

nano /etc/haproxy/haproxy.cfg

server mysql-1 10.0.0.1:3306 check fastinter 1000
server mysql-2 10.0.0.2:3306 check fastinter 1000

Vì ta chưa chỉ định tham số "inter" nên nó được mặc định là 2000ms. Với cấu hình này, ta sẽ khởi động lại HAProxy và thực hiện kiểm tra lại.

root@mysql-1:~# iptables -A INPUT -p tcp --dport 3306 -j REJECT &&
date &&
sleep 20 &&
iptables -D INPUT -p tcp --dport 3306 -j REJECT &&
date
Fri Nov 15 17:18:48 IST 2013
Fri Nov 15 17:19:08 IST 2013

Kiểm tra file log HAProxy.

root@haproxy:~# tail /var/log/haproxy.log
Nov 15 17:18:52 localhost haproxy[1353]: Server mysql-cluster/mysql-1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Nov 15 17:19:11 localhost haproxy[1353]: Server mysql-cluster/mysql-1 is UP, reason: Layer7 check passed, code: 0, info: "5.5.31-0+wheezy1-log", check duration: 1ms. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.

Như vậy, chỉ mất 4 giây (so với 6 trước đó) để phát hiện lỗi và 3 giây (so với 4) để phát hiện server đã hoạt động. Đằng sau mức thấp Đây là kết quả đã xảy ra.

17:18:48 - Port 3306 blocked
17:18:50 - Check - Failed - Failure No. 1
17:18:51 - Check - Failed - Failure No. 2
17:18:52 - Check - Failed - Failure No. 3 (server removed and event logged)

Và khi cổng đã được bỏ chặn.

17:19:08 - Firewall rule removed
17:19:10 - Check - Passed - Success No. 1
17:19:11 - Check - Passed - Success No. 2 (server added to cluster and event logged)

Đầu tiên hãy lưu ý khoảng thời gian giữa sự kiện khối cổng (17:18:48) và lần kiểm tra đầu tiên (17:18:50), nó là 2 giây (khoảng thời gian "inter"). Sau đó, lưu ý khoảng thời gian giữa Bài kiểm tra 1 <-> Bài kiểm tra 2 và Bài kiểm tra 2 <-> Bài kiểm tra 3, nó chỉ là 1 giây (khoảng thời gian “fastinter”). Có thể nhận thấy các khoảng thời gian tương tự khi server chuyển từ XUỐNG lên LÊN. Vì vậy, "fastinter" kiểm soát khoảng thời gian giữa các lần kiểm tra này.

Vậy downinter là gì? Khi một server đã được khai báo DOWN HAProxy tiếp tục kiểm tra nó sau mỗi 2 giây (hoặc khoảng thời gian được đề cập trong liên). Nếu bạn cảm thấy mình đang sử dụng hết tài nguyên mạng không cần thiết, cài đặt trình báo lỗi là 5000 sẽ khiến HAProxy kiểm tra server DOWN chỉ một lần trong 5 giây.

Quan trọng


Các thử nghiệm ta đã thực hiện trước đây đã TỪ CHỐI các gói nghĩa là khi HAProxy bắt đầu kết nối bằng cách gửi gói SYN đến mysql-1, nó sẽ nhận được gói RST (thay vì SYN + ACK). Đây là lý do tại sao mục log được đề cập "Kết nối bị từ chối". Trong trường hợp này, chỉ có giá trị rơi, inter và fastinter mới xuất hiện.

Thay vào đó, nếu HAProxy không nhận được gì sau khi gửi SYN, kết nối sẽ hết thời gian chờ. Trong trường hợp này, ngoài các thông số đã đề cập ở trên, thời lượng "timeout" còn có trong cảnh. Tình huống này có thể xảy ra nếu

  • iptables được đặt thành DROP
  • giao diện riêng tư bị hỏng
  • có vấn đề với cơ sở hạ tầng mạng riêng

Đọc thêm


Tài liệu chính thức http://cbonte.github.io/haproxy-dconv/configuration-1.4.html

<div class = “author”> Người gửi: <a rel=p>author[ href=osystemhttp://jesin.tk/[> Jesin A </a> </div>


Tags:

Các tin liên quan

Cách sử dụng HAProxy để thiết lập cân bằng tải MySQL
2013-12-02
Cách cài đặt MySQL 5.6 từ kho lưu trữ chính thức của Yum
2013-11-13
Cách tối ưu hóa các truy vấn và bảng trong MySQL và MariaDB trên VPS
2013-11-11
Cách bảo mật sao chép MySQL bằng SSH trên VPS
2013-09-18
Cách tạo và quản lý database trong MySQL và MariaDB trên server cloud
2013-07-29
Cách thực hiện các truy vấn cơ bản trong MySQL và MariaDB trên server cloud
2013-07-29
Cách cài đặt Etherpad cho Sản xuất với Node.js và MySQL trên VPS
2013-07-26
Cách bảo mật database MySQL và MariaDB trong VPS Linux
2013-07-23
Chuyển sang MariaDB từ MySQL
2013-07-18
Cách di chuyển database MySQL giữa hai server
2012-08-09