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ểm | Nhược điểm |
---|---|---|
dd | Dễ dùng, đơn giản, nhanh | Không linh hoạt, không đo chi tiết |
fio | Mạ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!