Trong hệ thống lưu trữ Ceph, Backfill và Recovery là hai quá trình quan trọng đảm bảo dữ liệu luôn có đủ bản sao và nhất quán khi xảy ra sự cố. Tuy nhiên, chúng có mục đích và cách hoạt động khác nhau.
Bài viết này sẽ giúp bạn phân biệt hai khái niệm này một cách chi tiết, kèm theo ví dụ thực tế.
1️⃣ Backfill là gì?
Backfill là quá trình Ceph sử dụng để làm đầy, còn gọi là fill dữ liệu (giống fill nước vào tủ lạnh) vào OSD mới hoặc OSD vừa được đưa trở lại hệ thống. Quá trình này đảm bảo rằng các bản sao dữ liệu được phân phối đầy đủ trên các OSD theo CRUSH map.
🔹 Khi nào Backfill xảy ra?
- Khi bạn thêm một OSD mới vào cluster.
- Khi một OSD bị đánh dấu out do lỗi và sau đó được đưa trở lại trạng thái in.
- Khi bạn thay đổi CRUSH map, dẫn đến việc dữ liệu cần được phân phối lại.
🔹 Quá trình Backfill hoạt động như thế nào?
- Ceph chọn OSD mới hoặc OSD vừa được khôi phục và xác định dữ liệu nào cần sao chép vào đó.
- Dữ liệu được sao chép từ các OSD hiện có sang OSD mới theo chính sách phân phối của CRUSH.
- Khi quá trình backfill hoàn tất, OSD đó sẽ trở thành một phần chính thức của cluster với đầy đủ dữ liệu.
📌 Ví dụ về Backfill
Giả sử bạn có một pool với replica size = 2 (tức là mỗi object có hai bản sao) và bạn thêm một OSD mới (osd.10). Ceph sẽ thực hiện backfill như sau:
- Trước khi thêm OSD mới:
Object A -> OSD 1, OSD 2 Object B -> OSD 3, OSD 4
- Sau khi thêm OSD 10:
Object A -> OSD 1, OSD 10 (backfill từ OSD 2) Object B -> OSD 3, OSD 4 (không thay đổi)
Dưới đây là sơ đồ mô tả quá trình Backfill trong Ceph khi thêm một OSD mới vào cluster:
📌 Trạng thái ban đầu (Replica 2, trước khi thêm OSD mới)
-------------------------------------------------
| OSD.1 (A ✅) | OSD.2 (A ✅) | OSD.3 (B ✅) | OSD.4 (B ✅) |
-------------------------------------------------
Object A Object A Object B Object B
1️⃣ Thêm OSD.10 → Ceph thực hiện Backfill
-------------------------------------------------
| OSD.1 (A ✅) | OSD.2 (A ✅) | OSD.3 (B ✅) | OSD.4 (B ✅) | OSD.10 (empty) |
-------------------------------------------------
🔻
Ceph sao chép dữ liệu vào OSD.10
2️⃣ Sau khi Backfill hoàn tất:
-------------------------------------------------
| OSD.1 (A ✅) | OSD.10 (A ✅) | OSD.3 (B ✅) | OSD.4 (B ✅) |
-------------------------------------------------
Object A Object A Object B Object B
💡 Giải thích:
- Ban đầu, Object A nằm trên OSD.1 và OSD.2.
- Khi thêm OSD.10, Ceph quyết định di chuyển một bản sao của Object A từ OSD.2 → OSD.10 để phân phối dữ liệu đồng đều.
- Sau khi Backfill hoàn tất, OSD.10 chính thức tham gia cluster với dữ liệu đầy đủ. 🚀
Ceph sao chép dữ liệu từ OSD cũ sang OSD mới để đảm bảo sự phân bố đồng đều.
2️⃣ Recovery là gì?
Recovery là quá trình Ceph khôi phục dữ liệu bị mất khi một hoặc nhiều OSD bị lỗi, để đảm bảo cluster luôn có đủ bản sao của các object.
🔹 Khi nào Recovery xảy ra?
- Khi một OSD bị down hoặc bị loại bỏ khỏi cluster.
- Khi một OSD gặp sự cố nhưng sau đó được khôi phục (restart hoặc repair).
- Khi có sự cố mạng khiến một phần dữ liệu không đồng bộ.
🔹 Quá trình Recovery hoạt động như thế nào?
- Ceph xác định các PG (Placement Groups) bị ảnh hưởng do OSD bị down.
- Dữ liệu bị thiếu được sao chép từ các OSD còn lại để tái tạo đủ số bản sao.
- Cluster quay về trạng thái HEALTH_OK khi tất cả dữ liệu được khôi phục đầy đủ.
📌 Ví dụ về Recovery
Giả sử bạn có một pool với replica size = 2 và OSD 3 bị lỗi:
- Trước khi OSD 3 lỗi:
Object A -> OSD 1, OSD 3 Object B -> OSD 2, OSD 3
- Khi OSD 3 bị lỗi:
Object A -> OSD 1 (mất một bản sao) Object B -> OSD 2 (mất một bản sao)
- Ceph thực hiện Recovery:
- Object A được sao chép từ OSD 1 sang OSD 4.
- Object B được sao chép từ OSD 2 sang OSD 5.
- Sau khi Recovery hoàn tất:
Object A -> OSD 1, OSD 4 (đã phục hồi) Object B -> OSD 2, OSD 5 (đã phục hồi)
- Cluster quay về trạng thái ổn định.
Dưới đây là sơ đồ mô tả quá trình Recovery trong Ceph khi một OSD bị lỗi và dữ liệu được khôi phục:
📌 Trạng thái ban đầu (Replica 2, trước khi OSD 3 lỗi)
-------------------------------------------------
| OSD.1 (A ✅) | OSD.2 (B ✅) | OSD.3 (A ✅, B ✅) | OSD.4 (empty) | OSD.5 (empty) |
-------------------------------------------------
Object A Object B Object A, B
- Object A được lưu trên OSD.1 và OSD.3
- Object B được lưu trên OSD.2 và OSD.3
📌 Khi OSD.3 bị lỗi (down):
-------------------------------------------------
| OSD.1 (A ✅) | OSD.2 (B ✅) | OSD.3 (❌ LỖI) | OSD.4 (empty) | OSD.5 (empty) |
-------------------------------------------------
Object A Object B (MẤT Object A, B)
- OSD.3 bị lỗi, mất bản sao của Object A và Object B
- Cluster nhận diện tình trạng Undersized + Degraded PGs
📌 Ceph thực hiện Recovery:
-------------------------------------------------
| OSD.1 (A ✅) | OSD.2 (B ✅) | OSD.3 (❌ LỖI) | OSD.4 (A ✅) | OSD.5 (B ✅) |
-------------------------------------------------
Object A Object B (MẤT Object A, B) Object A (Recovery) Object B (Recovery)
- Ceph chọn OSD.4 để sao chép Object A từ OSD.1
- Ceph chọn OSD.5 để sao chép Object B từ OSD.2
- Quá trình sao chép dữ liệu (Recovery) có thể gây tăng tải I/O trên cluster
📌 Sau khi Recovery hoàn tất (Cluster trở về trạng thái ổn định):
-------------------------------------------------
| OSD.1 (A ✅) | OSD.2 (B ✅) | OSD.3 (❌ LỖI) | OSD.4 (A ✅) | OSD.5 (B ✅) |
-------------------------------------------------
Object A Object B (MẤT) Object A (ĐÃ PHỤC HỒI) Object B (ĐÃ PHỤC HỒI)
- Dữ liệu đã được sao chép đầy đủ, đảm bảo replica size = 2
- Cluster quay về trạng thái HEALTH_OK
💡 Giải thích:
- Khi OSD.3 bị lỗi, Ceph phát hiện mất bản sao của Object A và Object B.
- Sau Recovery, Ceph sao chép Object A từ OSD.1 → OSD.4 và Object B từ OSD.2 → OSD.5.
- Khi hoàn tất, cluster có đủ bản sao, trạng thái HEALTH_OK được khôi phục. 🚀
3️⃣ So sánh Backfill và Recovery
Tiêu chí | Backfill | Recovery |
---|---|---|
Mục đích | Điền dữ liệu vào OSD mới hoặc OSD được đưa trở lại hệ thống | Khôi phục dữ liệu bị mất khi OSD gặp lỗi |
Khi nào xảy ra? | Khi thêm OSD mới hoặc thay đổi CRUSH map | Khi OSD bị lỗi hoặc bị loại bỏ |
Cơ chế hoạt động | Sao chép dữ liệu vào OSD mới để đảm bảo phân phối đồng đều | Sao chép dữ liệu để phục hồi đủ số bản sao |
Tác động đến hiệu suất | Ít ảnh hưởng nếu được điều chỉnh hợp lý | Ảnh hưởng cao vì cần đảm bảo cluster hoạt động ổn định |
4️⃣ Cách tối ưu Backfill và Recovery để tránh ảnh hưởng hiệu suất
Cả hai quá trình này đều tiêu tốn tài nguyên mạng và I/O, vì vậy cần tối ưu để tránh ảnh hưởng đến hiệu suất của hệ thống:
✅ Điều chỉnh tốc độ Backfill
- Giảm tốc độ Backfill nếu cluster đang chịu tải cao:
ceph config set osd osd_max_backfills 1
- Giới hạn băng thông Backfill:
ceph config set osd osd_recovery_max_active 1
✅ Điều chỉnh tốc độ Recovery
- Giới hạn tốc độ Recovery để không làm chậm IO chính:
ceph config set osd osd_recovery_sleep 0.1
- Ưu tiên dữ liệu quan trọng trước:
ceph osd set-require-min-compat-client luminous
- Như vậy nói tóm gọn 2 quá trình Backfill và Recovery chúng sẽ như sau:
- Backfill là quá trình phân phối lại dữ liệu khi cluster vẫn khỏe mạnh, nhưng có sự thay đổi về dung lượng hoặc cấu trúc như thêm OSD mới, đưa OSD trở lại, hoặc thay đổi CRUSH map. Cluster vẫn đủ bản sao object, nhưng cần di chuyển dữ liệu để tối ưu hóa phân bổ.
- Recovery là quá trình khôi phục dữ liệu bị mất khi cluster gặp sự cố, ví dụ như OSD bị lỗi, out khỏi cluster, hoặc có vấn đề về mạng. Lúc này, một số object có thể bị thiếu hoặc giảm số lượng bản sao, khiến Ceph phải nhanh chóng sao chép lại dữ liệu để phục hồi trạng thái an toàn.
💡 Tóm gọn:
- Backfill = Tái phân bố dữ liệu vì thay đổi hệ thống, cluster vẫn khỏe mạnh ✅
- Recovery = Khôi phục dữ liệu bị mất do sự cố, cluster đang lỗi ⚠️
🔥 Kết luận
- Backfill xảy ra khi bạn thêm OSD mới hoặc thay đổi CRUSH map, Recovery xảy ra khi OSD bị lỗi.
- Cả hai đều sao chép dữ liệu, nhưng mục đích và cơ chế hoạt động khác nhau.
- Tối ưu các thông số Backfill và Recovery giúp duy trì hiệu suất tốt hơn.
Hy vọng bài viết này giúp bạn hiểu rõ hơn về Backfill vs Recovery trong Ceph. Nếu bạn có bất kỳ câu hỏi nào, hãy để lại bình luận nhé! 🚀