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 ngồ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ệ tồ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 xun. 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 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 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 đã hồ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 u cầu khơng được hồn tất, client phải gửi lại các 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.