Mô tả mô phỏng của giải pháp cân bằng tải mới

Một phần của tài liệu Một phương pháp phi tập trung cho cân bằng tải trong các mạng ngang hàng có cấu trúc luận văn ths công nghệ thông tin (Trang 35 - 40)

Các node vật lý được cài đặt là class PhysicalServer PS trong vòng

Chord bao gồm các trường sau: id – định danh node, capacity – tải định mức, work – tải hiện thời, mismatch – độ lệch tải, isOverload – trạng thái của node, newid – id của

node trên vòng Chord mới. Các server ảo được cài đặt là class VirtualServer

VS của node cũng được lưu gồm các trường: double key – định danh của server ảo, int original_PS_ID – định danh của node đang quản lý VS, workPerRound – tải của VS.

Các hàm thực hiện các bước của giải pháp cân bằng tải mới được mô tả trong file

honghien.cc.

Vòng Chord mới sẽ được tạo dựa vào độ lệch tải trên vòng Chord cũ, sử dụng

hàm NCN_create_nChord(numberOfOverloadPS). Độ lệch tải mismatch

giữa tải định mức C và tải hiện thời W của node trên vòng Chord ban đầu được tính bằng công thức:

36

Dựa vào độ lệch tải này, ID của node trên vòng Chord mới được xác định như sau:

if (ps[i].getCapacity() > ps[i].getWorkPerRound()) {

newID = ps[i].getId() + (int)(floor(ps[i].getMismatch())) * FACTOR;

ps[i].setNewID(newID); // them truong new_id cho PS } else

{

newID = ps[i].getId();

ps[i].setNewID(newID); // PS nang tai co id moi bang id cu numberOfOverloadPS = numberOfOverloadPS + 1;

}

Nếu có PS nặng tải thì thực hiện chèn NCN_insert_nChord(). Nếu đến một lúc nào đó, vẫn còn PS nặng tải mà không thể chèn được thì chuyển sang bước hoán đổi NCN_dislodge_nChord().

Hình 4.1. Mô t

Mỗi node sẽ có 1 b

server.h:

37

Mô tả quá trình hoạt động của giải pháp mới

38

class PsFinger {

private:

ChordID *psfinger; // Mang cac finger public:

PsFinger(); ~PsFinger();

void fixPsFingers(ChordID newId); ChordID getPsKey(int index)

{ (adsbygoogle = window.adsbygoogle || []).push({});

return (ChordID) psfinger[index]; }

};

Tại bước chèn, ta phải thực hiện tìm được node thỏa mãn điều kiện là định danh id của nó phải lớn hơn một giá trị cụ thể nào đấy. Ở đây ta sẽ sử dụng hàm

findBestFitPs(PhysicalServer*inputPs,ChordID pivotId)với đầu

vào là node tìm kiếm inputPs và một giá trị cho trước pivotId. Hàm này nằm trong file honghien.cc và được cài đặt như sau:

PhysicalServer* findBestFitPs(PhysicalServer* inputPs, ChordID pivotId)

{

map<ChordID, PhysicalServer*>::iterator p; while (true){

ChordID successorId = inputPs->getPsFingerId(0); if (successorId == pivotId)

{

ps = findSuccessor(successorId); return ps;

}

else if (successorId > pivotId) {

p = pServers.find(successorId); return p->second;

} else{

ChordID key = findClosetPreceding(currentPs, pivotId);

p = pServers.find(key); currentPs = p->second;

39

} }

Ở đây, ta sử dụng 2 hàm là hàm tìm successor của một node có định danh newID: findSuccessor(ChordID newID)và hàm tìm predecessor của một node có định danh pivotId: findClosetPreceding(PhysicalServer* currentPs, ChordID pivotId)

PhysicalServer* findSuccessor(ChordID newID) { map<ChordID, PhysicalServer*>::iterator p; p = pServers.upper_bound(newID); if (p == pServers.end()) { p = pServers.begin(); } return p->second; }

ChordID findClosetPreceding(PhysicalServer* currentPs, ChordID pivotId)

{

ChordID key = 0;

ChordID currentId = currentPs->getNewID(); for (int i = fingerPsCount - 1; i >= 0; i--) {

key = currentPs->getPsFingerId(i); if (pivotId > key && key > currentId) { return key; } } return -1; }

Sau bước chèn, ta lại kiểm tra số PS nặng tải, nếu số PS nặng tải =0 thì thuật toán kết thúc thành công, nếu không thì chuyển sang bước hoán đổi. Tại bước hoán đổi, nếu thực hiện hoán đổi được thì sẽ quay lại bước chèn. Thuật toán kết thúc khi không còn PS nặng tải nào hoặc khi không thể hoán đổi được nữa.

40

Khi tạo được vòng Chord mới, khi chèn được các VS vào các PS nhẹ tải và ngay cả khi hoán đổi các VS giữa các PS ta đều cần phải update bảng định tuyến của các node PS. Ở tất cả các bước sẽ đều gọi hàm updateNewChord() trong file

honghien.cc (adsbygoogle = window.adsbygoogle || []).push({});

void updateNewChord() {

ASSERT(pServers.size() == psActiveCount);

map<ChordID, PhysicalServer*>::iterator p = NULL; for (p = pServers.begin(); p != pServers.end(); p++) {

((PhysicalServer*) p->second)->fixPsFingers(); }

}

Bảng định tuyến PsFinger của các node gồm 2 cột: cột thứ nhất là id, cột thứ hai là successor(id) tương ứng. Khi cập nhật vòng Chord mới, các bảng định tuyến phải được cập nhật theo. Hàm cập nhật bảng định tuyến fixPsFingers của các node nằm trong file honghien.cc được cài đặt như sau:

void PsFinger::fixPsFingers(ChordID newId) {

ChordID rowId = 0;

PhysicalServer* ps = NULL;

for (int i = 0; i < fingerPsCount; i++) {

rowId = newId + fingerStep[i]; ps = findSuccessor(rowId); psfinger[i] = ps->getNewID(); }

}

Một phần của tài liệu Một phương pháp phi tập trung cho cân bằng tải trong các mạng ngang hàng có cấu trúc luận văn ths công nghệ thông tin (Trang 35 - 40)