Vấn đề gỡ bỏ runtime override của injectargs khi daemon đang chạy trong Ceph

1. Khái niệm runtime override với injectargs

Injectargs là cơ chế gửi trực tiếp tham số cấu hình mới đến daemon (ví dụ OSD) để áp dụng ngay lập tức trong runtime, không ghi vào Config DB.

Khi một tham số được thay đổi bằng injectargs, giá trị đó sẽ ưu tiên hơn giá trị trong Config DB cho đến khi daemon được restart.

Ví dụ:

# Giá trị trong Config DB là 3
ceph config get osd osd_recovery_max_active_hdd
3

# Thay đổi tạm thời runtime thành 1
ceph tell 'osd.*' injectargs --osd-recovery-max-active-hdd=1

Kết quả là tất cả OSD đang chạy sẽ dùng 1 cho tới khi restart, bất kể trong Config DB đang là 3.

2. Vấn đề khi muốn gỡ bỏ runtime override

Không có lệnh “unset” runtime override: Ceph không hỗ trợ câu lệnh để xóa giá trị runtime đã set bằng injectargs mà không restart daemon.

Hậu quả:

  • Nếu giá trị trong Config DB khác giá trị runtime, daemon sẽ tiếp tục dùng giá trị runtime cho đến khi restart.
  • Điều này gây khó khi muốn áp dụng ngay một giá trị mới trong Config DB, vì các daemon đang giữ override runtime sẽ không nhận.

Minh họa logic ưu tiên:

[Config DB] ---> (khởi động) ---> [Runtime Config]
                                  ↑
                                  injectargs (ghi đè)
  • Lúc chạy: Runtime Config > Config DB.
  • Sau restart: Runtime Config bị xóa, OSD đọc lại từ Config DB.

3. Giải pháp xử lý

Đồng bộ runtime với Config DB

Nếu Config DB đã được set giá trị mong muốn, gửi lại injectargs với đúng giá trị đó để runtime áp dụng ngay:

ceph config set osd osd_recovery_max_active_hdd 3
ceph tell 'osd.*' injectargs --osd-recovery-max-active-hdd=3

Cách này giúp không cần restart ngay, toàn bộ OSD đồng bộ runtime về cùng giá trị.

Rolling restart để “xóa sạch” runtime override

Lên lịch restart từng OSD (hoặc từng node) trong bảo trì để trả về đúng giá trị từ Config DB.

Giám sát và phát hiện OSD lệch config

So sánh giá trị runtime và Config DB:

# Runtime
ceph daemon osd.<ID> config show | jq '.osd_recovery_max_active_hdd'

# Config DB
ceph config get osd osd_recovery_max_active_hdd

Có thể viết script lọc ra các OSD có giá trị runtime ≠ DB để xử lý.

4. Các giải pháp tương đương hoặc hỗ trợ

Ceph CLI:

  • ceph config set → thay đổi và lưu vào Config DB (persistent).
  • ceph tell <daemon> injectargs → thay đổi runtime tạm thời.

Orchestration tools (ví dụ cephadm, rook-ceph):

  • Dùng để quản lý rolling restart tự động và đảm bảo đồng bộ config.

Quản lý config qua Ansible hoặc SaltStack:

  • Viết playbook/task đồng bộ giá trị runtime với DB.

Script so khớp DB vs Runtime qua ceph tell

cat <<'BASH' >/tmp/ceph_config_drift.sh
#!/usr/bin/env bash
set -euo pipefail

# 1. Danh sách tham số cần kiểm tra: nếu không truyền argv thì dùng mặc định
if [ "$#" -gt 0 ]; then
  PARAMS=("$@")
else
  PARAMS=(osd_recovery_max_active osd_recovery_op_priority osd_max_backfills osd_recovery_max_chunk)
fi

# 2. Mức song song
P=8

# 3. Cần jq
if ! command -v jq >/dev/null 2>&1; then
  echo "ERROR: jq không có trong PATH." >&2
  exit 1
fi

# 4. Thư mục tạm + file output
TMPDIR="$(mktemp -d)"
OUT_JSON="${PWD}/ceph-osd-config-drift.json"
export TMPDIR

# 5. Danh sách OSD
mapfile -t OSD_LIST < <(ceph osd ls | tr ' ' '\n' | sed '/^$/d')

# 6. Xử lý từng OSD bằng ceph tell (không cần chạy trên host OSD)
printf "%s\n" "${OSD_LIST[@]}" | xargs -n1 -P "$P" -I{} bash -c '
  set -euo pipefail
  osd="$1"; shift
  keys=("$@")

  # Lấy runtime (JSON) qua ceph tell; tăng timeout nếu cụm chậm
  if ! RUNTIME_JSON="$(timeout 15s ceph tell "osd.${osd}" config show 2>/dev/null)"; then
    echo "SKIP osd.${osd}: ceph tell config show timeout/failed" >&2
    exit 0
  fi

  # Thu thập chênh lệch: "key \t db \t runtime"
  lines=""
  for key in "${keys[@]}"; do
    r="$(jq -r --arg k "$key" ".[\$k] // empty" <<<"$RUNTIME_JSON" | tr -d "\r" || true)"
    d="$(timeout 10s ceph config get "osd.${osd}" "$key" 2>/dev/null | tr -d "\r" || true)"
    if [ -z "$r" ] && [ -z "$d" ]; then
      continue
    fi
    if [ "$r" != "$d" ]; then
      lines+="${key}\t${d}\t${r}\n"
    fi
  done

  # Nếu có drift, ghi ra JSON cho OSD này
  if [ -n "$lines" ]; then
    printf "%b" "$lines" | jq -R -s \
      '\''split("\n") | map(select(length>0)) | map(split("\t") | {key: .[0], db: .[1], runtime: .[2]})'\'' \
      > "$TMPDIR/$osd.drift.json"

    jq -n --arg osd "$osd" --slurpfile arr "$TMPDIR/$osd.drift.json" \
      '\''{osd:$osd, drift:$arr[0]}'\'' > "$TMPDIR/$osd.json"

    rm -f "$TMPDIR/$osd.drift.json"
  fi
' _ {} "${PARAMS[@]}"

# 7. Ghép kết quả; sort theo OSD và sort các key drift
if ls "$TMPDIR"/*.json >/dev/null 2>&1; then
  jq -s '
    map(. | .osd = (.osd|tonumber)) |
    sort_by(.osd) |
    map(.drift |= (sort_by(.key))) |
    map(. | .osd = (.osd|tostring))
  ' "$TMPDIR"/*.json > "$OUT_JSON"
else
  echo "[]" > "$OUT_JSON"
fi

rm -rf "$TMPDIR"
echo "Wrote $OUT_JSON"
BASH

bash /tmp/ceph_config_drift.sh

Kết quả.

cat /home/hoanghd3/ceph-osd-config-drift.json
[
  {
    "osd": "8",
    "drift": [
      {
        "key": "osd_recovery_max_chunk",
        "db": "8388608",
        "runtime": "2097152"
      }
    ]
  },
  {
    "osd": "9",
    "drift": [
      {
        "key": "osd_recovery_max_chunk",
        "db": "8388608",
        "runtime": "2097152"
      }
    ]
  }
]

Giải thích ngắn gọn.

  • ceph daemon chỉ dùng được trên host OSD, vì nó đọc admin socket cục bộ (/var/run/ceph/...asok).
  • ceph tell gửi lệnh từ xa đến OSD qua cluster, phù hợp khi bạn chạy lệnh từ MON/MGR node.
  • Script trên:
    • Lấy runtime bằng ceph tell osd.<id> config show (JSON).
    • Lấy DB bằng ceph config get osd.<id> <key>.
    • So sánh và xuất ceph-osd-config-drift.json chỉ với OSD có drift.
    • P=8 nghĩa là xử lý 8 OSD song song.

5. Lời khuyên

Khi muốn áp dụng thay đổi ngay lập tức cho tất cả daemon, hãy kết hợp:

  • ceph config set để lưu giá trị vào DB.
  • ceph tell … injectargs để áp dụng runtime ngay.

Luôn giám sát các OSD có giá trị runtime khác DB để tránh trường hợp cấu hình mất đồng bộ lâu dài.

Tránh dùng injectargs đơn lẻ trong môi trường production nếu muốn thay đổi bền vững, trừ khi chỉ đang thử nghiệm.

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