Danh sách bài viết trong series Bashscript từ cơ bản đến áp dụng vào DevOps
- Bài 1. Cơ Bản Bash Script trong DevOps
- Bài 2. Điều Kiện trong Bash DevOps: Xử Lý Logic Cơ Bản
- Bài 3. Vòng Lặp trong Bash DevOps: Tự Động Hóa Lặp Lại Hiệu Quả
- Bài 4. Xử Lý File trong Bash DevOps: Đọc, Ghi và Quản Lý Hiệu Quả
- Bài 5. Text Processing trong Bash DevOps: Grep, Awk, Sed Hiệu Quả
- Bài 6. Function trong Bash DevOps: Tái Sử Dụng Code Hiệu Quả
- Bài 7. Quản Lý Biến và Môi Trường trong Bash DevOps
- Bài 8. Cron Job trong Bash DevOps: Tự Động Hóa Theo Lịch Hiệu Quả
- Bài 9. Debug trong Bash DevOps: Tìm và Sửa Lỗi Hiệu Quả
- Bài 10. Error Handling Bash DevOps: Xử Lý Ngoại Lệ Hiệu Quả
- Bài 11. Bash trong CI/CD DevOps: Tích Hợp Pipeline Hiệu Quả
- Bài 12. Quản Lý Hệ Thống với Bash DevOps: Theo Dõi và Can Thiệp Hiệu Quả
- Bài 13. Tự Động Hóa SSH với Bash DevOps: Quản Lý Multi-Server Hiệu Quả
- Bài 14. Bash và Docker trong DevOps: Quản Lý Container Hiệu Quả
- Bài 15. Monitoring với Bash DevOps: Báo Cáo Hệ Thống Hiệu Quả
- Bài 16. Bash Nâng Cao: Parallel Execution trong DevOps Hiệu Quả
- Bài 17. Bash và API trong DevOps: Gọi và Xử Lý API Hiệu Quả
- Bài 18. Bash và Cloud CLI trong DevOps: Quản Lý Cloud Hiệu Quả
- Bài 19. Bash và Security trong DevOps: Bảo Mật Script Hiệu Quả
- Bài 20. Best Practice trong Bash DevOps: Làm Chủ Script Hiệu Quả
Bash Nâng Cao – Parallel Execution trong DevOps
Khi script Bash của bạn phải xử lý nhiều task – như kiểm tra 50 server hoặc build 20 container – chạy tuần tự (sequential) có thể mất hàng giờ. Parallel Execution trong Bash DevOps giúp bạn chạy song song Bash, tối ưu Bash, và biến script thành multi-thread Bash để hoàn thành nhanh hơn. Trong bài thứ mười sáu của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua cách dùng Bash để chạy song song, kèm thực hành thực tế. Đây là mẹo tôi học được khi tối ưu pipeline và hệ thống, không chỉ là lý thuyết đâu nhé!
Parallel Execution Là Gì?
Chạy Song Song trong Bash
Parallel execution là chạy nhiều task cùng lúc thay vì chờ từng task hoàn thành:
- Tuần tự: Kiểm tra server1 → server2 → server3.
- Song song: Kiểm tra server1, server2, server3 cùng lúc.
Ví dụ: Script SSH kiểm tra 10 server mất 50 giây tuần tự, nhưng chỉ 5 giây khi song song.
Lợi Ích trong DevOps
- Tốc độ: Giảm thời gian xử lý task lớn.
- Hiệu quả: Tận dụng tài nguyên server/runner.
- Pipeline: Tăng tốc build/test/deploy.
Thực tế: Tôi từng tối ưu script kiểm tra 30 container từ 2 phút xuống 10 giây nhờ parallel – tiết kiệm cả đống thời gian trong CI.
Công Cụ Parallel trong Bash
Background Jobs (&
)
Chạy lệnh nền với &
:
sleep 5 & sleep 3 & sleep 1 &
- Cả 3 lệnh chạy cùng lúc, hoàn thành sau 5 giây (thay vì 9 giây tuần tự).
Wait Command
Đợi tất cả job nền hoàn thành:
sleep 5 & sleep 3 &
wait
echo "Tất cả xong"
Xargs với -P
Chạy lệnh song song trên danh sách:
echo "server1 server2 server3" | xargs -n 1 -P 3 ssh user@{} "df -h"
-n 1
: Một đối số mỗi lần.-P 3
: Tối đa 3 process song song.
GNU Parallel
Công cụ mạnh hơn (cần cài):
parallel -j 3 ssh user@{} "df -h" ::: server1 server2 server3
-j 3
: 3 job cùng lúc.
Thực Hành: Script Kiểm Tra Multi-Server Song Song
Script Parallel
Tạo parallel_check.sh
:
#!/bin/bash
set -e
trap 'echo "Lỗi tại dòng $LINENO: $BASH_COMMAND" >&2; exit 1' ERR
# Biến
SERVERS=("user@server1" "user@server2" "user@server3") # Thay bằng server thật
LOG_FILE="/var/log/parallel_check.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
MAX_JOBS=3
# Hàm ghi log (thread-safe)
log() {
echo "[$TIMESTAMP] $1" >> "$LOG_FILE.lock" 2>/dev/null
mv "$LOG_FILE.lock" "$LOG_FILE" # Đảm bảo atomic write
}
# Hàm kiểm tra server
check_server() {
local SERVER=$1
local DISK=$(ssh "$SERVER" "df -h / | tail -1 | awk '{print \$5}' | cut -d'%' -f1" 2>/dev/null)
if [ -z "$DISK" ]; then
log "Lỗi: Không kết nối được $SERVER"
elif [ "$DISK" -gt 80 ]; then
log "Cảnh báo: Disk $SERVER vượt $DISK%"
else
log "Disk $SERVER ổn: $DISK%"
fi
}
# Chạy song song với background jobs
for SERVER in "${SERVERS[@]}"
do
check_server "$SERVER" &
# Giới hạn số job
while [ $(jobs -r | wc -l) -ge "$MAX_JOBS" ]
do
sleep 0.1
done
done
# Đợi tất cả hoàn thành
wait
echo "Kiểm tra song song hoàn tất, xem log tại $LOG_FILE"
Chuẩn Bị và Chạy
-
Setup SSH (bài 13):
ssh-copy-id user@server1 ssh-copy-id user@server2 ssh-copy-id user@server3
-
Chạy script:
chmod +x parallel_check.sh ./parallel_check.sh
- Kết quả mẫu:
Kiểm tra song song hoàn tất, xem log tại /var/log/parallel_check.log
- Log:
[2025-03-13 10:00:00] Disk user@server1 ổn: 42% [2025-03-13 10:00:00] Disk user@server2 vượt 85% [2025-03-13 10:00:00] Disk user@server3 ổn: 33%
- Kết quả mẫu:
Giải thích:
&
: Chạycheck_server
nền.jobs -r
: Đếm job đang chạy.wait
: Đợi tất cả xong.
DevOps: Script này kiểm tra multi-server nhanh hơn tuần tự, có thể dùng trong cron hoặc pipeline.
Dùng Xargs Thay Thế
printf "%s\n" "${SERVERS[@]}" | xargs -n 1 -P "$MAX_JOBS" bash -c 'check_server() { ... }; check_server "$1"' _ {}
-P 3
: 3 job song song.
Debug Parallel
- Thêm debug:
log "Debug: Bắt đầu $SERVER" bash -x parallel_check.sh
- Kiểm tra job:
jobs -l
Thực tế: Tôi từng để quá nhiều job, server quá tải – giới hạn MAX_JOBS
cứu tôi khỏi crash.
Ứng Dụng trong DevOps
Tối Ưu Multi-Server
- Cập nhật song song:
printf "%s\n" "${SERVERS[@]}" | xargs -n 1 -P 3 ssh {} "sudo apt update"
Pipeline CI/CD
- Build container song song:
build: script: - echo "app1 app2 app3" | xargs -n 1 -P 3 bash -c 'docker build -t $1:$CI_COMMIT_SHA ./$1' _
Case study: Một team dùng parallel để test 20 microservice, giảm thời gian từ 15 phút xuống 2 phút.
Best Practice
- Giới hạn job để tránh quá tải.
- Đảm bảo log thread-safe.
- Test tuần tự trước khi parallel.
Kết Luận
Parallel Execution trong Bash DevOps với chạy song song Bash là cách tối ưu Bash để xử lý task lớn nhanh hơn. Thực hành với parallel_check.sh
cho thấy bạn có thể áp dụng multi-thread Bash hiệu quả – kỹ năng nâng cao trong DevOps. Bài tiếp theo, chúng ta sẽ khám phá Bash và API – cách gọi API như pro.