Chương 3 2B Cải tiến hiệu năng của Chord
3.4.2.4. 22B Quá trình duy trì
Duy trì vòng proxy
Proxy không phải là các node Chord thông thường trên mạng, chúng là các server được dành riêng làm nhiệm vụ proxy. Các server này có tính sẵn sang cao, tần suất gia nhập, rời khỏi mạng hay lỗi của các server này thấp.
Cấu trúc overlay, quá trình duy trì (join/leave/failure) tương tự như với vòng Chord.
Các proxy có chung danh sách main proxy.
Nếu proxy đang join vào vòng proxy là main proxy, nó sẽ thông báo với các proxy khác cập nhật nó trong danh sách main proxy. Nếu main proxy leave khỏi mạng, nó sẽ thông báo với các proxy khác để các proxy này xóa nó khỏi danh sách main proxy. Nếu main proxy bị fail, successor và predecessor của nó sẽ thông báo với các proxy khác để cập nhật danh sách main proxy.
Nếu node đang join hoặc leave là normal proxy, nó sẽ thông báo với main proxy tương ứng để main proxy cập nhật danh sách proxy của nó. Nếu normal proxy bị fail, successor và predecessor của nó sẽ thông báo với main proxy để cập nhật danh sách proxy.
Sao lưu: một proxy sao lưu cache của nó trong k proxy liên tiếp sau nó. Khi một proxy phát hiện successor của nó bị fail, nó sẽ thay thế proxy đó bởi proxy đầu tiên còn online trong danh sách proxy của nó.
Đồng bộ giữa vòng proxy và vòng các node thông thường
Đồng bộ khi node thông thường thay đổi.
Khi một node join vào mạng, nó sẽ lấy một bản sao danh sách main proxy từ successor của nó.
Khi một node leave khỏi mạng, nó thông báo với caching proxy tương ứng với nó và gửi successor của nó tới proxy. Proxy sẽ kiểm tra xem node đang leave khỏi mạng có trong cache của nó không. Nếu node đã được cache, proxy sẽ chuyển các key mà node chịu trách nhiệm sang successor của node đó và xóa node khỏi danh sách cache.
Khi một node join vào mạng, nó sẽ gửi thông tin về successor của nó tới proxy tương ứng. Proxy sẽ kiểm tra xem successor đó đã được cache chưa. Nếu successor đã được cache, các key có ID < ID của node đang join vào mạng sẽ được chuyển tới node này.
Khi một node phát hiện successor của nó bị fail, nó sẽ thông báo với proxy tương ứng. Nếu node đã được cache trong proxy, proxy sẽ xóa node đó khỏi cache.
event n.Leave from app
sendto p.NotifyLeave()
event p.NotifyLeave from n
sendto pi.NotifyLeave()
end event
event pi.NotifyLeave from p
If n is not in cache then
⊲Ignore leaving node
else
If succ(n) is in cache then
⊲Merge cache of n to cache of succ(n)
else
⊲Add succ(n) to cache
end if endif end event
event n.Join from app
sendto p.NotifyJoin()
end event
event p.NotifyJoin from n
sendto pi.NotifyJoin()
end event
event pi. NotifyJoin from p
If succ(n) is not in cache then
⊲Ignore joining node
else
If some cached keys of succ(n) belong to n then
⊲Add n to cache and move keys to n
else
⊲Ignore joining node
end if
end if
end event
event p.NotifyFailure from successor of n
sendto p.NotifyFailure()
end event
event pi.NotifyFailure from p
end event
event pi.NotifyFailure
if n is not in cache then
⊲Ignore failure node
else
⊲Remove n from cache (or replicate by associate node)
end if
end event
Thuật toán 3.5. Đồng bộ hóa vòng proxy và vòng node Chord thông thường
Đồng bộ khi vòng proxy thay đổi
Khi một proxy join vào mạng, successor của proxy này sẽ chuyển các key tương ứng với proxy mới join vào mạng sang cho proxy này. Nếu proxy đang join vào mạng là normal proxy, nó sẽ thông báo với main proxy tương ứng cập nhật lại danh sách proxy. Nếu node đang join vào mạng là main proxy, nó sẽ thông báo với main proxy đứng trước nó để lấy về danh sách proxy list và cập nhật danh sách main proxy trong tất cả proxy. Main proxy cũng thông báo cập nhật danh sách main proxy trong các node được cache.
Khi một proxy leave khỏi hệ thống, successor của proxy đó sẽ chịu trách nhiệm cho các key được cache trong proxy đang leave. Nếu proxy đang leave là normal proxy, nó sẽ thông báo với main proxy tương ứng để cập nhật danh sách proxy. Nếu proxy đang leave là main proxy, nó sẽ chuyển danh sách proxy sang main proxy ngay sau nó và thông báo với các proxy cập nhật lại danh sách main proxy. Các proxy cũng thông báo với các node thông thường để các node này cập nhật lại danh sách main proxy.
Khi một proxy phát hiện successor của nó fail, nó sẽ thay thế proxy đó bởi proxy đầu tiên còn hoạt động trong danh sách successor của nó. Nếu proxy fail là normal proxy, successor hoạt predecessor của nó sẽ thông báo với main proxy tương ứng để main proxy này cập nhật lại proxy list. Nếu proxy bị fail là main proxy,
successor hoặc predecessor của nó sẽ thông báo với các proxy khác và các node thông thường cập nhật lại danh sách main proxy.
Để cập nhật danh sách main proxy trong các node thông thường, mỗi proxy thông báo danh sách main proxy mới cho các node mà nó đang cache. Node thông thường sẽ thông báo danh sách main proxy mới cho successor và predecessor của nó cho đến khi các node trong vòng có cùng danh sách main proxy (version giống nhau). Một node dừng việc thông báo danh sách main proxy mới cho successor và predecessor của nó khi danh sách main proxy của nó giống với danh sách main proxy nó nhận được từ successor hoặc predecessor. Quá trình cập nhật này là quá trình lan tỏa nên kết thúc rất nhanh.
Quá trình xử lý join/leave/failure của các proxy tương tự như node Chord thông thường
Giả mã xử lý thay đổi trong vòng proxy
event p.MainProxyListChanged
for node n in cache do
sendto n.NotifyMainProxyListChanged()
end for end event
event Notify MainProxyListChanged from p
If vn is less than received from proxy or predecessor then
# vn: version number of proxy list
⊲Replace its proxy list
⊲Forward proxy list to it successor and predecessor
else
⊲Ignore received proxy list
end if
end event