Bộ mô phỏng của Jonathan Ledlie [5] thực hiện các thuật toán cân bằng tải trên kiến trúc mạng ngang hàng có cấu trúc Chord. Nó được viết bằng C++ trên hệ điều hành Linux. Sau đó, dựa trên bộ mô phỏng này, tác giả Nguyễn Thị Mi đã sửa đổi để mô phỏng chạy được trên Window.
Trong đó, các ID của node được sắp xếp trật tự trên không gian định danh của vòng Chord. Bộ mô phỏng gồm các bước được thực hiện tuần tự trong hàm main của
file lb.cc: các node tham gia và thoát khỏi mạng, update bảng định tuyến, thực hiện
truy vấn và cân bằng tải.
Các node tham gia và thoát khỏi mạng
Việc tham gia và thoát khỏi mạng của các node sẽ được mô tả thông qua
birth(myInitialVsCount) và death(). Trong mô phỏng, tác giả sử dụng phân bố Pareto để mô tả quá trình vào/ra của các node trong mạng. Ở đây, tác giả dùng hai file đầu vào:
- Một file chứa thông tin về khả năng riêng (capacity) của từng node là file
gnutelle.4096n. File này gồm hai cột: cột đầu tiên là định danh ID của node,
còn cột thứ hai là capacity của node đó. Ví dụ:
0 10 1 106 2 10 3 10 4 106 5 10 …
34
- Một file chứa thông tin vào/ra của các node ở mỗi vòng là file
pareto.4096n.3hours. File này gồm 3 cột: cột đầu tiên là số vòng (round) tính
theo giây, thời gian bắt đầu là 0, cột thứ hai mô tả hoạt động của node tại thời điểm đó (b/d/w/r/q) với b: birth, d: death, w: chuyển đổi tải, r: trạng thái ghi của node là true và q: chỉ xuất hiện ở cuối file để kết thúc chương trình. Cột thứ ba là định danh ID của node thực hiện hành động ở cột thứ hai. Ví dụ:
0 b 0 0 b 1 0 b 10 0 b 100 0 b 1000 0 b 1002 … Cập nhật bảng định tuyến
Ban đầu các server ảo có một bảng định tuyến rỗng. Sau đó, nó sẽ sử dụng cơ chế định tuyến của Chord để hoàn thiện bảng định tuyến của mình. Nếu một server ảo
có định danh là a, thì hàng i trong bảng định tuyến của nó là successor của key a+2i mod D (với D = 2160). Các server ảo dùng hàm fixFingers() trong file fingers.cc
để cập nhật bảng định tuyến của mình.
Mỗi hàng trong bảng định tuyến hay còn gọi là finger sẽ có timeout là 30s. Mỗi lần finger này được sử dụng thành công thì timeout sẽ được thiết lập lại. Khi node rời bỏ mạng, các server ảo trỏ đến node không được thông báo.
Thực hiện truy vấn
Các hàm phân bố được thực hiện trong file distribution.cc. Nếu các truy vấn gửi
tới các node giống nhau thì phân bố truy vấn được gọi là phân bố uniform. Ngược lại, các truy vấn gửi đến các node không đồng đều thì phân bố truy vấn được gọi là phân bố Zipf. Dưới đây là hàm phân bố Zipf:
( , , ) = ⁄
∑ ( ⁄ )
Trong đó, N là số lượng node được truy vấn, k là thứ hạng của node được truy
vấn (node có thứ hạng càng cao thì bị truy vấn càng nhiều) và là giá trị lũy thừa biểu thị đặc điểm của phân bố. Giá trị đại diện cho mức độ truy vấn giữa các node có các thứ hạng khác nhau. Ta sẽ sử dụng các giá trị biến thiên của để xem xét xem các thuật toán cân bằng tải sẽ cho kết quả như thế nào trong trường hợp mạng có độ skew khác nhau: = 0.8, = 1.2.
35
Truy vấn được khởi tạo từ node với đích được chọn từ phân bố đồng đều hoặc phân bố Zipf. Mỗi hop trong truy vấn sử dụng finger thích hợp để định tuyến truy vấn về đích. Nếu hop là node nặng tải thì truy vấn thất bại. Ngược lại, truy vấn thành công khi chúng đến được node đích.
Cân bằng tải
Trung bình 30s, các node kiểm tra cân bằng tải một lần. Node sẽ kiểm tra tải hiện thời của nó là trên hay dưới tải định mức target (0.99x và 0.1x capacity). Nếu bị mất cân bằng tải, node sẽ thực hiện cân bằng tải theo các thuật toán: di chuyển server ảo một-một, threshold, k-choices và proportion. Code của các thuật toán cân bằng tải nằm chủ yếu ở file server.cc. Với việc gán giá trị cho tham số
activeLBmethod, ta sẽ chạy với thuật toán tương ứng. Nếu activeLBmethod =
‘t’ thì thuật toán cân bằng tải là di chuyển server ảo một-một. Nếu
activeLBmehthod = ‘g’ thì thuật toán cân bằng tải là threshold. Nếu
activeLBmehthod = ‘p’ thì thuật toán cân bằng tải là proportion. Nếu
activeLBmehthod = ‘k’ thì thuật toán cân bằng tải là k-choices. Còn nếu
activeLBmehthod = ‘-’ thì không sử dụng thuật toán cân bằng tải nào.