7. Tính nhất quán và sử dụng bản sao
CHE GIẤU LỖI TRONG TRUYỀN THƠNG NHĨM TIN CẬY (DÙNG MULTICASTING)
MULTICASTING)
Cơ chế Multicasting tin cậy cơ bản
Sau khi các tiến trình đã được phân nhóm thì một tiến trình khác muốn thực hiện multicast tức là sẽ gửi bản tin tới tất cả các tiến trình trong nhóm đó. Multicast tin cậy là phải có cơ chế để đảm bảo bản tin đó đến được tất cả các thành viên trong nhóm. Khi xảy ra lỗi thì sẽ áp dụng phương pháp sau để che giấu lỗi.
Phương pháp: đánh số các bản tin cần gửi. Các bản tin được lưu tại một buffer của bên
gửi và vẫn lưu ở đó cho đến khi nhận được bản tin ACK báo về từ bên nhận. Nếu bên nhận xác định là bị mất một bản tin nào đó thì nó sẽ gửi về một bản tin NACK để yêu cầu gửi lại. Và thông thường, bên gửi sẽ tự động gửi lại bản tin sau trong khoảng thời gian xác định nào đó mà nó khơng nhận được bản tin ACK báo về.
Tuy nhiên phương pháp này phải trả giá đắt do ta phải đưa thêm thông tin cho mỗi lần truyền, và việc truyền lại phải sử dụng tới truyền thơng điểm-điểm cho mỗi q trình u cầu, hoặc sử dụng thông điệp muilticast gửi tới tất cả các tiến trình.
Hình (a). Truyền bản tin (b). Bản tin phản hồi
Khả năng mở rộng trong truyền Multicast tin cậy
Vấn đề đặ ra là cơ chế muilticast khơng có khả năng hỗ trợ số lượng lớn các bên nhận. Bên gửi sẽ phải gửi số lượng lớn các bản tin, đồng thời phải nhận khhong ít các thơng điệp gửi vể trong trường hợp mạng diện rộng. Từ đo xuất hiện giải pháp sau.
Điều khiển phản hồi không thứ bậc (Nonhierarchical Feedback Control)
Ý tưởng chủ đạo của phương pháp là giảm số lượng các thông điệp phản hồi tới bên gửi,với mơ hình hiện đại được ứng dụng nhiều là ngăn chặn phản hồi (feedback suppression), sử dụng giao thức Scalable Reliable Multicasting (SRM) , được phát triển bởi Floyd (1997).
Trong giao thức này, bên nhận chỉ gửi thơng điệp khi mất gói tin, nó bị mất thế nào sẽ giao cho ứng dụng. Khi bên nhận thấy mất gói tin, nó multicast tới tất cả các thành viên trong nhóm.
Điều này cho phép các thành viên trong nhóm ngăn chặn số lượng lớn các thông điệp phản hồi. Do sự truyền các thông điêp là nối tiếp nhau, bên gửi chỉ phải nhận một thơng điệp duy nhất.
Mơ hình này được sử dụng trong các cơ chế lớp dưới dành cho các ứng dụng Internet. Tuy nhiên nó cũng phải nhiều vấn đề, tiêu biểu như các tiến trình gửi thành công thông điệp lại bị ngắt do các thơng điệp phản hồi của các tiến trình đứng sau nó. Một giải pháp cho vấn đề này là để các bên nhận huy đi các thông điệp giống nhau trong nhóm và chia sẻ kênh truyền multicast với các thông điệp phản hồi và sự truyền lại.
Điều khiển phản hồi có thứ bậc (Nonhierarchical Feedback Control)
Để có thể thực hiện multicast tin cậy cho một nhóm lớn các tiến trình thì thực hiện tổ chức các nhóm theo cấu trúc dạng cây. Cấu trúc của cây :
Gốc là nhóm chứa tiến trình gửi.
Việc thực hiện multicast được thực hiện cho các nhóm nhỏ đó. Việc chia thành các nhóm nhỏ hơn này cho phép sử dụng các kịch bản multicast tin cậy cho từng nhóm nhỏ đó. Trong mỗi nhóm nhỏ sẽ đề cử một tiến trình làm điều phối. Tiến trình điều phối có khả năng điều khiển việc truyền lại khi nhận được thông báo truyền lỗi. Tiến trình điều phối của mỗi nhóm sẽ có bộ đệm lưu trữ (history buffer) riêng.
Nếu tiến trình điều phối của mỗi nhóm khơng nhận được bản tin thì nó sẽ gửi u cầu truyền lại tới tiến trình điều phối của nút cha nó.
Trong kịch bản truyền tin cậy sử dụng bản tin ACK thì khi tiến trình điều phối nhận thành cơng một bản tin, nó sẽ gửi bản tin ACK tới tiến trình điều phối của nút cha nó. Nếu tiến trình điều phối của một nhóm nhận được bản tin ACK báo nhận thành cơng bản tin của tất cả các tiến trình trong nhóm gửi về thì nó sẽ xóa bản tin khỏi bộ đệm của nó. Đánh giá: với phương pháp phân cấp này thì xảy ra vấn đề về cấu trúc cây. Rất nhiều trường hợp yêu cầu cây phải có cấu trúc động. một phương pháp tiếp cận là sử dụng trong các mạng hạ tầng. Về nguyên tắc, hướng tiếp cận này sử dụng các router trong lớp mạng như các router điều phối cục bộ. Tuy nhiên điều này rất khó thực hiện trong thực tế. Để kết thúc, ta thấy xây dựng cơ chế multicast đáng tin cậy cho số lượng lớn các bên nhận thông qua các mạng diện rộng là vấn đề rất khó. Khơng tồn tại bất cứ giải pháp đơn lẻ nào, và mỗi giải pháp lại làm nảy sinh những vấn đề mới.
Multicast nguyên tử (Atomic multicast)
Một trong các vấn đề được đặt ra là đảm bảo các thông điệp được phân phối tới mỗi tiến trình hoặc khơng gửi tới bất cứ tiến trình nào trong tình huống xảy ra lỗi tiến trình. Đồng thời, ta cũng cần đảm bảo chúng được gửi đúng thứ tự, đó là vấn đề muilicast nguyên tử. Khi một tiến trình muốn gửi bản tin cho một tập các tiến trình khác theo kiểu multicast, nó sẽ khơng gửi bản tin tới tất cả các tiến trình của nhóm chứa các tiến trình nhận mà chỉ gửi đến một nhóm nhỏ các tiến trình cần nhận bản tin đó.
Vấn đế đặt ra: phải đảm bảo gửi được bản tin tới tất cả các tiến trình trong nhóm hoặc khơng được gửi tới bất kì tiến trình nào nếu một tiến trình trong nhóm bị lỗi sụp đổ.
• Khung nhìn nhóm (Group view): ý tưởng chính của atomic multicast là một tiến trình thực hiện multicast bản tin m thì chỉ thực hiện liên kết tới một danh sách các tiến trình cần nhận bản tin m đó chứ khơng phải tồn bộ nhóm. Danh sách các tiến trình này tương ứng với một khung nhìn nhóm - một tập nhỏ các tiến trình của một nhóm lớn.
• Thay đổi khung nhìn (View change): khi đang thực hiện multicast tới một group view G mà có một tiến trình xin gia nhập nhóm hay xin ra khỏi nhóm thì sự thay đổi vc này sẽ được gửi tới tất cả các thành viên cịn lại trong nhóm. Do đó, các tiến trình cịn lại trong G sẽ nhận được hai bản tin:
m: bản tin cần nhận
vc: bản tin thơng báo có thay đổi trong G.
Nếu tất cả các tiến trình trong G đều chưa nhận được vc thì thao tác multicast bản tin m
được thực hiện.
Nếu một trong số các tiến trình trong G đã nhận được vc thì phải đảm bảo rằng khơng một tiến trình nào khác trong G được nhận m nữa.
Đồng bộ ảo (Virtual sychronous)
Nguyên tắc này đảm bảo bản tin chỉ được multicast tới tất cả các tiến trình khơng có lỗi. Nếu tiến trình gửi bị sụp đổ trong quá trình multicast thì q trình này bị hủy ngay dù bản tin đó đã được gửi tới một vài tiến trình khác trong nhóm rồi.
Nguyên lý đồng bộ ảo
P1 tham gia vào nhóm đã có sẵn ba thành viên: P2,P3, P4. P2 thực hiện multicast bản tin tới tất cả các tiến trình cịn lại. P1 thực hiện multicast bản tin tới tất cả các tiến trình cịn lại.
P3 multicast tới tiến trình P2 , P4 thành cơng nhưng P1 chưa nhận được thì P3 bị sụp đổ. Lúc này đồng bộ ảo sẽ hủy tất cả các bản tin đã được gửi trước đó cho P2, P4, thiết lập trạng thái trước khi sụp đổ của P3 là chưa gửi bản tin dó.
nhóm lúc này chỉ cịn P1, P2, P4 và P4 thực hiện multicast bản tin, P3 được khơi phục và xin gia nhập lại nhóm.
P3 gia nhập nhóm thành cơng.
Lập thứ tự cho thơng điệp (Messsage Ordering)
Chúng ta quan tâm tới 4 cách xếp thứ tự cho thơng điệp :
• Multicast khơng có thứ tự
• Multicast theo thứ tự FIFO
• Multicast theo thứ tự nhân quả
• Multicast theo thứ tự tổng hợp
Trong thực tế, multicast khơng thứ tự là multicast đồng bộ ảo khơng có sự đảm bảo về thứ tự của các thơng điệp được truyền đi bởi các tiến trình.
Tiến trình P1 gửi thơng điệp m1 và m2 tới 2 tiến trình P2 và P3 trong nhóm, giả sử khơng có sự cố gì xảy ra thì tiến trình P2 sẽ nhận dược thông điệp theo thứ tự m1 và m2, nhưng do khơng có thứ tự về thơng điệp nên P3 có thể sẽ nhận thông điệp m2 trước khi nhận thông điệp m1.
Multicast FIFO,lớp truyền thông buộc các thông điệp gửi đến tuân theo đúng thứ tự được gửi nếu nó đến từ cùng một tiến trình. Tuy nhiên lại có vấn đề về việc thứ tự các tiến trình gửi. Ví dụ, 2 tiến trình P1 gửi thơng điệp m1 và m2, P2 gửi thông điệp m3 và m4 tới cho 2 tiến trình P3 và P4 thì có khả năng P3 sẽ nhận được theo thứ tự (m1, m3, m2, m4) trong khi P4 sẽ nhận theo thứ tự (m3, m1, m2, m4).
Multicast theo thứ tự nhân quả gửi thơng điệp có tính nhân quả. Nếu thơng điệp m1 xảy có tính nhân quả (xảy ra trước) thơng điệp m2, thì dù thơng điệp nào đến trước, lớp ứng
dụng luôn đặt m2 sau m1. Phương pháp này có thể thực thi bằng cách sử dụng tem thời gian.
Bên cạnh 3 kiểu thứ tự trên, sự phân phối theo thứ tự tổng hợp mang ý nghĩa : dù các thông điệp theo sạng không thứ tự, dạng FIFO hay nhân quả, cần điều kiện ràng buộc đảm bảo khi được truyền đi, thông điệp đi theo đúng thứ tự tới tất cả các thành viên trong nhóm.
Multicast tin cậy đồng bộ ảo sử dụng cáh thức phân phối theo thứ tự tổng hợp được gọi là multicast nguyên tử. Với 3 loại ràng buộc về thứ tự trên, ta có 6 kiểu multicast đáng tin cậy.
Sự phục hồi lỗi
Phục hồi lỗi (recovery error) là một trong những cách hiệu quả của việc giúp tăng khả năng chịu lỗi (fault tolerance) của hệ thống phân tán. Có 2 dạng phục hồi lỗi chính :
• Phục hồi lùi (Backward recovery) : đưa trạng thái của hệ thống ở thời điểm hiện tại về trạng thái tại thời điểm trước khi lỗi xảy ra. Để làm được điều đó, ta cần thiết phải ghi lại trạng thái của hệ thống ở các thời điểm liên tục ( time to time ). Mỗi thời điểm lưu trữ lại đó người ta gọi là “checkpoint”.
• Phục hồi tiến (Forward recovery): khi hê thống rơi vào trạng thái lỗi, thay vì đưa hệ thống trở lại trạng thái trước khi lỗi, cách này lại đưa hệ thống nhảy sang một trạng thái mới mà ở đó hệ thống lại hoạt động bình thường. Vấn đề chính trong phương pháp này là phải dự đốn trước được khi nào lỗi có thể xảy ra. Chỉ có vậy nó mới sẵn sàng chuyển hệ thống sang trạng thái mới.
Sự khác nhau giữa lùi và tiến chính là sự tin cậy trong truyền thông. Thông thường cách tốt nhất để phục hồi lỗi trong quá trình truyền thơng là thơng báo cho bên gửi nhằm gửi lại những gói tin đã bị mất trong q trình truyền (bằng cách chuyển về trạng thái trước
lỗi, xem những gói nào bị mất để yêu cầu truyền lại). Phục hồi lùi được sử dụng rộng rãi do tính tin cậy hơn trong truyền thông.
Cách thứ 2 là sử dụng phương pháp sửa chữa các bản đã mất (erasure correction). Ý tưởng chính của phương pháp là gói tin bị mất có thể được khơi phục lại dựa trên những gói tin khác, như việc nó quy định số lượng gói tin sau có thể phục hồi được gói tin trước, bên gửi sẽ tiếp tục truyền gói cho đến khi một gói đã mất được dựng lại, đó chính là tư tưởng của khôi phục tiến. phương pháp này phục hồi hệ thống tại thời điểm sau lỗi để đảm bảo hệ thống có thể hoạt động đúng nên rất khó thực hiện trong thực tế. Do đó khơi phục lùi vẫn là biện pháp cơ bản nhất trong hệ phân tán.
Tuy nhiên phục hồi lùi vẫn tồn tại những hạn chế:
• Việc phục hồi lại hệ thống ở trạng thái trước đơi khi rất phức tạp.
• Phương pháp khơng có sự đảm bảo rằng sau khi trở lại trạng thái trước lỗi, có khả năng lỗi lại tiếp tục xảy ra dẫn đến tình trạng lặp vơ hạn.
• Khơng phải lúc nào cũng có những trạng thái trước khi lỗi để ta quay lại ( giống như đi rút tiền, máy gặp sự cố, ít có cơ hội quay lại trạng thái trước khi ấn nút rút để tiếp tục rút tiền).
Sau đây ta sẽ mô tả vài biện pháp khôi phục được sử dụng trong thực tế.
Để có thể khơi phục trạng thái trước lỗi của hệ thống, buộc phải lưu trữ những thông tin cần thiết cho sự khơi phục. Có 3 cách lưu trữ những thơng tin này :
• Lưu trữ trong RAM ( nhưng bị xóa khi mất điện )
• Lưu trữ trong đĩa ( vẫn sống khi CPU lỗi nhưng mất khi khi đĩa hỏng)
• Sử dụng lưu trữ tĩnh (Stable storage).
Kho lưu trữ tĩnh (Stable strorage):
Được thực hiện như 2 đĩa thông thường. Mỗi khối trong đĩa 2 sẽ được copy giống hệt như khối ở đĩa 1. Khi một khối ở đĩa 1 được cập nhật thì nó cũng được cập nhật ở đĩa 2 ( sau khi đã cập nhật xong ở đĩa 1.
• Hình a : 2 đĩa sao chép y ngun nhau.
• Hình b : trường hợp hệ thống gặp lỗi khi đĩa 1 đã được update còn đĩa 2 chưa được cập nhật. Để tiến hành phục hồi, tiến hành so sánh 2 đĩa với nhau từng khối một, thấy sự sai khác nó lại cập nhật để 2 cái giống nhau.
• Hình c: trường hợp có những khối tự động lỗi. Khi đó sẽ có 1 checksum error được từ khối ổn định trước nó. Nếu lỗi được phát hiện, khối bị lỗi sẽ được khơi phuc lại theo đĩa cịn lại.
Ưu điểm của lưu trữ tĩnh là tính tin cậy do được ghi đồng thời, sau đó được kiểm tra lại nên ít khả năng có lỗi xảy ra.
Checkpointing :
Trong hệ phân tán, khôi phục lùi yêu cầu hệ thống lưu lại trạng thái trong kho lưu trữ tĩnh. Nếu tiến trình P ghi lại trạng thái thu nhận một thơng điệp, sẽ có tiến trình Q ghi nhận sự gửi đi thơng điệp. Mỗi tiến trình lưu lại trạng thái theo trình tự thời gian vào kho lưu trữ. Để khôi phục, chỉ cần lấy ra trạng thái tốt gần nhất để khôi phục lại hệ thống.
Checkpointing độc lập
Khi một tiến trình gặp lỗi, động tác khơi phục lùi được thực thi. Tuy nhiên vấn đề nảy sinh là ở chỗ nếu một tiến trình khơi phục trạng thái tốt gần nhất của nó thì điều đó khơng đảm bảo rằng trạng thái đó là tốt nhất cho tồn bộ hệ thống. Nói cách khác, trạng thái này có thể ứng với trạng thái lỗi của 1 tiến trình khác trong hệ thống.
Điều này dẫn tới việc phải liên tục kiểm tra các điểm checkpoint của từng tiến trình riêng biệt nhưng phải đảm bảo tính ổn định cho cả hệ thống, vì thế ta phải quay lui lần lượt cho tới khi đạt được thời điểm tối ưu, điều này được gọi là hiệu ứng domino.
Hiệu ứng domino
Việc tính tốn điểm khơi phục để đảm bảo sự hồn hảo cho cả hệ thống yêu cầu sự phân tích các phần phụ thuộc được ghi lại bởi các tiến trình trong hệ thống. Điều này vơ cùng phức tạp, đặc biệt là đối với các hệ thống lớn.
Checkpointing phối hợp
Với phương pháp này, tất cả các tiến trình được đồng bộ để ghi lại trạng thái vào kho lưu trữ cục bộ. Lợi ích chính của phương pháp là trạng thái lưu trữ được đồng bộ tự động cho cả hệ thống, do đó có thể tránh được hiêu ứng domino.
Phương pháp này đảm bảo tính ổn định cho hệ thống, bởi khơng có thơng điệp nào đến trong thời điểm checkpoint, và các thông điệp gửi đi được lưu vào hàng đợi cho đến khi thông điệp CHECKPOINT DONE được nhận.
Ta có thể cải thiện phương pháp bằng cách multicast một checkpoint chỉ tới các tiến trình phụ thuộc vào thời điểm khoi phục và lờ đi các tiến trình khác. Một tiến trình là phụ thuộc vào tiến trình điều phối nếu nó nhận được thơng điệp có tính nhân quả liên quan