2. Cài đặt các thuật toán cân bằng tải trên HAproxy:
2.3. Nâng cao khả năng chịu tải của bộ cân bằng tải:
Thuật toán LC mới chỉ chú trọng vào một biến đếm, là số lượng kết nối đến server để thực hiện việc phân tải. Tuy nhiên vẫn còn rất nhiều thông số khác để đo
hiệu năng của một server ngoài chỉ số kết nối. Hai server có thể đang có số kết nối tương đương nhưng một server lại phải chịu tải lớn hơn hẳn, do các công việc của server này có thể nặng tải hơn yêu cầu của server kia. Thuật toán RR cũng có khả năng xảy ra hiện tượng này.
Giả sử như một server đang chạy thấy mình đang phải chịu tải quá nặng, nó sẽ tự kiểm tra thông số này bằng cách kiểm tra tải của CPU, dung lượng RAM đang sử dụng…Nó sẽ gửi một thông báo đến bộ cân bằng tải báo rằng mình đang chịu tải quá cao. Chúng ta cần thiết kế một chương trình cài đặt trên từng server để kiểm tra thông số này, sau đó gửi về bộ cân bằng tải. Tại sao lại không thể cài đặt tích hợp vào bộ cân bằng tải? Vì bộ cân bằng tải sẽ không đo được tải của từng server, đặc biệt là khi các server ở xa nhau.
Server sẽ gửi đi một tin nhắn chẳng hạn như:
sendmessage( proxy_address, proxy_port, srv_add, srv_port, srvoverload);
Bộ cân bằng tải sẽ nhận tín hiệu này:
getMessage (srv_add, srv_port, srv_load);
Nếu tải của server lớn hơn một giá trị nào đó, chẳng hạn 85%, bộ cân bằng tải sẽ loại nó ra khỏi danh sách các server của proxy, tuy vậy phải giữ toàn bộ thông tin về nó trong proxy như vậy khi chúng ta thực hiện thuật toán sẽ không gửi thêm kết nối đến server này, nhưng các nhiệm vụ mà nó đang thực hiện vẫn được làm.
Do đó phải khai báo trong proxy một con trỏ cấu trúc server, lưu thông tin về các server bị quá tải. Thêm vào cấu trúc này mỗi khi cần
struct server *overload_srv; Đẩy server bị quá tải ra khỏi tập server.
for(srv = px->svr; srv!=NULL; svr = srv->next) {
//Compare srv id and overload server id if(strcmp(srv->next->id, id))
//overload server
{
temp = srv->next;
temp->next = NULL;
}
}
Sau đó cho nó vào overload_server.
temp->next = px->overload_srv; px->overload_srv = temp;
temp->proxy = px;
Khi tải của server xuống dưới một giá trị nào đó, chẳng hạn 50%, nó sẽ cần phải gửi một tin nhắn thông báo là tải của nó đã nhẹ hơn, chúng ta sẽ lại cho nó vào trong danh sách các server của proxy.
sendmessage( proxy_address, proxy_port, srv_add, srv_port, srvOK);
Quá trình ở đây sẽ diễn ra ngược lại so với quá trình trên. Chúng ta sẽ đưa server ra khỏi danh sách các server đang bị overload và thêm nó vào trong danh sách các server đang chạy của proxy
Vì trường hợp quá tải ít khi xảy ra, do đó số lượng cũng như thời điểm mà server gửi message về cho bộ cân bằng tải sẽ không quá nhiều để có thể gây ra quá tải cho bộ cân bằng tải. Ngược lại thuật toán sẽ đảm bảo chúng ta không gửi thêm kết nối đến các server quá tải trong hệ thống, nhằm tránh trường hợp các server bị treo do phải phục vụ quá khả năng của nó.