Chương 1 KIẾN THỨC NỀN TẢNG
1.4. Mạng ngang hàng có cấu trúc
1.4.2. Mạng ngang hàng Chord
Chord là một trong những giao thức mạng ngang hàng có cấu trúc phổ biến nhất được xây dựng dựa trên bảng băm phân tán. Trong Chord, khóa của một tệp tin được quản lý bởi một nút trong mạng. Tùy thuộc vào ứng dụng, dữ liệu liên quan đến khóa có thể được lưu trữ tại nút quản lý khóa. Chord sử dụng phương pháp băm đồng nhất để tạo định danh dữ liệu và định danh của nút, phương pháp này tạo ra một phân bố tương đối đều các khóa vào các nút trong mạng. Kích thước của khơng gian khóa là một số ngun m bit, m là đủ lớn để xác suất cho hai nút hoặc hai định danh của dữ liệu trùng nhau là rất nhỏ. Do các khóa được phân bố tương đối đồng đều cho các nút cho nên khi một nút tham gia hoặc rời mạng thì chỉ có một số nhỏ các khóa chuyển từ nút này sang nút khác, điều này tạo nên một sự cân bằng tương đối trong mạng.
Chord khắc phục các vấn đề hay gặp trong mạng ngang hàng:
- Cân bằng tải: giao thức Chord phân phối số lượng khóa đồng đều đến từng nút, thơng qua đó gián tiếp mang lại hiệu quả cân bằng tải.
- Tính phân tán: mạng ngang hàng Chord là hệ thống phân tán hồn tồn, vai trị của các nút trong mạng là như sau. Mạng ngang hàng Chord có tính ổn định cao.
- Khả năng mở rộng: Trong mạng ngang hàng Chord, một nút chỉ lưu trữ thông tin về một số nút khác trong mạng, điều này làm cho mạng Chord hoạt động hiệu quả, đặc biệt là khả năng mở rộng mạng. Với một mạng gồm N nút, mỗi nút chỉ cần duy trì thơng tin về O(logN) các nút khác và mỗi truy vấn chỉ yêu cầu O(logN) thông điệp để định tuyến, do đó có thể đáp ứng cả với những hệ thống rất lớn.
- Khả năng chịu lỗi: Chord có khả năng tự điều chỉnh các bảng định tuyến trên mỗi nút để thích ứng với sự vào ra liên lục của các nút trong mạng. Chord đảm bảo với mỗi một khóa bất kỳ đều có một nút tương ứng, chịu trách nhiệm về khóa đó.
- Khả năng đặt tên linh hoạt: Chord khơng có bất kỳ ràng buộc nào trên cấu trúc khóa mà nó tìm kiếm. Điều này tạo cho các ứng dụng sử dụng Chord khả năng tùy biến trong việc gán tên với các khóa của Chord.
1.4.2.1. Mơ hình của Chord
Các nút trong mạng Chord được tổ chức thành dạng một vòng tròn. Định danh của các nút bắt đầu từ 0 đến 2m-1, m là số bit biểu diễn độ lớn của khơng gian khóa. Khóa k được quản lý bởi nút đầu tiên có định danh bằng hoặc lớn hơn k. Nút đó được gọi là nút successor của khóa k hay successor(k). Successor của một khóa chính là nút gần nhất theo chiều kim đồng hồ tính từ
Hình 1.5. Vịng Chord với độ dài khơng gian khóa là 6 bit
Hình 1.5 mơ tả một vịng Chord với m=6, có chứa 10 nút và 5 khóa. Successor của định danh 10 là nút 14 do đó khóa k10 được đặt ở nút n14.
Tương tự khóa k24 và k30 được đặt ở nút n32, khóa k38 tại nút n38 và khóa k54 tại nút n56.
Kĩ thuật băm đồng nhất được sử dụng trong Chord để giảm thiểu sự ảnh hưởng trong mạng khi có nút tham gia hoặc rời mạng. Khi nút n tham gia vào mạng, một số khóa được đặt tại successcor của n chuyển sang cho nút n quản lý. Trong ví dụ trên, nếu có một nút với định danh 26 tham gia vào mạng, nó nhận được khóa k24 chuyển từ nút n32.
Successor của một nút là nút tiếp sau nút đó trên vịng Chord, predecessor là nút liền trước nút đó trên vịng Chord.
Tìm kiếm đơn giản: Mỗi nút duy trì một liên kết đến nút successor của
nó. Truy vấn với khóa k được chuyển từ nút khởi tạo truy vấn đi qua các nút
successor cho đến khi gặp nút quản lý khóa k.
Hình 1.6. Tìm kiếm đơn giản trên Chord
Hình 1.6 (a) là đoạn giả mã tìm kiếm nút quản lý khóa k của nút n. Đầu
tiên nó kiểm tra xem khóa k có nằm trong khoảng của n và successor của n
hay không. Nếu k nằm giữa n và successor của nó thì find_successor trả lại successor của n. Ngược lại, n nhờ nút successor của n tìm kiếm nút quản ký
khóa k.
Trong hình 1.6 (b), nút n8 thực hiện truy vấn với khóa k54. Nút n8 gọi
hàm find_successor(k54), kết quả trả về là nút n56 (successor của khóa k54).
Truy vấn được chuyển tiếp lần lượt qua tất cả các nút trên vòng tròn nằm giữa nút n8 và n56.
Tìm kiếm nâng cao: Số lượng thơng điệp trong tìm kiếm đơn giản tỷ lệ
tuyến tính với số nút trong mạng. Để giảm thời gian tìm kiếm, Chord bổ sung thêm một số thông tin phục vụ việc định tuyến. Với khơng gian khóa có kích thức m bit, mỗi nút n duy trì một bảng định tuyến gồm m hàng, được gọi là
chứa định danh của nút n' sao cho n' là nút đầu tiên tiếp sau khóa n+2i-1 trong vịng trịn định danh, n'=successor(n+2i-1), với 1 ≤ i ≤ m. n' gọi là finger thứ i của nút n. Finger đầu tiên của một nút chính là successor của nút đó.
Hình 1.7. Bảng finger của nút n8
Hình 1.7 biểu diễn bảng định tuyến của nút n8. Finger đầu tiên trỏ đến
nút n14 do 14 là nút liền sau (8+20) mod 26 = 9. Tương tự finger cuối cùng của nút n8 trỏ đến nút n42 do 42 là nút liền sau (8+25) mod 26 = 40.
Với cách tổ chức như vậy, mỗi nút chỉ lưu thông tin về một số giới hạn các nút có trong mạng và chỉ biết một số nút nằm gần với nó.
Hình 1.8 là đoạn giả mã sử dụng bảng định tuyến để tìm successor của định danh id. Nếu id nằm giữa định danh n và định danh successor của nó thì
find_successor trả lại định danh successor của n. Ngược lại, n tìm kiếm trong
bảng định tuyến nút n’ có định danh ngay sau id theo ngược chiều kim đồng hồ và thực hiện hàm find_successor trên nút n’.
Hình 1.8. Giả mã của phương pháp tìm kiếm nâng cao
Trong hình 1.9, nút n8 tìm kiếm successor của khóa k54. Nút n42 là nút
gần khóa k54 nhất trong bảng định tuyến của nút n8, cho nên nút n8 thông qua
nút n42 để chuyển tiếp câu truy vấn. Tương tự truy vấn chuyển qua nút n51 và đến đích là nút n56.
1.4.2.3. Tham gia và ổn định mạng
Mạng Chord phải giải quyết các vấn đề với việc một nút mới tham gia vào mạng, rời khỏi mạng và đột ngột rời khỏi mạng. Để tham gia vào mạng, nút n thông qua nút n' đã tồn tại trong mạng. Nút n' thực hiện hàm
find_successor với tham số đầu vào là định danh id của nút n, truy vấn trả lại
kết quả nút n'' là successor của nút n. Kết thúc truy vấn, nút n biết được nút successor n'' của nó. Nút n thông báo cho nút successor n'' về sự hiện diện của nó trong mạng để nút n'' cập nhật lại con trỏ predecessor đến nút n. Nút n khởi tạo bảng định tuyến và điền thông tin vào bảng định tuyến bằng cách sử dụng hàm find_successor. Cuối cùng các khóa được quản lý bởi nút n'' có định danh nhỏ hơn hoặc bằng n được chuyển về cho nút n quản lý.
Chord sử dụng giao thức stabilization để kiểm tra tính hợp lệ và cập nhật con trỏ successor khi một nút tham gia và rời khỏi mạng. Giao thức stabilization yêu cầu bổ sung thêm một con trỏ predecessor và được thực hiện
định kỳ trên mỗi nút. Hàm stabilize() trên nút n yêu cầu nút successor của n
trả lại nút predecessor p. Nếu p bằng n, n và successor của n thống nhất với
nhau về con trỏ successor và predecessor tương ứng. Nếu p nằm giữa n và successor của n, điều đó chứng tỏ p là nút vừa tham gia vào hệ thống và là successor của n, vì vậy nút n cập nhật con trỏ successor là nút p và thông báo
cho nút p cập nhật con trỏ predecessor là nút n.
nhất quán giữa con trỏ successor và predecessor thông qua hàm stabilize().
Sau khi nút n xác định được predecessor, nó sao chép tất cả các khóa mà nó quản lý, các khóa giữa predecessor(n) và n.
Ở giai đoạn này, tất cả các con trỏ successor được cập nhật và các truy
vấn có thể được định hướng đến đích. Vì nút mới n khơng có trong bảng tìm đường của các nút khác, cho nên các truy vấn được chuyển tiếp qua
predecessor của n. Sau đó, predecessor của nút n chuyển tiếp truy vấn đến n
thông qua con trỏ successor của nó. Nhiều nút tham gia mạng đồng thời có
thể dẫn đến nhiều chuyển tiếp tuyến tính thơng qua con trỏ successor.
Số lượng các nút trong bảng tìm đường cần được cập nhật là O(logN),
với N là số nút trong hệ thống. Để tối ưu hóa chi phí cập nhật bảng tìm đường khi các nút ra vào mạng nhiều, mỗi nút chạy thủ tục fix_finger() một cách
định kỳ để cập nhật bảng tìm đường. Nó chọn một hàng ngẫu nhiên trong bảng tìm đường tại vị trí i (1 <i ≤ m) và kiểm tra tính đúng đắn của successor hiện tại của n+2i -1.
Khi một nút n chủ động rời mạng, các khóa do n quản lý được chuyển
cho nút successor của n và thông báo cho các nút successor và predecessor n
biết về việc n rời mạng. Điều này đảm bảo dữ liệu không bị mất và thông tin định tuyến trong bảng tìm đường khơng bị thay đổi.
Chống lỗi và tạo bản sao: Khi một nút n đột ngột rời mạng sẽ gây ra
việc mất mát các khóa, do đó một số nút sẽ khơng truy vấn được các khóa bị mất. Chord giải quyết vấn đề này bằng cách mỗi nút lưu thêm thông tin một danh sách các nút nằm sau nó trong vịng Chord. Nếu một nút n đột ngột
không liên lạc được với successor thì nó sẽ sử dụng các nút liền sau trong
danh sách đó. Do đó, một khóa và dữ liệu sẽ chỉ bị mất khi có log2(N)+1 các nút trong danh sách đồng thời rời khỏi mạng.