Cách hành xử của Ceph khi mất kết nối OSD

Khi một OSD bị down, Ceph sẽ không ngay lập tức thực hiện rebalance (tái phân phối dữ liệu) mà sẽ chờ một khoảng thời gian để xác định xem OSD đó có thực sự mất hay không.

Cơ chế hoạt động cụ thể như sau:

  • OSD bị down
    • Khi một OSD mất kết nối hoặc ngừng hoạt động, Ceph sẽ đánh dấu nó là downout sau một khoảng thời gian nhất định nếu nó không tự khôi phục.
    • Trạng thái này sẽ được phản ánh trong ceph health detail và các PG sử dụng OSD đó có thể chuyển sang trạng thái undersized, degraded.
  • Chờ thời gian để xác nhận mất dữ liệu
    • Ceph có tham số mon_osd_report_timeout (mặc định 900 giây = 15 phút), trong thời gian này nếu OSD hoạt động trở lại thì hệ thống không thực hiện rebalance.
  • Nếu OSD không quay lại, Ceph thực hiện backfill & recovery
    • Nếu sau mon_osd_report_timeout, OSD vẫn không quay lại, Ceph sẽ bắt đầu sao chép lại dữ liệu bị thiếu từ các OSD còn sống sang các OSD khác để đảm bảo mức replica được duy trì.
    • Quá trình này gọi là backfill & recovery, làm tăng tải IO trên cluster.
  • Khi OSD bị mất hoàn toàn (out)
    • Nếu OSD mất hoàn toàn và admin chủ động remove OSD khỏi cluster bằng lệnh: ceph osd out <osd_id> ceph osd crush remove osd.<osd_id> → Lúc này Ceph sẽ rebalance lại dữ liệu ngay lập tức để đảm bảo số lượng bản sao đúng theo replication size.

Ví dụ cụ thể:

  • Pool có replica 2, có một object obj_1234 được lưu trên OSD.10 và OSD.20.
  • Nếu OSD.10 bị down, hệ thống sẽ:
    • Đánh dấu OSD.10 là down.
    • Các PG liên quan sẽ có trạng thái undersized + degraded.
    • Chờ mon_osd_report_timeout để xem OSD.10 có quay lại không.
    • Nếu OSD.10 không quay lại, Ceph sẽ chọn một OSD khác (ví dụ OSD.30) và sao chép obj_1234 từ OSD.20 → OSD.30 để đảm bảo mức replica là 2.

Dưới đây là sơ đồ mô tả quá trình Ceph xử lý khi một OSD bị down, từ trạng thái “Undersized + Degraded” đến khi phục hồi dữ liệu:

Trạng thái ban đầu (Replica 2, OSD.10 và OSD.20 lưu object obj_1234)
-------------------------------------------------
| OSD.10 (obj_1234)  |  OSD.20 (obj_1234)  |
-------------------------------------------------

1️⃣ OSD.10 bị down → PG trở thành Undersized + Degraded
-------------------------------------------------
| OSD.10 (DOWN ❌)  |  OSD.20 (obj_1234)  |
-------------------------------------------------
                 🔻
           Ceph chờ mon_osd_report_timeout

2️⃣ Nếu OSD.10 không quay lại → Ceph backfill & recovery
-------------------------------------------------
| OSD.30 (obj_1234 ✅)  |  OSD.20 (obj_1234)  |
-------------------------------------------------
                 🔺
   Ceph đã phục hồi replica về trạng thái an toàn

💡 Sơ đồ ví dụ trên cho ta thấy:

  • Khi OSD.10 bị down, Ceph chờ mon_osd_report_timeout (900s mặc định).
  • Nếu OSD.10 không quay lại, Ceph sao chép object obj_1234 từ OSD.20 sang OSD.30.
  • Cuối cùng, hệ thống khôi phục lại mức replica = 2, đảm bảo dữ liệu an toàn. 🚀

Bạn có thể kiểm tra giá trị của mon_osd_report_timeout trong Ceph bằng lệnh sau:

shell> ceph config get mon mon_osd_report_timeout
900

Nếu bạn muốn xem toàn bộ cấu hình liên quan đến mon, bạn có thể chạy:

shell> ceph config show mon.CEPH-LAB-MON-071
NAME                                            VALUE                                                                                                                                      SOURCE    OVERRIDES             IGNORES
auth_allow_insecure_global_id_reclaim           true                                                                                                                                       mon                                    
cluster_network                                                                                                                                                                            default                         mon    
container_image                                 10.237.7.74:5000/ceph/ceph@sha256:479f0db9298e37defcdedb1edb8b8db25dd0b934afd6b409d610a7ed81648dbc                                         mon                                    
daemonize                                       false                                                                                                                                      override                               
keyring                                         $mon_data/keyring                                                                                                                          default                                
leveldb_block_size                              65536                                                                                                                                      default                                
leveldb_cache_size                              536870912                                                                                                                                  default                                
leveldb_compression                             false                                                                                                                                      default                                
leveldb_log                                                                                                                                                                                default                                
leveldb_write_buffer_size                       33554432                                                                                                                                   default                                
log_to_file                                     true                                                                                                                                       mon       default[false]               
log_to_journald                                 false                                                                                                                                      mon       default[true]                
log_to_stderr                                   false                                                                                                                                      mon       (default[false])             
mon_cluster_log_to_file                         true                                                                                                                                       mon       default[false]               
mon_cluster_log_to_journald                     false                                                                                                                                      mon       default[true]                
mon_cluster_log_to_stderr                       false                                                                                                                                      mon       (default[false])             
mon_host                                        [v2:10.237.7.71:3300/0,v1:10.237.7.71:6789/0] [v2:10.237.7.72:3300/0,v1:10.237.7.72:6789/0] [v2:10.237.7.73:3300/0,v1:10.237.7.73:6789/0]  file                                   
mon_memory_target                               34359738368                                                                                                                                mon                                    
mon_osd_down_out_subtree_limit                  host                                                                                                                                       mon                                    
mon_pg_warn_max_object_skew                     0.500000                                                                                                                                   mon                                    
mon_warn_on_insecure_global_id_reclaim          false                                                                                                                                      mon                                    
mon_warn_on_insecure_global_id_reclaim_allowed  false                                                                                                                                      mon                                    
no_config_file                                  false                                                                                                                                      override                               
osd_pool_default_pg_autoscale_mode              off                                                                                                                                        mon                                    
osd_pool_default_size                           2                                                                                                                                          mon                                    
public_network                                  10.237.7.0/24                                                                                                                              file      (mon[10.237.7.0/24])         
rbd_default_features                            61                                                                                                                                         default                                
rbd_qos_exclude_ops                             0                                                                                                                                          default                                
setgroup                                        ceph                                                                                                                                       cmdline                                
setuser                                         ceph                                                                                                                                       cmdline 

Ngoài ra, nếu bạn muốn kiểm tra tất cả các thông số cấu hình của Ceph, bạn có thể sử dụng:

shell> ceph config dump
WHO     MASK                   LEVEL     OPTION                                          VALUE                                                                                               RO
global                         advanced  cluster_network                                 10.237.7.0/24                                                                                       * 
global                         basic     container_image                                 10.237.7.74:5000/ceph/ceph@sha256:479f0db9298e37defcdedb1edb8b8db25dd0b934afd6b409d610a7ed81648dbc  * 
global                         basic     log_to_file                                     true                                                                                                  
global                         basic     log_to_journald                                 false                                                                                                 
global                         basic     log_to_stderr                                   false                                                                                                 
global                         advanced  mon_cluster_log_to_file                         true                                                                                                  
global                         advanced  mon_cluster_log_to_journald                     false                                                                                                 
global                         advanced  mon_cluster_log_to_stderr                       false                                                                                                 
global                         advanced  mon_osd_down_out_subtree_limit                  host                                                                                                  
global                         advanced  osd_pool_default_pg_autoscale_mode              off                                                                                                   
global                         advanced  osd_pool_default_size                           2                                                                                                     
mon                            advanced  auth_allow_insecure_global_id_reclaim           true                                                                                                  
mon                            basic     mon_memory_target                               34359738368                                                                                           
mon                            advanced  mon_pg_warn_max_object_skew                     0.500000                                                                                              
mon                            advanced  mon_warn_on_insecure_global_id_reclaim          false                                                                                                 
mon                            advanced  mon_warn_on_insecure_global_id_reclaim_allowed  false                                                                                                 
mon                            advanced  public_network                                  10.237.7.0/24                                                                                       * 
mgr                            advanced  mgr/cephadm/container_image_alertmanager        10.237.7.74:5000/prometheus/alertmanager:v0.25.0                                                    * 
mgr                            advanced  mgr/cephadm/container_image_grafana             10.237.7.74:5000/ceph/ceph-grafana:8.3.5                                                            * 
mgr                            advanced  mgr/cephadm/container_image_node_exporter       10.237.7.74:5000/prometheus/node-exporter:v1.5.0                                                    * 
mgr                            advanced  mgr/cephadm/container_image_prometheus          10.237.7.74:5000/prometheus/prometheus:v2.43.0                                                      * 
mgr                            advanced  mgr/cephadm/container_init                      True                                                                                                * 
mgr                            advanced  mgr/cephadm/migration_current                   6                                                                                                   * 
mgr                            advanced  mgr/dashboard/ALERTMANAGER_API_HOST             http://CEPH-LAB-MON-071:9093                                                                        * 
mgr                            advanced  mgr/dashboard/FEATURE_TOGGLE_CEPHFS             false                                                                                               * 
mgr                            advanced  mgr/dashboard/FEATURE_TOGGLE_ISCSI              false                                                                                               * 
mgr                            advanced  mgr/dashboard/FEATURE_TOGGLE_NFS                false                                                                                               * 
mgr                            advanced  mgr/dashboard/FEATURE_TOGGLE_RGW                false                                                                                               * 
mgr                            advanced  mgr/dashboard/GRAFANA_API_SSL_VERIFY            false                                                                                               * 
mgr                            advanced  mgr/dashboard/GRAFANA_API_URL                   https://CEPH-LAB-MON-071:3000                                                                       * 
mgr                            advanced  mgr/dashboard/PROMETHEUS_API_HOST               http://CEPH-LAB-MON-071:9095                                                                        * 
mgr                            advanced  mgr/dashboard/ssl_server_port                   8443                                                                                                * 
mgr                            advanced  mgr/orchestrator/orchestrator                   cephadm                                                                                               
mgr                            advanced  mgr/prometheus/rbd_stats_pools                  POOL-LAB-01                                                                                         * 
osd     host:CEPH-LAB-MON-071  basic     osd_memory_target                               1528672119                                                                                            
osd                            advanced  osd_memory_target_autotune                      true                                                                                                  
osd.0                          basic     osd_mclock_max_capacity_iops_ssd                28227.305724                                                                                          
osd.1                          basic     osd_mclock_max_capacity_iops_ssd                23633.250708                                                                                          

< đã lược bỏ bớt output>                                                                                          
                                                                                      
osd.8                          basic     osd_mclock_max_capacity_iops_ssd                33187.380764                                                                                          
osd.9                          basic     osd_mclock_max_capacity_iops_ssd                1428.586654  

Mặc định, giá trị của mon_osd_report_timeout thường là 900 giây (15 phút), tức là nếu một OSD mất kết nối, Ceph sẽ chờ 15 phút trước khi thực hiện các bước tiếp theo như đánh dấu out hoặc bắt đầu recovery.

Câu hỏi đặt ra là hệ thống có tự remove OSD ra khỏi Cluster khi vượt quá thời gian của mon_osd_report_timeout hay không?

Khi một OSD bị down và vượt quá thời gian mon_osd_report_timeout, nó không tự động bị remove khỏi cluster mà sẽ được đánh dấu là out sau một thời gian nhất định. Cụ thể:

🔹 Cách Ceph xử lý OSD down lâu

  • OSD bị down
    • Khi OSD mất kết nối, Ceph sẽ đánh dấu nó là down.
    • Hệ thống vẫn giữ metadata của OSD đó, không loại bỏ ngay.
  • Sau mon_osd_report_timeout (mặc định: 900 giây = 15 phút)
    • Monitor sẽ coi OSD là không phản hồi trong thời gian dài.
    • Các PG chứa OSD này có thể rơi vào trạng thái undersized, degraded, hoặc inconsistent.
  • Sau osd_out_timeout (mặc định: 600 giây = 10 phút)
    • Nếu OSD vẫn chưa quay lại, nó sẽ bị đánh dấu là “out”.
    • Hệ thống bắt đầu rebalance dữ liệu sang các OSD khác để đảm bảo đủ số bản sao (replicas).
  • OSD vẫn không quay lại?
    • Nó vẫn tồn tại trong cluster, nhưng sẽ không được sử dụng để lưu trữ dữ liệu.
    • Nếu muốn loại bỏ hẳn, bạn phải xóa thủ công bằng: ceph osd purge <osd_id> --yes-i-really-mean-it

Kêt luận

  • mon_osd_report_timeout không tự động xóa OSD, chỉ đánh dấu nó là down.
  • osd_out_timeout sẽ đánh dấu nó là out nếu mất kết nối quá lâu.
  • Ceph sẽ tự động rebalance dữ liệu nếu một OSD bị out.
  • Nếu OSD bị hỏng hoàn toàn, bạn phải xóa thủ công.

Bài viết gần đây

spot_img

Related Stories

Leave A Reply

Please enter your comment!
Please enter your name here

Đăng ký nhận thông tin bài viết qua email