Lý Thuyết Cốt Lõi
1. Blob Types & Blob Containers
Azure Blob Storage là dịch vụ lưu trữ đối tượng phi cấu trúc cho text, binary, hình ảnh, video, backup, log. Mỗi blob nằm trong một container, container nằm trong storage account.
- • Lưu trữ text và binary data
- • Tối đa ~190.7 TiB/blob
- • Tối ưu upload file lớn (parallel block commit)
- • Dùng cho: ảnh, video, tài liệu, backup, log
- • Hỗ trợ tất cả access tiers
- • Tối ưu hoá cho thao tác append
- • Không thể sửa/xóa block đã commit
- • Dùng cho: logging, audit trail, streaming data
- • Tối đa ~195 GiB/blob
- • Không hỗ trợ access tier
- • Tối ưu cho random read/write (4 KB pages)
- • Tối đa 8 TiB/blob
- • Dùng cho: VHD/VHDX (VM disks), Azure SQL
- • Chỉ hỗ trợ LRS replication
- • Premium performance với SSD backing
2. Access Tiers — Phân Tầng Lưu Trữ
Azure Blob Storage cung cấp 4 access tiers để tối ưu chi phí dựa trên tần suất truy cập dữ liệu. Chi phí storage và chi phí truy cập bù trừ nhau theo chiều ngược nhau.
| Tier | Chi phí lưu trữ | Chi phí truy cập | Latency đọc | Use case |
|---|---|---|---|---|
| Hot | Cao nhất | Thấp nhất | Milliseconds | Dữ liệu truy cập thường xuyên (active content, website) |
| Cool | Thấp hơn Hot | Cao hơn Hot | Milliseconds | Ít truy cập (30+ ngày): backup, DR, infrequent reports |
| Cold | Thấp hơn Cool | Cao hơn Cool | Milliseconds | Rất ít truy cập (90+ ngày): compliance archives |
| Archive | Thấp nhất | Cao nhất | 1–15 giờ (rehydrate) | Lưu trữ dài hạn (180+ ngày): legal hold, raw data |
3. Lifecycle Management Rules
Lifecycle management tự động chuyển blob giữa các tier hoặc xóa blob dựa trên điều kiện tuổi (age) hoặc thời gian truy cập cuối (last accessed). Giúp tối ưu chi phí mà không cần can thiệp thủ công.
- • Policy gồm nhiều rules
- • Mỗi rule có filters (blob type, prefix, tag) và actions
- • Actions:
tierToCool,tierToCold,tierToArchive,delete - • Áp dụng cho: base blob, blob snapshot, blob version
- • Chạy hàng ngày, tối đa 1 lần/ngày/account
- •
daysAfterModificationGreaterThan: ngày kể từ lần sửa cuối - •
daysAfterLastAccessTimeGreaterThan: ngày kể từ lần đọc cuối (cần bật last access tracking) - •
daysAfterCreationGreaterThan: cho snapshot và version - • Kết hợp với blob prefix để áp dụng cho thư mục cụ thể
4. Object Replication, Upload Blob & Pricing
- • Sao chép async block blob giữa source và destination container (khác account, khác region)
- • Yêu cầu: versioning phải bật trên cả 2 accounts; change feed bật trên source
- • Không hỗ trợ Archive tier và Account Immutability
- • Dùng cho: DR, data locality, analytics pipeline, content distribution
- • Khác GRS: Object Replication cho phép chọn container cụ thể, cross-account
- • Azure Portal: kéo thả, giới hạn <5 GB/file
- • Azure CLI:
az storage blob upload,upload-batch - • AzCopy: công cụ CLI nhanh nhất, parallel upload, resume, sync; dùng cho large dataset
- • Azure Storage Explorer: GUI cross-platform
- • SDK (Python/Java/.NET): upload programmatic, chunk upload cho file lớn
- • Data stored ($/GB/tháng): Hot > Cool > Cold > Archive
- • Operations ($/10,000 ops): Hot thấp nhất, Archive cao nhất cho read
- • Data retrieval ($/GB): Hot = $0, Cool/Cold/Archive tăng dần
- • Early deletion: phí phạt nếu xóa blob trước minimum retention (Cool=30d, Cold=90d, Archive=180d)
- • Rehydration: phí đọc data từ Archive + rehydration fee riêng
- • Geo-replication: outbound data transfer từ primary đến secondary tính phí
Bài Tập Thực Hành (Lab)
Tạo Storage Account, Container và Upload Blob bằng Azure CLI
# Tạo Resource Group
az group create \
--name rg-az104-m17 \
--location southeastasia \
--tags Course=AZ-104 Module=17
# Tên storage account phải unique toàn cầu
STORAGE_NAME="staz104m17$(date +%s | tail -c 6)"
echo "Storage: $STORAGE_NAME"
# Tạo storage account GPv2 Standard LRS
az storage account create \
--name $STORAGE_NAME \
--resource-group rg-az104-m17 \
--location southeastasia \
--sku Standard_LRS \
--kind StorageV2 \
--access-tier Hot \
--https-only true \
--min-tls-version TLS1_2 \
--allow-blob-public-access false
# Lấy connection string
CONN_STR=$(az storage account show-connection-string \
--name $STORAGE_NAME \
--resource-group rg-az104-m17 \
--query connectionString -o tsv)
# Tạo container private (mặc định)
az storage container create \
--name documents \
--connection-string "$CONN_STR" \
--public-access off
# Tạo container với blob-level public access (đọc blob nhưng không list)
az storage container create \
--name public-images \
--connection-string "$CONN_STR" \
--public-access blob
# Tạo file test và upload lên container documents
echo "Hello AZ-104 Module 17 - Blob Storage" > /tmp/test-doc.txt
az storage blob upload \
--container-name documents \
--name "reports/test-doc.txt" \
--file /tmp/test-doc.txt \
--connection-string "$CONN_STR" \
--tier Hot
# Upload nhiều file từ thư mục (batch)
mkdir -p /tmp/batch-upload
for i in 1 2 3 4 5; do echo "File $i content" > /tmp/batch-upload/file-$i.txt; done
az storage blob upload-batch \
--destination documents \
--source /tmp/batch-upload \
--connection-string "$CONN_STR" \
--destination-path "batch/"
# Liệt kê blobs trong container
az storage blob list \
--container-name documents \
--connection-string "$CONN_STR" \
--query '[].{Name:name, Tier:properties.blobTier, Size:properties.contentLength}' \
-o table
Thay đổi Access Tier và Upload AzCopy
# Đổi tier của blob từ Hot sang Cool
az storage blob set-tier \
--container-name documents \
--name "reports/test-doc.txt" \
--tier Cool \
--connection-string "$CONN_STR"
# Tạo thêm blob và set thẳng lên Archive
echo "Archive content - long term retention" > /tmp/archive-doc.txt
az storage blob upload \
--container-name documents \
--name "archive/archive-doc.txt" \
--file /tmp/archive-doc.txt \
--connection-string "$CONN_STR" \
--tier Archive
# Xác nhận tiers
az storage blob list \
--container-name documents \
--connection-string "$CONN_STR" \
--query '[].{Name:name, Tier:properties.blobTier, Status:properties.archiveStatus}' \
-o table
# --- Demo AzCopy (cần cài sẵn hoặc dùng Cloud Shell có sẵn) ---
# Lấy SAS token để AzCopy xác thực
SAS_TOKEN=$(az storage account generate-sas \
--account-name $STORAGE_NAME \
--permissions rwdlacup \
--resource-types sco \
--services b \
--expiry $(date -u -d "2 hours" +%Y-%m-%dT%H:%MZ) \
--https-only \
--connection-string "$CONN_STR" \
-o tsv)
DEST_URL="https://${STORAGE_NAME}.blob.core.windows.net/documents?${SAS_TOKEN}"
# Upload thư mục với AzCopy (nhanh hơn CLI cho dữ liệu lớn)
azcopy copy "/tmp/batch-upload/*" "$DEST_URL" --recursive --put-md5
echo "AzCopy upload hoàn tất"
Tạo Lifecycle Management Policy tự động phân tầng và xóa blob
# Tạo lifecycle policy JSON
cat > /tmp/lifecycle-policy.json << 'EOF'
{
"rules": [
{
"name": "move-old-docs-to-cool",
"enabled": true,
"type": "Lifecycle",
"definition": {
"filters": {
"blobTypes": ["blockBlob"],
"prefixMatch": ["documents/reports/"]
},
"actions": {
"baseBlob": {
"tierToCool": { "daysAfterModificationGreaterThan": 30 },
"tierToCold": { "daysAfterModificationGreaterThan": 90 },
"tierToArchive": { "daysAfterModificationGreaterThan": 365 },
"delete": { "daysAfterModificationGreaterThan": 2555 }
},
"snapshot": {
"delete": { "daysAfterCreationGreaterThan": 90 }
}
}
}
},
{
"name": "delete-temp-logs",
"enabled": true,
"type": "Lifecycle",
"definition": {
"filters": {
"blobTypes": ["blockBlob", "appendBlob"],
"prefixMatch": ["documents/batch/"]
},
"actions": {
"baseBlob": {
"delete": { "daysAfterModificationGreaterThan": 30 }
}
}
}
}
]
}
EOF
# Áp dụng lifecycle policy vào storage account
az storage account management-policy create \
--account-name $STORAGE_NAME \
--resource-group rg-az104-m17 \
--policy @/tmp/lifecycle-policy.json
# Xem policy đang có hiệu lực
az storage account management-policy show \
--account-name $STORAGE_NAME \
--resource-group rg-az104-m17 \
--query 'policy.rules[].{Name:name, Enabled:enabled}' \
-o table
Cấu hình Object Replication giữa 2 Storage Accounts
# Tạo destination storage account (có thể khác region để test cross-region replication)
STORAGE_DEST="staz104m17dst$(date +%s | tail -c 4)"
az storage account create \
--name $STORAGE_DEST \
--resource-group rg-az104-m17 \
--location eastasia \
--sku Standard_LRS \
--kind StorageV2 \
--https-only true \
--min-tls-version TLS1_2 \
--allow-blob-public-access false
CONN_DEST=$(az storage account show-connection-string \
--name $STORAGE_DEST \
--resource-group rg-az104-m17 \
--query connectionString -o tsv)
# Bật versioning trên source (bắt buộc cho object replication)
az storage account blob-service-properties update \
--account-name $STORAGE_NAME \
--resource-group rg-az104-m17 \
--enable-versioning true \
--enable-change-feed true
# Bật versioning trên destination (bắt buộc)
az storage account blob-service-properties update \
--account-name $STORAGE_DEST \
--resource-group rg-az104-m17 \
--enable-versioning true
# Tạo container destination
az storage container create \
--name documents-replica \
--connection-string "$CONN_DEST" \
--public-access off
# Tạo Object Replication Policy: source documents → dest documents-replica
az storage account or-policy create \
--account-name $STORAGE_DEST \
--resource-group rg-az104-m17 \
--source-account $STORAGE_NAME \
--destination-account $STORAGE_DEST \
--source-container documents \
--destination-container documents-replica \
--min-creation-time "2026-01-01T00:00:00Z"
# Lấy Policy ID vừa tạo
POLICY_ID=$(az storage account or-policy list \
--account-name $STORAGE_DEST \
--resource-group rg-az104-m17 \
--query '[0].policyId' -o tsv)
echo "Replication Policy ID: $POLICY_ID"
# Áp policy lên source account
az storage account or-policy show \
--account-name $STORAGE_DEST \
--resource-group rg-az104-m17 \
--policy-id $POLICY_ID -o json | \
az storage account or-policy create \
--account-name $STORAGE_NAME \
--resource-group rg-az104-m17 \
--policy @-
Cleanup — Xóa tài nguyên tránh phát sinh chi phí
# Xóa toàn bộ Resource Group (bao gồm cả 2 storage accounts)
az group delete --name rg-az104-m17 --yes --no-wait
echo "Resource Group rg-az104-m17 đang được xóa nền. Bao gồm: $STORAGE_NAME, $STORAGE_DEST."
Kết Quả Đầu Ra
Hiểu Block Blob (object lớn), Append Blob (logging), Page Blob (VM disk) — chọn đúng loại theo use case
Tạo container Private/Blob/Container public access; upload blob đơn lẻ và batch; quản lý thông qua CLI và Portal
Thiết lập và thay đổi tier Hot/Cool/Cold/Archive; hiểu trade-off chi phí lưu trữ vs chi phí truy cập; rehydrate Archive
Viết policy JSON tự động tierToCool/Cold/Archive và delete theo điều kiện tuổi blob và prefix filter
Bật versioning + change feed; tạo replication policy; blob tự động sao chép đến account/region khác
Dùng CLI batch upload, AzCopy cho large dataset; hiểu mô hình pricing storage + operations + retrieval + early deletion
Ứng Dụng Thực Tế
Tình huống 1: VTV Digital — Lưu trữ nội dung video on-demand
VTV cần lưu trữ hàng chục nghìn giờ video, từ nội dung mới phát sóng đến archive nhiều thập kỷ. Chi phí lưu trữ là vấn đề cốt lõi.
Block Blob cho tất cả video. Container hot-content (Hot tier) cho video 30 ngày gần nhất; container vod-library (Cool tier) cho 1 năm; container archive (Archive tier) cho lưu trữ vĩnh viễn.
Lifecycle rule: video >30 ngày chưa xem → Cool; >365 ngày → Cold; >3 năm → Archive. AzCopy migrate từ NAS on-prem lên Blob ban đầu. Azure CDN trước Blob endpoint cho video player.
Chi phí lưu trữ giảm 75% nhờ tự động phân tầng. Không cần quản lý dung lượng (unlimited scale). CDN giảm latency toàn quốc. Migration AzCopy hoàn tất 50 TB trong 2 ngày.
Tình huống 2: Viettel Cloud — Backup dữ liệu khách hàng enterprise
Viettel cung cấp dịch vụ backup cho doanh nghiệp, cần lưu trữ an toàn với chi phí thấp và đảm bảo khôi phục nhanh khi cần.
Append Blob cho transaction log liên tục. Block Blob cho full backup. Storage account nguồn tại Southeast Asia (Viettel DC HCM), Object Replication sang East Asia (DR site).
Lifecycle: daily backup >7 ngày → Cool; >30 ngày → Cold; >90 ngày → Archive; >7 năm → Delete. Versioning bật để giữ lịch sử blob. Immutable policy WORM cho backup tuân thủ pháp lý.
Chi phí giảm 80% so với SAN. Object Replication đảm bảo DR tự động. WORM ngăn xóa backup trong retention period. RTO < 4 giờ (rehydrate Archive standard priority).
Tình huống 3: FPT Analytics — Data Lake cho AI/ML
FPT xây dựng data lake cho hàng trăm data scientist, cần truy cập raw data nhanh và lưu trữ petabyte dữ liệu lịch sử với chi phí tối ưu.
Azure Data Lake Storage Gen2 (Blob + hierarchical namespace). Premium Block Blobs cho working dataset (Hot); Standard GPv2 cho cold data. Object Replication từ production sang analytics account.
Container raw/ Hot (data mới nhập 30 ngày), curated/ Cool (processed data), archive/ Archive (raw data >1 năm). Lifecycle last-access-based: data không đọc >60 ngày → Cool tự động.
Data scientist truy cập raw data không cần ETL phức tạp. Last-access lifecycle tự điều chỉnh tier theo behavior thực tế. Chi phí dự báo giảm 65% so với on-prem Hadoop cluster. Scale đến petabyte.