7. Tính nhất quán và sử dụng bản sao
8.2. Các mô hình lỗ
Một hệ thống lỗi là khi nó không cung cấp đầy đủ các dịch vụ như thiết kế. Nếu coi một hệ phân tán là một tập các server giao tiếp với nhau và với các client thì không cung cấp đầy đủ các dịch vụ nghĩa là các server, các kênh truyền thông, hoặc cả 2 không thực hiện đúng nhiệm vụ của nó. Tuy nhiên một server hoạt động sai chức năng chưa chắc đã là nguyên nhân gây ra lỗi. Nếu một server phụ thuộc vào các server khác để cung cấp đầy đủ các dịch vụ của nó, nguyên nhân của lỗi có thể cần phải được tìm kiếm ở nhưng nơi khác nưa ngoài server đó, mặc dù server đó bị lỗi.
Mối quan hệ phụ thuộc đó xuất hiện rất thường xuyên trong hệ phân tán. Một đĩa cứng bị lỗi có thể ảnh hưởng đến một file server được thiết kế để cung cấp hệ thống file có tính sẵn sàng cao. Nếu một file server như vậy là một phần của một hệ cơ sở dư liệu phân tán, sự hoạt động chính xác của hệ toàn bộ hệ cơ sở dư liệu có thể bị đe dọa và chỉ một phần dư liệu là có thể truy cập được.
Để hiểu rõ hơn thực tế một lỗi là nghiêm trọng đến mức nào, người ta đã đưa ra một vài cách phân loại như sau:
• Lỗi sụp đổ (Crash failure) xảy ra khi một server ngừng hoạt động trước dự kiến, nhưng vẫn làm việc chính xác cho đến khi nó dừng. Một ví dụ điển hình của
trường hợp này là khi hệ điều hành gặp phải một lỗi nghiêm trọng, và chỉ có một giải pháp duy nhất là khởi động lại nó. Nhiều hệ thống máy tính cá nhân gặp phải crash lỗi này khá thường xuyên. Lỗi này còn được gọi là fail-stop failure, nó là loại lỗi ít gây thiệt hại nhất khi server ngừng hoạt động.
• Lỗi bỏ sót (Omission failure) xảy ra khi server không có khả năng nhận hay đáp ứng đầy đủ các yêu cầu. Trong trường hợp lỗi nhận các yêu cầu, có khả năng server không bao giờ nhận được yêu cầu ngay trong lần đầu tiên. Chú ý rằng có thể kết nối giưa client và server có thể đã được tạo ra nhưng không có luồng lắng nghe các request gửi đến. Hơn nưa lỗi nhận các yêu cầu nói chung sẽ không ảnh hưởng đến trạng thái của server vì server chỉ không nhận biết được rằng có thông điệp gửi cho nó. Tương tự như vậy, lỗi gửi các bản tin xảy ra khi server đã hoàn thành công việc của nó, nhưng vì một lý do nào đó mà không thể gửi được phản hồi. Nhưng lỗi như vậy có thể xảy ra, chẳng hạn khi gửi buffer overflows trong khi server không được chuẩn bị cho tình huống đó. Chú ý rằng ngược với lỗi nhận yêu cầu, server hiện tại có thể ở trạng thái chỉ ra rằng nó đã thực hiện xong một dịch vụ cho một client. Do đó nếu việc phản hồi các yêu cầu không được hoàn tất, client phải gửi lại các yêu cầu của nó. Một loại khác không liên quan đến kết nối có thể gây ra bởi các lỗi phần mềm như vòng lặp vô tận hoặc quản lý bộ nhớ không hợp lý dẫn đến server bị treo.
• Lỗi thời gian (timing failure) xảy ra khi bản tin phản hồi được gửi đi trong một khoảng thời gian không thích hợp, như gửi dư liệu quá sớm có thể dễ dàng gây ra rắc rối cho phía nhận nếu bên nhận không đủ không gian bộ nhớ đệm để lưu giư tất cả các dư liệu đến. Tuy nhiên thực tế thường chỉ xảy ra ở mức server phản hồi quá chậm dẫn đến giảm hiệu năng của hệ thống.
• Lỗi đáp ứng (respond failure), nghĩa là các bản tin phản hồi của server không thích hợp. Có 2 loại lỗi phản hồi có thể xảy ra là value failure và state transition failure. Value failure là khi server cung cấp các phản hồi sai cho một yêu cầu nào đó. Chẳng hạn một serach engine đưa ra kết quả tìm kiếm các trang web không liên quan gì tới các từ khóa tìm kiếm. State transition failure xảy ra nếu không có tiêu chuẩn nào được đưa ra để điều khiển các bản tin. Cụ thể là trong trường hợp một server lỗi có thể có nhưng quyết định mặc định không hợp lý.
• Lỗi tuỳ tiện (arbitrary failure), còn được biết đến như là Byzantine failure. Lỗi này có thể xảy ra khi server tạo nhưng đầu ra mà khi bình thường nó không bao giờ tạo ra, sau đó kết hợp với nhưng server khác để tại ra nhưng câu trả lời sai, có quan hệ chặt chẽ với lỗi sụp đổ. Trong thực tế, khi xảy ra server sẽ ngừng tạo ra nhưng đầu ra, nhờ đó mà các tiến trình khác có thể nhận thấy được sự ngừng hoạt động của nó. Trong trường hợp tốt nhất, server có thể thông báo rằng nó sắp ngừng hoạt động.
Dĩ nhiên trong thực tế, nhưng server ngừng hoạt động do lỗi sụp đổ và lỗi bỏ sót sẽ không báo trước rằng nó chuẩn bị ngừng hoạt động. Các tiến trình khác sẽ có nhiệm vụ xác định rằng server đó đã ngừng. Tuy nhiên trong các hệ thống im lặng khi xảy ra lỗi (fail-silent system), các tiến trình khác có thể không biết là server đã ngừng hoạt động, thay vào đó nghĩ rằng server đó đột nhiên chạy chậm, dẫn đến lỗi hiệu năng (performance failure).
Cuối cùng, có nhiều trường hợp mà server đưa ra nhưng kết quả ngẫu nhiên, nhưng kết quả này có thể nhận biết được bởi nhưng tiến trình khác. Server như vậy thể hiện lỗi tuỳ tiện vô hại. Lỗi này cũng được gọi là lỗi an toàn (fail-safe failure).
Sau đây ta sẽ đưa ra một số giải pháp để đảm bảo tính chịu lỗi cho hệ phân tán.