Nhắn gửi: Đây là bài về 4 loại DHT. Rất mong được nhận sự góp ý và phản hồi của các bạn. - rogp10
DHT là một hệ thống phân tán dùng để tìm kiếm (siêu) dữ liệu, dựa trên bảng hash table cổ điển. DHT có hai cặp hash:
- ID -> địa chỉ IP: mỗi client (còn gọi là node) có một định danh ID riêng để nhận và truyền tin.
- HID -> (meta)data: mỗi gói dữ liệu có một fingerprint riêng để nhận dạng, lưu trên client và giữ toàn vẹn dữ liệu.
Mỗi client trong mạng DHT sẽ lưu các HID “lân cận” với ID của nó.
DHT có những mục tiêu cơ bản như sau:
- Dữ liệu được phân bố đều về mặt địa lí. (chia tải)
- Chỉ cần một (vài) node bất kì để hòa mạng. (phân tán)
- Kích thước bảng định tuyến và chi phí tìm kiếm tối đa tăng theo hàm log của số node đang trong mạng. (mở rộng)
- Duy trì kết nối luận lí trước sự hòa mạng và rời mạng liên tục. (ổn định)
Sự linh hoạt trong việc chọn node kết nối có thể tăng tốc đồng bộ và thiết lập DHT.
Hàm hash thường được chọn từ 128 bit trở lên để đáp ứng cho hàng chục triệu node (khoảng 59 bit với khả năng đụng là 50%) và gói dữ liệu. Client dùng đặc điểm của nó kèm theo 1 chuỗi ngẫu nhiên (nonce) để hash và tự đặt ID cho mình.
Có ba thao tác chung:
- Kiểm tra xem node có ID này còn sống hay không.
- Tìm dữ liệu theo HID.
- Tìm thông tin của một ID xác định, hoặc những ID lân cận với ID đó.
I. Chord
Không gian ID trong Chord được thiết kế thành vòng tròn kín, với mỗi node đều có node liền trước (pred) và các node đứng sau. Node X trong Chord lưu một bảng “finger table” lưu các cặp (ID, IP) sao cho finger[i]
có ID thuộc (X+2^(i-1), X+2^i], nghĩa là X+2 trong slot 1, X+[3…4] slot 2, slot 3 lưu X+[5…8], v.v. cùng với ID liền trước nó (pred) để hỗ trợ thao tác hòa mạng. Đồng thời node X lưu hết thảy các dữ liệu nó biết có HID nằm trong nửa khoảng (pred, X].
pred ====> X ====> finger[1..w]
- Tìm HID
Để tìm một HID (get
) ta sẽ đi theo slot có nhiều khả năng nhất. Ta sẽ minh họa với vòng 128 slot, HID là 09 (Z/128Z, +)
ID 37: 9 - 37 (= 128+9 - 37) = 100 > 64, slot 7 có máy 103 (< 9).
ID 103: 9 - 103 = 34 > 32, slot 6 có máy 14 > 9, slot 5 có máy 123
ID 123: 9 - 123 = 14 > 8, slot 4 có máy 6 < 9.
ID 6: succ(6) = 10, vậy trả về (10, IP_10) cho ID 37.
- Hòa mạng
Hàm succ(ID) dùng để tìm ID của client nằm sau một client cho trước. Để hòa mạng, một client có ID tự đặt là M kết nối với client X trong mạng:
- M tự xưng danh với X.
- X truy vấn succ(M).
- X trả về kết quả succ(M) cùng bảng finger.
- M liên lạc với succ(M), ta gọi là M’.
- M’ kiểm tra tham số pred của mình
- Nếu pred nằm sau M và còn sống thì M’ phải trả về pred. M tiếp nhận M’ này vào bảng finger. (TH1)
- Ngược lại M’ báo lại cho pred của mình và cập nhật lại M’.pred = M. M’ trao lại bảng finger của mình cho M. (TH2) Hoặc M’ phải điều chỉnh bảng node của mình (xem phần sau).
(TH2): M hòa mạng thành công. M yêu cầu M’ trao lại các key M’ đang giữ.
(TH1): M liên lạc với pred, hoặc nếu pred không kết nối được thì lại tiếp tục qua bảng finger đã nhận từ X.
- Điều chỉnh
Sau một khoảng thời gian, node X xem lại tất cả những kết nối của mình. Có hai thao tác chính:
- Gọi succ(pred), nếu bằng X thì thôi, ngược lại yêu cầu cho succ(pred) kiểm tra pred và nhận key, tương tự như khi hòa mạng.
- Ping tất cả các ID trong bảng finger để điều chỉnh.
- Phát hành
Để đưa một HID mới vào mạng, ta phát yêu cầu succ(HID) qua bảng finger, sau đó yêu cầu ID này lưu HID của ta.
- Các thông điệp truyền:
- OK: gồm chữ “OK” và ID. NOK tương tự.
- START + ID: xưng danh, nhận PAIR và FING.
- JOINS + ID: liên lạc với succ(M) để hòa mạng, nhận (OK và FING) hoặc (NOK và PAIR)
- PING + ID: trả về OK hay timeout.
- FING + PAIRID(s): bảng finger.
- SUCC + ID: trả về PAIRID.
- LEAVE + ID: gửi cho tất cả liên kết.
- STORE + PAIRHID: yêu cầu lưu một HID, trả về OK hay NOK (quá đầy hoặc hash không đúng).
- RETK + PAIRHID(s): trả về (những) key mà node đang giữ.
Tóm tắt:
- Để tìm một HID
h
trong Chord, ta cần phải hỏi những máy có ID (nằm sau)h
. - Chord khá giống 1 DSLK đơn vòng với b con trỏ: 1, 2, 4, 8, 16, 32, …, 2^(b-1) vì pred không tham gia định tuyến.
- Node pred rất quan trọng trong Chord.