Thuật toán Weighted Round Robin (WRR)

Một phần của tài liệu Thiết kế bộ phân tải cho các dịch vụ mạng lớn đảm bảo khả năng nhanh chóng mở rộng quy mô hệ thống (Trang 70 - 72)

2. Cài đặt các thuật toán cân bằng tải trên HAproxy:

2.1. Thuật toán Weighted Round Robin (WRR)

Như đã mô tả ở trong chương 2 của luận văn này, tư tưởng chính của thuật toán WRR là phân tải xoay vòng giữa các server. Giả sử như chúng ta có 3 server A, B, C với trọng số lần lượt là 1, 2, 3. Thuật toán sẽ phân tải vào server theo thứ tự ABBCCC. Điều này được chỉ định trong srv_map khi chúng ta lưu cấp phát bộ nhớ cho một server mới và lưu nó vào srv_map. Biến srv_rr_idx được dùng để chọn server tiếp theo trong thuật toán.

Thuật toán RR được cài đặt như sau:

static inline struct server

*get_server_rr_with_conns(struct proxy *px) { int newidx;

/* Biến này dùng để đặt giá trị mới cho srv_rr_idx sau khi chọn được server */

struct server *srv;

/*Kiểm tra nếu kích thước của srv_map bằng không, nghĩa là không tồn tại server nào đang hoạt động, thuật toán trả về null */

if (px->srv_map_sz == 0)

return NULL;

/*Nếu như giá trị của srv_rr_idx nhỏ hơn 0, hoặc vượt quá kích thước srv_map_sz, nghĩa là đã đi đến cuối server map chúng ta sẽ cập nhập giá trị cho nó bằng 0 */

if(px->srv_rr_idx < 0 || px->srv_rr_idx >= px->srv_map_sz) px->srv_rr_idx = 0;

/*Gán giá trị của srv_rr_idx cho newidx */

/*Thực hiện vòng lặp cho đến khi lấy được server phù hợp lẽ ra ở đây vì newidx = pr->srv_rr_idx, chúng ta sẽ lấy được luôn server thỏa mãn, tuy nhiên cần phải loại trừ trường hợp server đó đã đầy, hoặc số kết nối hiện tại lớn hơn số kết nối cho phép */

do { srv = px->srv_map[newidx++]; if (!srv->maxconn || srv->cur_sess < srv_dynamic_maxconn(srv)) { px->srv_rr_idx = newidx; return srv; } if (newidx == px->srv_map_sz) newidx = 0;

} while (newidx != px->srv_rr_idx);

return NULL; }

Thuật toán WRR đơn giản và chạy khá ổn định trong phần mềm Haproxy, tuy nhiên nó cũng có những nhược điểm mà không thể khắc phục được.

Thứ nhất, vì nó phân phối tải theo hình thức xoay vòng, nên một người dùng đến với website có thể được đẩy đến các server khác nhau, điều này là không nên xảy ra, vì khi người dùng đã được đưa vào một server, nghĩa đã được thiết lập kết nối với server đó, tiếp tục làm việc với server này ở các yêu cầu tiếp theo sẽ giúp người dùng không phải tải lại một số các đối tượng (chẳng hạn như đã được tải về ở yêu cầu trước), hơn nữa, sẽ giúp người dùng không phải thực hiện lại việc kết nối server, điều này đặc biệt quan trọng khi web-server có yêu cầu về bảo mật, chẳng hạn như kiểm tra SSL key. Nếu yêu cầu của một người dùng được đưa vào các server khác nhau, việc kiểm tra liên tục SSL key sẽ mất rất nhiều thời gian, làm tăng thời gian đáp ứng người dùng.

Chúng ta có thể khắc phục nhược điểm này bằng 2 cách. Cách thứ nhất là sử dụng cookie như đã nói ở phần cookie của chương 2. Cách thứ 2 là sử dụng một

hàm băm theo địa chỉ IP của người dùng. Khi bộ cân bằng tải nhận yêu cầu, nó sẽ băm địa chỉ IP của người dùng. Cùng một giá trị băm sẽ được cho vào 1 server. Tuy nhiên phương pháp này đòi hỏi người dùng phải có IP tĩnh.

Nhược điểm thứ 2 là vì phân phối theo kiểu xoay vòng, nên có thể sẽ xảy ra trường hợp một server phải phục vụ rất nhiều người dùng, trong khi server khác lại nhàn rỗi. Điều này có thể khắc phục bằng cách sử dụng thuật toán Least Connections (LC).

Một phần của tài liệu Thiết kế bộ phân tải cho các dịch vụ mạng lớn đảm bảo khả năng nhanh chóng mở rộng quy mô hệ thống (Trang 70 - 72)