Hãy cùng xem vì sao lỗi xảy ra trong các hệ thống phân tán và cách chúng ta có thể phát hiện chúng.
Chúng ta sẽ đề cập đến các nội dung sau:
- Một nguyên nhân gây lỗi
- Một cơ chế để phát hiện lỗi
- Sự đánh đổi khi chọn giá trị timeout nhỏ
- Sự đánh đổi khi chọn giá trị timeout lớn
- Bộ phát hiện lỗi
- Các thuộc tính dùng để phân loại bộ phát hiện lỗi
- Bộ phát hiện lỗi hoàn hảo
Chúng ta cần hiểu rằng việc xác định lỗi là rất thách thức do tất cả các đặc điểm của hệ thống phân tán đã được mô tả trong bài học Những khó khăn khi thiết kế hệ thống phân tán. Một trong số đó là tính bất đồng bộ của mạng.
1. One reason for failure – Một nguyên nhân gây lỗi
Tính bất đồng bộ của mạng trong một hệ thống phân tán có thể khiến chúng ta rất khó phân biệt giữa một nút đã bị sập và một nút chỉ đơn giản là phản hồi rất chậm đối với các yêu cầu.
2. One mechanism to detect failure – Một cơ chế để phát hiện lỗi
Timeout là cơ chế chính mà chúng ta có thể sử dụng để phát hiện lỗi trong các hệ thống phân tán. Do mạng bất đồng bộ có thể trì hoãn thông điệp vô hạn, timeout áp đặt một giới hạn trên mang tính nhân tạo cho các độ trễ này. Kết quả là, chúng ta có thể giả định rằng một nút đã gặp lỗi khi nó chậm hơn giới hạn này. Điều này rất hữu ích, bởi nếu không, giả định rằng các nút chỉ đơn thuần là cực kỳ chậm sẽ khiến hệ thống bị chặn lại, chờ đợi các nút đã bị sập.
Tuy nhiên, timeout không đại diện cho một giới hạn thực sự. Do đó, nó tạo ra sự đánh đổi sau đây.
3. Trade-off for the small timeout value Sự đánh đổi khi chọn giá trị timeout nhỏ
Nếu chúng ta chọn một giá trị timeout nhỏ, hệ thống sẽ lãng phí ít thời gian hơn để chờ đợi các nút đã bị sập.
Đồng thời, hệ thống có thể tuyên bố một số nút chưa bị sập là đã chết, trong khi trên thực tế chúng chỉ chậm hơn một chút so với mong đợi.
4. Trade-off for the large timeout value – Sự đánh đổi khi chọn giá trị timeout lớn
Nếu chúng ta chọn một giá trị timeout lớn hơn, hệ thống sẽ khoan dung hơn đối với các nút phản hồi chậm.
Tuy nhiên, đồng thời hệ thống sẽ chậm hơn trong việc phát hiện các nút đã bị sập, và trong một số trường hợp sẽ lãng phí thời gian để chờ đợi chúng.
5. Failure detector – Bộ phát hiện lỗi
Bộ phát hiện lỗi là một thành phần của một nút, cho phép chúng ta xác định các nút khác đã gặp lỗi.
Thành phần này là thiết yếu đối với nhiều thuật toán cần tiếp tục tiến triển ngay cả khi có lỗi xảy ra. Đã có rất nhiều nghiên cứu được thực hiện xoay quanh các bộ phát hiện lỗi.
6. Properties that categorize failure detectors – Các thuộc tính dùng để phân loại bộ phát hiện lỗi
Chúng ta có thể phân biệt các loại bộ phát hiện lỗi khác nhau thông qua hai thuộc tính cơ bản, phản ánh sự đánh đổi giữa chúng:
6.1 Tính đầy đủ (Completeness)
Tính đầy đủ tương ứng với tỷ lệ các nút đã bị sập mà bộ phát hiện lỗi có thể phát hiện thành công trong một khoảng thời gian nhất định.
6.2 Tính chính xác (Accuracy)
Tính chính xác tương ứng với số lượng sai sót mà bộ phát hiện lỗi mắc phải trong một khoảng thời gian nhất định.
7. A perfect failure detector – Bộ phát hiện lỗi hoàn hảo
Bộ phát hiện lỗi hoàn hảo là bộ có mức độ đầy đủ và chính xác mạnh nhất. Tức là nó có thể phát hiện thành công mọi tiến trình bị lỗi mà không bao giờ giả định rằng một nút đã bị sập trước khi điều đó thực sự xảy ra.
Như có thể dự đoán, việc xây dựng một bộ phát hiện lỗi hoàn hảo trong các hệ thống thuần bất đồng bộ là điều không thể. Tuy vậy, chúng ta vẫn có thể sử dụng các bộ phát hiện lỗi không hoàn hảo để giải quyết những bài toán khó. Một ví dụ như vậy là bài toán đồng thuận (consensus).