1. Mô tả vấn đề.
Đây là một cảnh báo phổ biến khi các Placement Groups (PGs) chưa được thực hiện deep-scrub (kiểm tra checksum dữ liệu) trong thời gian quy định.
HEALTH_WARN 1161 pgs not deep-scrubbed in time
là một lỗi bạn có thể xem được bằng lệnh ceph health detail
trong Ceph:
HEALTH_WARN 1161 pgs not deep-scrubbed in time
[WRN] PG_NOT_DEEP_SCRUBBED: 1161 pgs not deep-scrubbed in time
pg 86.fff not deep-scrubbed since 2024-08-21T02:35:25.733187+0000
- PGs not deep-scrubbed in time: Cảnh báo rằng có 1161 PGs chưa được kiểm tra checksum dữ liệu trong thời gian quy định.
- pg 86.fff: PG cụ thể đã không được deep-scrub kể từ 2024-08-21.
Mặc dù đã thay đổi tham số osd_deep_scrub_interval
từ mặc định 1 tuần (604800 giây) thành 2 tuần (1209600 giây), nhưng hệ thống vẫn báo cảnh báo.
2. Kiểm tra tham số cấu hình.
Để xem thông tin về tham số osd_deep_scrub_interval
:
ceph config help osd_deep_scrub_interval
Kết quả:
osd_deep_scrub_interval - Deep scrub each PG (i.e., verify data checksums) at least this often
(float, advanced)
Default: 604800.000000
Can update at runtime: true
Services: [osd]
- Mặc định: 604800 giây (1 tuần).
- Có thể thay đổi tại runtime: true.
- Áp dụng cho dịch vụ:
[osd]
.
3. Phân tích vấn đề.
Thay đổi cấu hình.
ceph config set osd osd_deep_scrub_interval 1209600
Nhưng hệ thống vẫn cảnh báo, dù giá trị deep_scrub_stamp (thời gian của lần deep-scrub gần nhất) nhỏ hơn khoảng thời gian quy định 2 tuần.
4. Nguyên nhân.
Cảnh báo không chỉ dựa vào cấu hình OSD (osd_deep_scrub_interval
của OSD) mà còn phụ thuộc vào cấu hình của MGR (osd_deep_scrub_interval
của MGR). MGR sử dụng công thức để xác định thời gian trước khi cảnh báo:
(mon_warn_pg_not_deep_scrubbed_ratio * deep_scrub_interval) + deep_scrub_interval
mon_warn_pg_not_deep_scrubbed_ratio
: Mặc định là 0.75 (75%).deep_scrub_interval
: Thời gian quy định cho mỗi lần deep-scrub.
Ví dụ với cấu hình mặc định (1 tuần = 7 ngày):
(0.75 * 7 ngày) + 7 ngày = 12.25 ngày
=> Nếu PG chưa được deep-scrub trong vòng 12.25 ngày, hệ thống sẽ cảnh báo.
5. Giải pháp khắc phục.
Có hai cách để khắc phục vấn đề này:
Cách 1: Thay đổi cấu hình mặc định.
Cập nhật giá trị osd_deep_scrub_interval
cho cả OSD và MGR:
# Thay đổi global
ceph config set global osd_deep_scrub_interval 1209600
# Hoặc thay đổi cụ thể cho OSD và MGR
ceph config set osd osd_deep_scrub_interval 1209600
ceph config set mgr osd_deep_scrub_interval 1209600
- Ý nghĩa:
- OSD sẽ có 2 tuần để hoàn thành deep-scrub tất cả PG.
- MGR cũng sẽ sử dụng khoảng thời gian 2 tuần (thay vì mặc định 12.25 ngày) trước khi đưa ra cảnh báo.
Cách 2: Cấu hình riêng từng pool.
Đặt khoảng thời gian deep_scrub_interval
riêng cho từng pool, phù hợp với đặc điểm phần cứng (SSD hoặc HDD):
ceph osd pool set <POOL> deep_scrub_interval 1209600
- Ưu điểm:
- Pool dùng SSD có thể cần thời gian ngắn hơn.
- Pool dùng HDD (chậm hơn) có thể cần thời gian dài hơn.
Lưu ý
Sự khác biệt giữa OSD và MGR:
- OSD: Điều chỉnh thời gian để thực hiện deep-scrub trên từng PG.
- MGR: Kiểm tra dấu thời gian (
deep_scrub_stamp
) của lần deep-scrub gần nhất và so sánh với công thức(0.75 * interval) + interval
.
Thực hiện kiểm tra:
- Xem thời gian deep-scrub gần nhất:
ceph pg dump | grep deep_scrub_stamp
Kiểm tra trạng thái cảnh báo chi tiết:
ceph health detail
Kết luận
- Để loại bỏ cảnh báo “PGs not deep-scrubbed in time”, bạn cần đồng bộ cấu hình
osd_deep_scrub_interval
giữa OSD và MGR. - Nên cân nhắc tùy chỉnh cấu hình riêng theo từng pool để tối ưu hóa hiệu suất.
Tham khảo https://heiterbiswolkig.blogs.nde.ag/2024/09/06/pgs-not-deep-scrubbed-in-time/