Nút tìm kiếm là nút A, id=7

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Sử dụng thông tin gần kề vị trí trong khảo duyệt Web theo phương thức mạng ngang hàng (Trang 64 - 69)

Giả sử nút A tìm kiếm quá trị id = 7, các bƣớc tìm kiếm sẽ nhƣ sau

Trƣớc hết, nút A gọi phƣơng thức L_find_successor(7) để tìm nút chịu trách nhiệm với giá trị 7 trên vòng L-Chord. Kết quả trả về của phƣơng thức này là nút C có khóa định danh là 8.

Tiếp theo, nút C sẽ tìm trong bảng ánh xạ của mình nút trên vòng V-Chord chịu trách nhiệm với giá trị 7. Sử dụng phƣơng thức V_find_mapped_node(7), nút

C sẽ tìm đƣợc nút thỏa mãn yêu cầu có id >= 7 là nút đứng thứ 2 trong bảng ánh xạ, đấy là nút A.

Nhƣ vậy, với nút tìm kiếm là nút A và giá trị cần tìm kiếm là id=7, thì quá trình tìm kiếm trên vòng V-Chord cho ra kết quả là nút A là nút chịu trách nhiệm với giá trị khóa 7.

4.1.4 Nút tham gia vào hệ thống

Trong mạng động, các nút có thể tham gia bất kì lúc nào. Mục đích chính của quá trình tham gia là duy trì khả năng định vị mọi khóa trong mạng. Để thực hiện đƣợc mục đích này, mạng phủ Chord cần đảm bảo các yêu cầu sau:

- Nút tiếp theo của mỗi nút phải đƣợc duy trì đúng.

- Với mọi khóa k, nút chịu trách nhiệm với khóa k phải chịu trách nhiệm khóa k.

Với mô hình D-Chord, do có 2 vòng L-Chord và V-Chord, nên các yêu cầu cần đảm bảo sẽ bao gồm:

- Trong vòng L-Chord, nút tiếp theo của mỗi nút phải đƣợc duy trì đúng. - Trong vòng L-Chord, mỗi nút phải duy trì đúng danh sách ánh xạ của mình. - Trong cả hai vòng, với mọi khóa k, nút chịu trách nhiệm với khóa k phải

chịu trách nhiệm khóa k.

Trong phần này, tác giả mô tả quá trình một nút tham gia vào hệ thống mạng D-Chord. Do mạng D-Chord là một cải tiến của mạng Chord nên các thuật toán sử dụng trong quá trình một nút tham gia vào hệ thống mạng D-Chord sẽ sử dụng các thuật toán của mạng Chord.

Để đảm bao các yêu cầu trên, một nút tham gia vào mạng D-Chord phải thực hiện các thao tác sau

- Khởi tạo giá trị predecessor, bảng fingers và danh sách ánh xạ của nút n. Cập nhật lại danh sách ánh xạ của nút tiếp theo nút n trên vòng L-Chord.

- Cập nhật bảng finger và các giá trị predecessor của các nút khác.

- Thêm nút n vào danh sách ánh xạ của các nút trên vòng L-Chord nếu cần thiết.

Chúng tôi giả định rằng trong vòng có một nút đƣợc công khai ra ngoài, gọi là nút bootstrap, (ví dụ là nút đƣợc ánh xạ vào một Tên miền thông qua DNS) mỗi nút n muốn tham gia vào vòng D-Chord sẽ liên hệ với nút bootstrap này.

Sau đây là thuật toán để một nút mới tham gia vào mang D-Chord

#define successor finger*1+.node

// nút n tham gia vào mạng // nút n’ là nút bootstrap n.join(n’) if (n’) L_init_finger_table(n’); L_update_others(); update_other_mapping_list (); else for i = 1 to m finger[i].node = n; predecessor = n; mapping_list = [];

// khởi tạo bảng finger

// n’ là một nút bất kì trong mạng

n. L_init_finger_table(n’)

finger[1].node = n’.L_find_successor(finger[1].start); predecessor = successor. predecessor;

successor. predecessor = n;

n. mapping_list = successor. L_update_ mapping_list _table(n);

for i = 1 to m-1

if (finger[i + 1].start in (n, finger[i].node)) finger[i+1].node = finger[i].node;

else

finger[i+1].node = n’.

L_find_successor(finger[I + 1].start);

// chia bảng L_parent của nút n theo n’,

// sử dụng để tách một phần bảng L_parent khi có nút mới tham gia // n’ là nút mới tham gia

n.L_update_ mapping_list _table(n’)

var ret_table = []; var old_id = n’;

if ((mapping_list [i].id <= n’) or (n’ in (old_id, mapping_list [i].id)))

ret_table.add(mapping_list [i]); else

break;

old_id = mapping_list[i].id;

while mapping_list [1].id <= n’

mapping_list.remove(mapping_list [1]); return ret_table;

// cập nhật bảng finger của các nút liên quan

n.L_update_others() for i = 1 to m p = L_find_predecessor(n – 2^(i-1)); p.L_update_finger_table(n, i); n. L_update_finger_table(s, i) if (s in (n, finger[i].node)) finger[i].node = s;

predecessor. L_update_finger_table(s, i);

// v_id khóa định danh của n trên vòng V-Chord

n.update_other_mapping_list()

p = L_find_ successor(v_id); p.V_ mapping_list _add(v_id, n);

// Thêm một nút n’ vào danh sách mapping_list của nút n // v_id là khóa định danh của n’ trên vòng V-Chord // n.l_id là khóa định danh của nút n trên vòng L-Chord

n.V_mapping_list_add(v_id, n’)

for i = mapping_list.size downto 1 if (mapping_list[i].id < v_id) if (mapping_list[i].id < n.l_id) V_mapping_list_insert(i, v_id, n’); V_mapping_list_standard(); return; V_mapping_list_insert(1, v_id, n’); V_mapping_list_standard(); predecessor. V_mapping_list_add(v_id, n’);

// chuẩn hóa lại danh sách ánh xạ của nút n

n.V_mapping_list_standard()

while (mapping_list[mapping_list.size - 1] >= n._l_id) mapping_list.del(mapping_list[mapping_list.size]);

for i = mapping_list downto pos

mapping_list[i + 1].id = mapping_list[i].id; mapping_list[i + 1].node = mapping_list[i].node; mapping_list[pos].id = v_id;

mapping_list[pos].node = n’;

Khi nút n tham gia vào hệ thống mạng D-Chord, trƣớc hết nút n sẽ tìm nút n’ là nút bootstrap đã có sẵn trong mạng, nút n sẽ gọi hàm join(n’). Trƣớc hết nút n sẽ kiểm tra n’ có tồn tại hay không, nếu n’ không tồn tại thì nút n sẽ thiết lập hệ thống mạng chỉ có một nút n. Nếu nút n’ tồn tại, nút n bắt đầu các phƣơng thức tham gia vào mạng D-Chord.

Trƣớc hết nút n sẽ cập nhật bảng finger và bảng danh sách ánh xạ (mapping_list) bằng cách gọi phƣơng thức L_init_finger_table(n’). Phƣơng thức này tƣơng tự với phƣơng thức có sẵn của vòng Chord, chúng tôi chỉ thêm phần cập nhật bảng danh sách ánh xạ bằng cách gọi câu lệnh L_update_ mapping_list _table(n) của nút successor và gán kết quả trả về vào danh sách ánh xạ của mình. Khi gọi hàm L_update_ mapping_list _table của nút succesor, nút successor sẽ lấy từ trong danh sách ánh xạ của mình ra các nút thuộc vùng chịu trách nhiệm của n và trả về cho nút n, sau đó nút successor sẽ loại bỏ các nút không còn trong vùng chịu trách nhiệm của mình.

Sau khi cập nhật bảng finger và danh sách ánh xạ thành công, nút n sẽ gọi phƣơng thức L_update_others(); để update bảng finger của các nút ảnh hƣởng. Quá trình này đƣợc lấy từ giao thức Chord chuẩn và chỉ có tác dụng trong vòng L- Chord.

Sau khi các nút cập nhật bảng finger thành công, lúc này nút n đã thành công tham gia vào vòng L-Chord, để nút n hoàn thành quá trình tham gia vào vòng V- Chord thì các nút phải thêm nút n vào danh sách ánh xạ của mình nếu vùng chịu trách nhiệm của nút đó trên vòng L-Chord có phần chung với vùng chịu trách nhiệm của nút n trên vòng V-Chord. Do đó, nút n sẽ gọi phƣơng thức update_other_mapping_list() để thực hiện quá trình này. Đầu tiên, nút n sẽ tìm kiếm trên vòng L-Chord nút p chịu trách nhiệm với giá trị V-id, là khóa định danh của n trên vòng V-Chord. Nút p sẽ thêm nút n vào danh sách ánh xạ của mình với vị trí xác định nhằm đảm bảo các nút trong danh sách ánh xạ tăng dần theo id. Trong trƣờng hợp nút n nằm đầu trong danh sách ánh xạ của nút p, nút p sẽ gọi hàm V_mapping_list_add(v_id, n) của predecessor để nút liền trƣớc nút p trong vòng L- Chord thêm nút n vào danh sách ánh xạ.

Sau khi các nút cập nhật thành công danh sách ánh xạ của mình, nút n đã hoàn thành quá trình tham gia vào vòng V-Chord. Nhƣ vậy nút n đã hoàn thành

tham gia vào 2 vòng V-Chord và L-Chord, tức là đã hoàn thành quá trình tham gia vào mạng D-Chord.

Sau đây, chúng tôi xin đƣa ra một ví dụ mô tả quá trình một nút tham gia vào hệ thống mạng D-Chord trong hình 18. Chúng tôi sử dụng ví dụ đã đề cập từ trƣớc với trƣờng hợp nút D chƣa tham gia vào hệ thống.

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Sử dụng thông tin gần kề vị trí trong khảo duyệt Web theo phương thức mạng ngang hàng (Trang 64 - 69)

Tải bản đầy đủ (PDF)

(90 trang)