d. Tham gia và ổn định mạng
2.2.4 Khả năng các node không cân bằng
Trong thực tế các nút tham gia vào mạng thường rất đa dạng và có khả năng (CPU, Storage, Bandwidth) là khác nhau, có những node khi tham gia vào mạng là những máy tính đời cũ kết nối Internet chậm (Dial Up), nhưng cũng có những máy tham gia vào mạng là các máy có cấu hình mạnh kết nối internet băng thông rộng(ADSL). Saroui và đồng nghiệp đã nghiên cứu 2 hệ thống chia sẻ files nổi tiếng là Napster và Gnutella cho thấy mức độ chênh lệch về khả năng của các node có thể lên tới 3, thậm chí là 5 lần. Trong một thực tế như vậy, nếu các vùng mà được gán cho các node yếu thì cho dù phân bố lưu trữ các files dữ liệu và truy vấn trong hệ thống đạt được sự đồng đều thì vẫn xảy ra sự mất cân bằng tải nghiêm trọng.
Hình 11.Khả năng các nút không cân bằng 2.2.5 Nhận xét
Với những nguyên nhân đã nêu ở trên thì rõ ràng việc phân tán tải đồng đều trên hệ thống không thể chỉ đơn giản dựa vào các hàm băm. Những kĩ thuật khác nhằm mục đích cân bằng tải giữa các node cần được đưa vào áp dụng.
2.3 Các giải pháp cân bằng tải
Đã có nhiều nghiên cứu về cân bằng tải được các tác giả đưa ra cho hệ thống mạng P2P dựa trên DHT. Nói chung, các giải pháp này được phân thành hai hướng chính: hướng tiếp cận dựa trên server ảo (virtual server) và hướng tiếp cận không dựa trên server ảo. Trong mục này luận văn xin được trình bày về một số thuật toán theo hai hướng tiếp cận trên.
- node - data
2.3.1 Hướng sử dụng server ảo
Theo hướng này mỗi node vật lý quản lý một hoặc nhiều server ảo với các định danh ngẫu nhiên được chọn từ không gian định danh. Các server ảo hoạt động như các node tham gia mạng DHT. Trong một hệ thống với các node có khả năng đồng đều cao, mỗi node vật lý cần duy trì O(logn) server ảo để làm giảm nhân tố mất cân bằng xuống đến một hằng số. Với một hệ thống DHT gồm nhiều node có khả năng chịu tải khác nhau, mỗi node vật lý sẽ chọn một số lượng server ảo tỷ lệ với khả năng của nó. Sau đây luận văn xin trình bày một số thuật toán cân bằng tải thực hiện theo hướng này.
a. Sử dụng Log(N) Virtual Servers
Tư tưởng của giải thuật cân bằng tải này khá đơn giản, đó là: sử dụng log(N)VS[4] cho mỗi node để cân bằng các không gian định danh node. Giải thuật này được xây dựng dựa trên thực tế là các định danh node không được phân bố một cách đồng đều trên toàn bộ không gian định danh mà có phân bố rất gần với dạng phân bố Poisson.
Log(N) VS mặc định tải được phân bố trong không gian định danh một cách đồng đều và khả năng các node là như nhau. Chính vì vậy, nếu mỗi node có 1 VS thì dẫn tới khả năng một số node sẽ gặp phải tình trạng “nghẽn cổ chai” (nguyên nhân mất cân bằng tải thứ nhất đã nêu ở trên).
Theo Lí thuyết giới hạn trung tâm (Central Limit Theorem), nếu số lượng VS của mỗi node càng tăng lên thì các định danh node được phân bố đồng đều hơn trong không gian định danh. Điều này đồng nghĩa với việc mức độ cân bằng tải trong hệ thống càng cao hơn. Tuy nhiên, việc mỗi node vật lí có quá nhiều VS sẽ dẫn tới việc tăng thông tin quản trị nên giải thuật này đã đưa ra giải pháp là mỗi node sẽ có log(N) VS. Ví dụ minh họa ở hình 12 cho thấy, trong quá trình ra nhập mạng, mỗi node tự hình thành một số VS và mỗi VS ra nhập hệ thống một cách độc lập.
Hình 12.Cân bằng tải sử dụng Log(N) Virtual Servers
Đánh giá: Log(N) VS đơn giản và hoạt động tốt với giả thiết rằng sự phân bố về tải là đồng đều nhau và các node có khả năng như nhau. Tuy nhiên, việc tăng thêm số lượng VS sẽ làm nảy sinh một số vấn đề.
Thứ nhất, khi các node ra/vào mạng thường xuyên, chúng phải mang theo các VS của node đó và sẽ dẫn tới mất log(N) lần điều chỉnh.
Thứ hai, mỗi node phải tăng thêm log(N) lần việc lưu trữ thông tin quản trị VS cũng như thông tin tìm kiếm. Bên cạnh đó, số bước tìm kiếm cũng tăng lên khi hệ thống có nhiều VS hơn.
b. Phương pháp Proportion
Giải thuật Proportion[4] đề cập tới việc giải quyết vấn đề các nút tham gia hệ thống có khả năng khác nhau. Với giải thuật này, khi tham gia vào mạng mỗi nút vật lý sẽ tạo ra một số lượng các VS tuỳ theo khả năng của nút. Bên cạnh đó, thông tin về tải trước đó cũng được tính đến. Sau bước đầu tiên này, mỗi nút sẽ tự tính toán việc thêm hoặc bớt tải mà không liên hệ với bất cứ node nào khác
Mỗi node sau khi đã tham gia hệ thống sẽ định thời chạy thuật toán Proportion-Adjust để tự tạo mới hoặc loại bỏ một số VS. Nếu một node đã quá tải và đang có nhiều hơn 1 VS, nó sẽ chọn VS chịu tải ít nhất có thể làm cho node trở thành nhẹ tải để loại bỏ (dòng 2-3 của giải thuật ). Nếu một node là nhẹ tải, nó sẽ tạo thêm 1 VS nếu điều đó không làm nó trở thành nặng tải (dòng 4-6). Hình 13 mô tả một cách trực quan quá trình loại bỏ hay tạo mới VS của một node.
PROPORTION-ADJUST()
1 (Initially create VSs in proportion to capacity )
2 if overloaded and VSset.size > 1
4 if underloaded and . W W U VSet size
5 and VSset.size < VSset.maxsize 6 then Create VS.id h(x + VSset.size )
Hình 13. Tạo mới VS (a) và loại bỏ VS (b)
Đánh giá: Thuật toán Proportion cho phép các node có khả năng khác nhau khi tham gia vào hệ thống có thể linh hoạt điều chỉnh tải cho mình, điều đó giúp thực hiện việc cân bằng tải cho hệ thống. Tuy nhiên, việc các node độc lập thực hiện điều chỉnh tải có một số nhược điểm. Trước hết, một node chỉ với một vài VS thì không thể đánh giá một cách chính xác về hiệu quả của việc tạo ra 1 VS mới. Bên cạnh đó, nếu một node quá tải và loại bỏ 1 VS của nó thì điều này có thể gây nên tình trạng nặng tải với các node khác và dẫn tới việc phải loại bỏ hàng loạt VS. Cuối cùng, khi toàn hệ thống đang ở tình trạng nhẹ tải, thuật toán sẽ dẫn tới việc tất cả các node tạo ra số lượng tối đa VS cho phép, điều này sẽ làm tăng đáng kể số bước tìm kiếm hoặc tình trạng mất ổn định khi các node ra khỏi mạng (vì khi một node rời mạng thì các VS của nó sẽ bị loại bỏ).
c.Phương pháp di chuyển Virtual Server (Transfer)
Giải thuật Transfer[4] hướng vào việc điều chỉnh tải của các node trong hệ thống theo phương pháp “động”. Nguyên tắc của giải thuật này như sau: Mỗi node vật lí chọn một số lượng nhất định các định danh và mỗi định danh sẽ được dành cho một VS. Các node nặng tải sử dụng thuật toán Transfer liên hệ với các node nhẹ tải để yêu cầu được di chuyển một phần tải của mình (thực chất là gán lại VS giữa các node này). Giả sử gọi node h là nặng tải, node l là nhẹ tải. Việc di chuyển các VS v giữa các node phải thỏa mãn các ràng buộc sau:
1. Việc di chuyển v từ h sang l không làm cho l thành node nặng tải. 2. v là VS “nhẹ nhất” có thể di chuyển để h trở thành nhẹ tải.
3. Nếu không có VS nào có thể di chuyển để h trở thành nhẹ tải thì di chuyển VS “nặng nhất” từ h sang l.
Thuật toán Transfer được minh họa tại Hình 14
Hình 14. Node nặng tải di chuyển VS sang node nhẹ tải (nếu chỉ có 1 VS mà vẫn nặng tải thì sẽ chia làm 2 VS để di chuyển)
TRANSFER()
1 if !overloaded
2 then return
3 if VSset.size > 1
4 then Contact node n at random
5 Choose v VSset such that:
6 (a) Transferring v to n will not overload n
7 (b) v is the least loaded virtual server 8 that will halt overload;
9 Failing that, let v be most loaded VS 10 else v VSset [0] 11 Create VS.id . is ( ( ), ) 2 d t pred v v v id mod D 12 TRANSFER
Giải thuật Transfer có 03 phương pháp di chuyển VS, đó là: “one-to-one”, “one-to-many”, “many-to-many”[2].
Phương pháp One – to – One
Phương pháp đầu tiên dựa trên quan hệ 1-1, 2 nút được lấy một cách ngẫu nhiên. Một server ảo dịch chuyển được khởi tạo nếu như một nút là chịu tải nặng nút còn lại chịu tải nhẹ.
Hình 15. Phương pháp One - to - One
Phương pháp này dễ dàng thực hiện trong một mô hình phân tán. Mỗi nút chịu tải nhẹ có thể định kỳ lấy 1 ID ngẫu nhiên rồi sau đó thực hiện thao tác tìm kiếm để tìm ra nút chịu trách nhiệm với ID đó. Nếu nút đó là nút chịu tải nặng thì một sự dịch chuyển có thể thực hiện giữa 2 nút.
Trong phương pháp này chỉ có nút chịu tải nhẹ mới thực hiện thăm dò; Nút tải nặng không thực hiện bất cứ thăm dò nào. Đặc điểm của phương pháp này:
- Các nút tải nặng được giảm bớt sức nặng của việc thăm dò.
- Khi một hệ thống tải rất nặng và hầu hết các nút chịu tải nặng không có sự nguy hiểm nào cho việc tải của mạng khác hoặc bị thất bại.
- Nếu tải của một nút tương ứng với độ dài của không gian ID mà nút đó sở hữu một đầu dò ngẫu nhiên sẽ được thực hiện bởi nút tải nhẹ để tìm ra nút tải nặng.
Phương pháp One – to – Many
Không giống như phương pháp đầu tiên phương pháp này cho phép tại một thời điểm 1 nút tải nặng xem xét nhiều hơn một nút tải nhẹ.
Lấy h biểu thị cho nút tải nặng và lấy l1, l2,...,lk là một tập các nút tải nhẹ được xem xét bởi h. với mỗi cặp (h,li) chúng ta lấy một server ảo vi. Chọn nút tải nhẹ nhất mà làm cho nút h tải nhẹ, nếu không có server như vậy số lượng các server vi (1≤i≤k) được dịch chuyển.
Chúng ta thực hiện phương pháp này bằng việc duy trì các Directory mà lưu trữ thông tin tải về một tập các nút tải nhẹ trong hệ thống. Sử dụng hệ thống DHT giống nhau để lưu trữ các Directory này. Giả sử rằng có d Directory trong hệ thống. Một nút tải nhẹ l được băm vào một Directory bằng việc sử dụng một hàm băm tốt h’ mà cho ta giá trị trong đoạn [0,d). Một Directory i được lưu trữ tại nút chịu trách nhiệm với ID h(i), ở đó h là một hàm băm khác.
Hình 16. Phương pháp One - to - Many
Một nút chịu tải nhẹ l sẽ thông báo định kỳ tới tải đích và tải hiện tại để nút i=h(h’(l)), nút chịu trách nhiệm cho Directory h’(l). Lần lượt, các nút tải nặng sẽ định kỳ lấy mẫu các Directory đang tồn tại. Một nút tải nặng n lấy ngẫu nhiên k[0,d] và gửi thông tin về tải đích của nó và tải của tất cả các server ảo tới nút j=h(h’(k)). Ở trên nhận như là một thông báo, nút j như là nút chịu tải nhẹ trong Directory của nó, để tìm ra server ảo tốt nhất mà có thể dịch chuyển từ n tới một nút chịu tải nhẹ trong Directory của nó. Quá trình xử lý này sẽ lặp lại cho đến khi tất cả các nút trở thành tải nhẹ.
Phương pháp Many – to – Many
Phương pháp này là sự mở rộng của hai phương pháp trên. Trong khi phương pháp thứ nhất chúng ta thấy phù hợp với một nút chịu tải nặng và một nút chịu tải nhẹ, ở phương pháp thứ 2 phương pháp phù hợp với một nút chịu tải nặng và nhiều nút chịu tải nhẹ, trong phương pháp này chúng ta thấy nó phù hợp với nhiều nút chịu tải nặng và nhiều nút chịu tải nhẹ.
Phương pháp này cho phép nhiều nút chịu tải nặng và nhiều nút chịu tải nhẹ tương tác lẫn nhau, chúng ta sử dụng khái niệm “Global pool” của các server ảo, một bước trung gian di chuyển các server ảo từ một nút chịu tải nặng tới một nút chịu tải nhẹ. “Pool” là một cấu trúc dữ liệu được sử dụng để tính toán vị trí cuối cùng; không có tải nào thực sự bị di chuyển cho đến khi thuật toán kết thúc.
Đánh giá: Một ưu điểm quan trọng của giải thuật này là sự linh hoạt trong việc di chuyển VS từ node này sang node khác (không chỉ giới hạn ở các node hàng xóm). Bên cạnh đó, giải thuật cũng rất phù hợp với việc sử dụng bảng băm phân tán vì việc di chuyển VS cũng giống như việc một node vào (join) hay ra khỏi
(leave) hệ thống DHT. Tuy nhiên, phương pháp này bộc lộ 02 nhược điểm quan trọng.
Thứ nhất, việc duy trì các Directory D ở các node vật lí làm mất đi một đặc điểm quan trọng của hệ thống đó là tính phân tán vì thực chất một số nodes phải liên hệ với Directory D để lấy thông tin theo hình thức “tập trung” (tương tự như Client/Server). Trong trường hợp node chứa Directory D gặp sự cố, vấn đề cân bằng tải của khu vực này chắc chắn sẽ bị ảnh hưởng nghiêm trọng.
Thứ hai, node chứa Directory D là xác định, ít thay đổi nên đây chính là điểm yếu dễ bị tấn công, và hậu quả tương nhự như ở nhược điểm thứ nhất, vấn đề cân bằng tải không thể thực hiện được
Nhận xét
Qua việc phân tích và đánh giá về các giải thuật cân bằng tải tiếp cận theo hướng sử dụng server ảo luận văn nhận thấy, giải pháp sử dụng server ảo còn tồn tại một số yếu điểm, chẳng hạn như để quản lý được các server ảo thì mỗi node phải duy trì khá nhiều liên kết đến các server ảo đó, thông thường số liên kết này là O(logn).
2.3.2 Hướng không sử dụng server ảo
Theo hướng này mỗi định danh trong không gian địa chỉ sẽ tương ứng với một node vật lý trong mạng. Để đạt được sự cân bằng trong hệ thống các giải pháp đưa ra đều phải dịch chuyển định danh của các node trong hệ thống khi có một node tham gia hoặc rời khỏi hệ thống. Một thuật toán điển hình đi theo hướng này đó là cân bằng tải theo ngưỡng.
Thuật toán cân bằng tải theo ngưỡng
Thuật toán cân bằng tải theo ngưỡng luôn duy trì được tải của mỗi node dưới một ngưỡng nào đó. Một node trong mạng sẽ cố gắng chuyển tải cho các node khác khi tải của nó tăng quá ngưỡng . Xét một dãy các ngưỡng
i i
T c với i ≥ 1 và c là một hằng số nào đó. Khi tải của một node vượt quá ngưỡng Tj, node đó sẽ khởi tạo thuật toán cân bằng tải theo ngưỡng.
Hình 17.(a) Node A chuyển tải cho node láng riềng B và (b) Chuyển định danh của node C vào giữa A và B. Độ cao của mỗi hình tương ứng là biểu diễn tải của các
node.
Ý tưởng của thuật toán cân bằng tải theo ngưỡng được mô tả như sau: khi tải của một node n trong mạng vượt quá một ngưỡng Tj nào đó thì đầu tiên nó cố gắng chuyển tải cho một trong hai láng riềng có tải nhỏ hơn. Nếu cả hai láng riềng đều có tải lơn hơn và không thể nhận được tải nữa thì nó tìm một node nhẹ tải trong mạng và có tải nhỏ nhất, nhờ node này nhận tải hộ bằng cách dịch chuyển định danh của node nhẹ tải vừa tìm được vào giữa node n và predecessor của n. Để tìm một node nhẹ tải, node n phát một thông điệp hỏi successor của n, successor của n tính toán tải của nó và gửi trả lời node n nếu nó thỏa mãn điều kiện node nhẹ tải có thể dịch chuyển được. Ngược lại, successor của n phát tiếp thông điệp để hỏi node tiếp theo trong vòng Chord (node tiếp theo theo chiều kim đồng hồ). Quá trình này tiếp tục cho đến khi tìm được một node nhẹ tải thỏa mãn điều kiện, hoặc là duyệt hết các node mà không tìm được node nào thỏa mãn.
Đã có một số tác giả đề xuất phương pháp cân bằng tải theo hướng này, cụ thể là:
Theo tác giả H. Feelif, M. Kitsuregawa, and B. C. Ooi: