Chord [11],[12] là một trong những giao thức phổ biến nhất được sử dụng trong bảng băm phân tán. Mạng Chord hỗ trợ khả năng gán tương ứng một key cho trước
38
với một nút mạng. Tùy thuộc vào ứng dụng sử dụng Chord, nút đó có thể đảm nhiệm nhiệm vụ lưu trữ dữ liệu được gán với khóa đó. Chord sử dụng phương pháp consistent hashing, gián tiếp thực hiện việc cân bằng tải giữa các nút do mỗi nút được gán với một số lượng key tương đương nhau. Việc tham gia và rời khỏi mạng sẽ chỉ khiến cho một số nhỏ các key chuyển từ nút này sang nút khác. Đặc điểm khiến Chord trở nên thông dụng chính là khả năng mở rộng mạng. Trong khi với các thuật toán trước đó một nút cần phải duy trì thông tin về nhiều nút khác trong mạng thì Chord chỉ cần một số lượng cố định. Chính điều này giúp cho Chord có thể hoạt động hiệu quả trong mạng có số lượng các nút lớn. Chord được đưa ra nhằm giải quyết các vấn đề thường gặp trong mạng ngang hàng, đó là:
- Cân bằng tải - Phân tán
- Khả năng mở rộng - Khả năng chịu lỗi.
- Khả năng đặt tên linh hoạt
Giao thức Chord cung cấp khả năng tính toán phân tán một cách nhanh chóng nhằm ánh xạ một khóa với nút tương ứng. Chord gán các khóa vào các nút bằng cách sử dụng phương pháp consistent hashing, phương pháp này có một số khả năng cần thiết cho giao thức Chord. Với xác suất cao hàm băm sẽ phân bổ đều khóa đến các nút (các nút ban đầu nhận được cùng một số lượng khóa. Điều này giúp cho mạng luôn giữ được một mức cân bằng tương đối.
Chord nâng cao khả năng mở rộng của phương pháp consistent hashing bằng cách không yêu cầu một nút phải biết tất cả các nút còn lại trong mạng. Một nút chỉ cần biết một số thông tin định tuyến giới hạn về một số nút khác. Bởi vì thông tin này là phân tán do đó một nút tiến hành hàm băm bằng cách liên hệ với các nút khác.
a. Mô hình của Chord
Các nút trong mạng Chord tạo lên một mạng logic dạng vòng tròn có các vị trí nút từ 0 đến 2m-1. Khóa k được gán cho nút đầu tiên có định danh bằng hoặc lớn hơn định danh của k. Nút đó được gọi là nút successor của khóa k hay successor(k). Trong
39
vòng định danh của Chord 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ừ khóa k.
Hình 3.2. Mô hình vòng Chord với khóa có chiều dài 6 bit [11]
Trong hình 3.2 là vòng Chord với m=6. Vòng Chord có chứa 10 nút và 5 khóa. Successor của định danh 10 là nút 14 do đó key 10 sẽ được đặt ở nút 14. Tương tự khóa 24 và 30 sẽ được đặt ở nút 32, khóa 38 tại nút 38 và khóa 54 tại nút 56.
Kĩ thuật consistent hashing được thiết kế để việc các nút tham gia hay rời khỏi mạng sẽ tạo ra ít ảnh hưởng nhất. Để duy trì bảng mapping khi một nút n tham gia vào mạng, một số khóa trước đây được đặt tại successcor của n sẽ chuyển sang cho nút n. Trong ví dụ trên, nếu có một nút với định danh 26 tham gia vào mạng, nó sẽ nhận được khóa 24 chuyển từ nút 32. 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 trên vòng Chord.
b. Tìm kiếm trong mạng Chord
Tìm kiếm đơn giản: Đây là thuật toán tìm kiếm đơn giản nhất trong Chord.
Thuật toán này chỉ yêu cầu các nút biết được successor của mình. Truy vấn cho một định danh được chuyển xung quanh vòng Chord qua các nút successor cho đến khi gặp nút có chứa khóa với định danh cần tìm.
40
Hình 3.3. Quá trình tìm kiếm đơn giản trên Chord
Trong hình 3.3 là ví dụ khi nút 8 thực hiện truy vấn cho khóa có định danh 54. Nút 8 gọi hàm find_successor cho khóa 54, kết quả trả về là nút 56 – successor của khóa 54 này. Truy vấn được chuyển lần lượt qua tất cả các nút trên vòng nằm giữa nút 8 và 56.
Mở rộng khả năng tìm kiếm: Thuật toán tìm kiếm ở trên sử dụng một số lượng
thông báo tương ứng tuyến tính với số nút có trong mạng. Để tăng tốc độ quá trình tìm kiếm Chord sử dụng thêm một số thông tin định tuyến. Tương tự như trên, ví dụ định danh của mỗi nút và khóa có độ dài m bit. Mỗi nút n duy trì một bảng định tuyến chứa m mục, được gọi là bảng finger. Mục thứ i trong bảng của nút n chứa định danh của nút s sao cho s là nút đầu tiên trên vòng tiếp sau khóa n+2i-1
s=successor(n+2i-1), với 1 ≤ i ≤ m (lấy số dư với modun 2m). Ta gọi s là finger thứ i của nút n. Finger đầu tiên của một nút cũng chính là successor của nút đó.
41
Hình 3.4. Bảng finger của nút 8
Hình 3.4 thể hiện bảng finger của nút. Finger đầu tiên được trỏ đến nút 14 dó 14 là nút liền sau (8+20) mod 26 = 9. Tương tự finger cuối cùng của nút 8 trỏ đến nút 42 do 42 là nút liền sau (8+25) mod 26 = 40. Có thể dễ nhận xét thấy với các thiết lập như vậy: một nút chỉ lưu thông tin về một số giới hạn các nút có trong mạng, một nút cũng chỉ biết đến một số nút nằm gần với nó. Một nút cũng không lưu trữ đủ thông tin để có thể ngay lập tức tìm được successor của một khóa k.
c. Quá trình tham gia và ổn định mạng
Trên thực tế, mạng Chord cần phải giải quyết các vấn đề như 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 một nút n thực hiện truy vấn tìm kiếm cho chính id của nó thông qua một số nút ban đầu đã tham gia vào mạng và tự đưa nó vào vòng Chord, ở vị trí nằm giữa successor s và predecessor của s thông qua quá trình ổn định mạng. Bảng finger của n được khởi tạo bằng cách sao chép bảng finger của của s hoặc để s lần lượt tìm kiếm các finger cho n. Các nút cần thay đổi bảng finger khi có sự tham gia của n sẽ lần lượt thực hiện việc này thông qua quá trình ổn định mạng chạy định kỳ. Cuối cùng các khóa đang được giữ bởi s, có id nhỏ hơn hoặc bằng n sẽ được chuyển qua n.
Khi một nút tự nguyện dời khỏi mạng, tất các khóa (các item liên quan đến khóa) được chuyển cho successor, sau đó thông báo cho successor và predecessor. Bảng finger trên các nút khác sẽ dần dần được điều chỉnh thông qua quá trình ổn định mạng định kỳ.
42
d. Một số phương thức cơ bản của giao thức Chord
- Put (filename): Khi muốn Upload một tệp tin vào hệ thống, Client gửi yêu cầu kết nối (đăng ký- đăng nhập) vào hệ thống. Đăng nhập thành công thì gửi yêu cầu muốn chia sẻ tệp tin vào hệ thống. Cache Manager tạo thành tệp <filename>.txt, băm tên tệp để xác định vị trí node phù hợp để lưu trữ thông tin liên quan đến tệp tin và thực hiện việc gửi tệp tin vào hệ thống bằng phương thức put(filename) của giao thức Chord.
- Get (filename): Client muốn lấy nội dung tệp tin nào đó bằng cách gửi yêu cầu tải tệp tin. Hệ thống sẽ xử lý bằng cách băm thông tin nhận được (filename) để xác định vị trí các node chứa tệp trong mô hình Chord. Trước tiên, việc tìm kiếm sẽ được thực hiện trên cache cục bộ của client đó, nếu không tìm thấy thì yêu cầu sẽ được đưa vào hệ thống P2P và lấy về từ P2P bằng thao tác Get(key, filename) và gửi lại cho Client nội dung tệp tin. Trường hợp không tìm thấy trong hệ thống P2P thì yêu cầu sẽ được đáp ứng bởi server.
- Search (keyword): Client gửi yêu cầu tìm kiếm vào hệ thống. Hệ thống sẽ xử lý bằng cách băm thông tin nhận được để xác định vị trí các node trong mô hình Chord. Trước tiên, việc tìm kiếm sẽ được thực hiện trên cache cục bộ của client đó, nếu không tìm thấy thì yêu cầu sẽ được đưa vào hệ thống P2P bằng thao tác Search(keyword) và gửi lại cho Client danh sách tên tệp tin.
- Delete (filename): Client yêu cầu xóa nội dung tệp tin nào đó bằng cách gửi yêu cầu lên hệ thống. Hệ thống sẽ xử lý bằng cách băm filename để xác định vị trí node chứa tệp tin. Tệp sẽ được tìm kiếm theo đúng hoạt động của mô hình Shared Cache Folder được mô tả như các thao tác trên, nếu tìm thấy hệ thống thực hiện thao tác Delete(key, filename) và gửi lại thong báo cho Client.