Ceph為了保障數據高可用一般來說同一份數據會存儲3份,那么數據在寫入的時候就會存在數據同步的問題。Ceph也是提供了對應的工具可以周期性的進行數據一致性檢查。一般來說有以下兩種檢查方式:
1)輕量級:主要是檢查object數量、object源數據(object metadata)信息是否一致(文件大小等),若存在不一致的情況則從主節點重新復制一份。輕量級檢查主要是檢查磁盤壞道等,每天檢查一次。
2)深度檢查:進行數據的內容進行Hash檢查(bit to bit),那么在數據量非常大的時候將對性能造成影響。深度檢查時每周檢查一次。
手動觸發數據檢查
1)檢查PG數據一致性
// 查看當前pg信息
[root@node-1 ~]# ceph pg dump dumped all
// 輕量檢查:ceph pg scrub {pgid}
[root@node-1 ~]# ceph pg scrub 1.3f instructing pg 1.3f on osd.1 to scrub
// 深度檢查:ceph pg deep-scrub {pgid}
[root@node-1 ~]# ceph pg deep-scrub 1.3f instructing pg 1.3f on osd.1 to deep-scrub
設置scrub參數
// 獲取配置參數
[root@node-1 ~]# ceph --admin-daemon /var/run/ceph/ceph-mon.node-1.asok config get osd_scrub_max_interval { "osd_scrub_max_interval": "604800.000000" }
// 設置配置參數
[root@node-1 ~]# ceph --admin-daemon /var/run/ceph/ceph-mon.node-1.asok config set osd_scrub_max_interval 240 { "osd_scrub_max_interval": "604800.000000" }
配置項 | 默認值 | 說明 |
---|---|---|
osd_scrub_chunk_min | 5 | PGScrub對應的Object數目的最小值 |
osd_scrub_chunk_max | 25 | PGScrub對應的Object數目的最大值 |
osd_deep_scrub_interval | 604800 | Deep scrub周期,單位是秒,默認是604800,也就是一周 |
osd_scrub_sleep | 0 | 兩個PGScrub Op間休息一段時間 |
osd_heartbeat_interval | 6 | 周期性執行OSD::sched_scrub函數 |
osd_scrub_begin_hour | 0 | 允許觸發Scrub的時間段的起始時間 |
osd_scrub_end_hour | 0 | 允許觸發Scrub的時間段的結束時間,結束時間可以小於起始時間 |
osd_scrub_auto_repair | false | 自動repair不一致Object,不支持副本池,只支持EC池 |
osd_max_scrubs | 1 | OSD允許同時運行的Scrub任務的最大數目 |
osd_scrub_min_interval | 86400 | 一天,單位是秒,默認是86400,也就是一天 |
osd_scrub_max_interval | 604800 | 一周,單位是秒,默認是604800,也就是一周 |
osd_scrub_interval_randomize_ratio | 0.5 | [min, min*(1+randomize_ratio)] |
osd_scrub_during_recovery | true | 允許在OSD Recovery過程中執行Scrub任務 |
osd_scrub_load_threshold | 0.5 | 只有負載低於該值時才允許觸發Scrub |