Tự động hóa kiểm thử Ceph RBD, tạo, ghi, xoá và dọn dẹp chỉ với một script

1. Tổng quan

Trong quá trình triển khai hoặc kiểm thử hệ thống lưu trữ phân tán Ceph, đặc biệt là Ceph RBD (RADOS Block Device), chúng ta thường cần:

  • Tạo pool mới
  • Tạo block image
  • Ghi dữ liệu để đo hiệu năng hoặc kiểm tra tính ổn định
  • Xoá dữ liệu và hoàn nguyên hệ thống sau khi test

Việc thực hiện thủ công các bước trên có thể mất thời gian và dễ mắc lỗi. Vì vậy, bài viết này chia sẻ một script shell đơn giản giúp tự động hóa toàn bộ quá trình kiểm thử Ceph RBD chỉ với một lần chạy.

2. Mục tiêu

Script sẽ tự động:

  • Kiểm tra và tạo một pool mới (nếu chưa tồn tại)
  • Tạo image block với dung lượng bạn định nghĩa
  • Map image thành thiết bị block
  • Tạo filesystem và mount
  • Ghi dữ liệu test
  • Xoá dữ liệu, unmount và unmap
  • Xoá image và pool để trả lại hệ thống sạch

📄 Nội dung script

Dưới đây là nội dung script ceph_rbd_test_full.sh:

#!/bin/bash

POOL_NAME="test-pool"
IMAGE_NAME="test-image"
IMAGE_SIZE_MB=5120     # Bạn có thể đổi giá trị này để test size khác
MOUNT_POINT="/mnt/ceph_test"

echo "[*] Checking if pool exists..."
if ! ceph osd pool ls | grep -q "^${POOL_NAME}$"; then
  echo "[*] Creating pool $POOL_NAME..."
  ceph osd pool create $POOL_NAME 128 128
  rbd pool init $POOL_NAME
else
  echo "[*] Pool $POOL_NAME already exists."
fi

echo "[*] Creating RBD image $IMAGE_NAME (${IMAGE_SIZE_MB}MB)..."
rbd create ${POOL_NAME}/${IMAGE_NAME} --size $IMAGE_SIZE_MB

echo "[*] Mapping RBD image..."
DEVICE=$(rbd map ${POOL_NAME}/${IMAGE_NAME} --name client.admin 2>/dev/null)

if [ -z "$DEVICE" ]; then
  echo "[*] Image may already be mapped, trying to detect device..."
  DEVICE=$(rbd showmapped | awk -v img="${POOL_NAME}/${IMAGE_NAME}" '$2 == img {print $5}' | head -n1)
fi

if [ -z "$DEVICE" ] || [ ! -b "$DEVICE" ]; then
  echo "[!] Failed to get mapped RBD device!"
  rbd showmapped
  exit 1
fi

echo "[*] Creating ext4 filesystem on $DEVICE"
mkfs.ext4 -F $DEVICE

echo "[*] Mounting $DEVICE to $MOUNT_POINT"
mkdir -p $MOUNT_POINT
mount $DEVICE $MOUNT_POINT

echo "[*] Writing test data ($IMAGE_SIZE_MB MB)..."
dd if=/dev/zero of=$MOUNT_POINT/testfile bs=1M count=$IMAGE_SIZE_MB status=progress

echo "[*] Deleting test data..."
rm -f $MOUNT_POINT/testfile
sync

echo "[*] Unmounting..."
umount $MOUNT_POINT

echo "[*] Unmapping RBD image..."
rbd unmap $DEVICE

echo "[*] Removing image and pool..."
rbd rm ${POOL_NAME}/${IMAGE_NAME}
ceph osd pool delete ${POOL_NAME} ${POOL_NAME} --yes-i-really-really-mean-it

echo "[✔] Test completed and cleaned up!"

🔍 Giải thích chi tiết quá trình

[Script Start]
     |
     +--> Kiểm tra pool (ceph osd pool ls)
     |     |
     |     +--> Nếu chưa có, tạo pool + init
     |
     +--> Tạo image RBD (rbd create)
     |
     +--> Map image => thiết bị block (rbd map)
     |
     +--> Tạo filesystem ext4 trên device (mkfs.ext4)
     |
     +--> Mount device tới thư mục test
     |
     +--> Ghi dữ liệu test bằng dd
     |
     +--> Xoá dữ liệu + unmount
     |
     +--> Unmap thiết bị
     |
     +--> Xoá image và pool
[Script End]

🌟 Ưu điểm

  • Tự động hóa hoàn toàn: Không cần thao tác tay từng bước.
  • An toàn: Script kiểm tra lỗi thiết bị map, xử lý trường hợp map sẵn.
  • Nhanh chóng hoàn nguyên: Xoá dữ liệu, unmap, xoá pool sau khi test.
  • Dễ tuỳ chỉnh: Thay đổi tên pool/image, dung lượng dễ dàng.

⚠ Nhược điểm

  • Ghi dữ liệu bằng /dev/zero → không phản ánh đúng hiệu năng I/O thực tế (chỉ đo throughput thuần).
  • Không đo chi tiết các chỉ số như IOPS, latency (có thể kết hợp với fio nếu cần).
  • Không xử lý đồng thời (multi-pool/multi-image).

📊 So sánh: dd vs fio trong test Ceph RBD

Công cụƯu điểmNhược điểm
ddDễ dùng, đơn giản, nhanhKhông linh hoạt, không đo chi tiết
fioMạnh, đo IOPS, latency,…Cần cấu hình phức tạp hơn

💡 Lời khuyên

  • Khi cần kiểm thử nhanh dung lượng, xác minh image hoạt động → dùng dd như script trên là đủ.
  • Nếu cần đo hiệu năng thực tế (latency, random I/O, mixed RW) → dùng fio.
  • Có thể mở rộng script này thành vòng lặp test, log output ra file, hoặc phân tích hiệu năng sau mỗi lần ghi.

🧪 Ví dụ nâng cao

Nếu muốn test ghi 1GB, chỉ cần sửa:

IMAGE_SIZE_MB=1024

Muốn dùng fio để test thay cho dd:

fio --name=test --filename=$MOUNT_POINT/testfile --size=1G --rw=randwrite --bs=4k --numjobs=4 --iodepth=16 --direct=1

3. Kết luận

Việc sử dụng shell script để tự động hóa quá trình kiểm thử Ceph RBD giúp tiết kiệm thời gian, giảm lỗi thao tác và dễ tái sử dụng. Dù đơn giản, nhưng script này là nền tảng tốt để xây dựng hệ thống kiểm thử phức tạp hơn sau này như hiệu năng IOPS, độ trễ, hoặc automation CI/CD trong môi trường Ceph Storage thực tế.

Bạn có thể gắn script này vào hệ thống tự động, hoặc tích hợp vào Jenkins, Ansible tùy nhu cầu. Nếu bạn có câu hỏi hoặc muốn mở rộng sang multi-image/multi-pool test, hãy để lại bình luận!

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