MinIO object versioning raw HTML: lưu và lấy lại đúng bản cũ
MinIO object versioning raw HTML là cách giữ nhiều bản HTML thô của cùng một trang dưới một object key, mỗi bản có version ID riêng, để parse lại đúng bản của ngày cần xem. Bản mới không ghi đè bản cũ. ProxyVN chạy boto3 thật trên một bộ mô phỏng S3, ghi hai bản HTML và lưu manifest gồm key, version ID, mã băm. Sau đó lab lấy lại bản cũ, đối soát từng byte và ghi rõ chỗ bộ mô phỏng sai so với tài liệu.
MinIO object versioning raw HTML: mục tiêu và phạm vi không lặp
Phần này chốt bài toán, đầu ra và giới hạn của lab.
Bài toán cần giải
Parser lấy giá từ trang sản phẩm. Một tuần sau, phát hiện parser bắt nhầm giá gạch ngang thay vì giá bán. Muốn sửa dữ liệu cũ, phải parse lại HTML của từng ngày. Nếu kho chỉ giữ bản mới nhất của mỗi trang, dữ liệu cũ mất. Versioning giữ mọi bản dưới cùng key.
Đầu ra nghiệm thu
Đầu ra là một manifest nối object key với version ID, mã băm SHA-256, kích thước, lượt crawl và thời điểm tải. Kèm theo là phép thử lấy lại bản HTML cũ theo version ID và so mã băm từng byte với manifest. Thêm các ca delete marker, version sai và suspend versioning.
Raw HTML khác snapshot bảng
Bài về Iceberg snapshot trong cụm này nói về phiên bản của bảng đã parse. Bài này nói về tệp HTML thô trước khi parse. Hai lớp bổ sung cho nhau: HTML thô cho phép parse lại, snapshot bảng cho phép đọc lại kết quả parse. Bài không bàn chuyện lưu dữ liệu dạng bảng.
Xác minh edition trước
Tài liệu nguồn là Object Versioning của MinIO AIStor, bản thương mại. Bài không mặc định mọi bản MinIO, kể cả bản cộng đồng cũ, có đủ các tính năng trong tài liệu này. Trước khi thiết kế, anh em kiểm bản đang chạy và bật thử versioning trên bucket lab.
Giới hạn của lab
Nói rõ ngay. Lab không chạy MinIO. Máy lab không được tải và chạy tệp nhị phân bên ngoài. ProxyVN dùng moto 5.2.5, thư viện mô phỏng API S3, chạy ở chế độ máy chủ trên cổng cục bộ. Client boto3 1.43 là thật, gọi đúng các API S3 mà MinIO cũng hỗ trợ.
Thứ gì tin được, thứ gì không
Các thao tác cơ bản trong lab khớp với tài liệu MinIO: version ID mới cho mỗi lần ghi, bản null khi chưa bật versioning, delete marker. Có một ca bộ mô phỏng làm sai so với tài liệu, bài nêu rõ ở mục suspend. Kết luận về MinIO lấy từ tài liệu, kết quả lab chỉ minh họa luồng client.
Ai nên đọc bài này
Người lưu HTML thô của crawler vào MinIO hoặc kho tương thích S3. Người cần parse lại dữ liệu cũ khi sửa parser. Người sắp bật versioning mà chưa tính tới dung lượng, delete marker và việc lấy lại bản cũ.
MinIO object versioning raw HTML: lưu nhiều bản HTML và phục hồi đúng phiên
Phần này tóm tắt tài liệu chính thức về versioning.
Ghi đè thành bản mới
Tài liệu nêu khi bật versioning, thao tác vốn ghi đè đối tượng sẽ tạo phiên bản mới. Versioning bảo vệ khỏi ghi đè và xóa ngoài ý muốn, cho phép hoàn tác một lần ghi. Mỗi phiên bản có version ID duy nhất.
Bản mới nhất là mặc định
Tài liệu nêu MinIO đánh dấu phiên bản latest, là bản client nhận khi không chỉ định version. Muốn lấy, liệt kê hay xóa bản cụ thể, client phải gửi kèm version ID. Với crawler, nghĩa là mã đọc cũ không cần sửa, vẫn nhận bản mới nhất.
Version ID là UUID
Tài liệu nêu mỗi version ID là UUID phiên bản 4 dài 128 bit, do tiến trình máy chủ sinh. MinIO không hỗ trợ client tự cấp version ID. Vậy crawler không thể đặt version ID theo ngày, phải đọc ID từ phản hồi và lưu lại.
Bản null
Tài liệu nêu đối tượng tạo khi versioning đang tắt hoặc tạm dừng có version ID là null. Có thể đọc hoặc xóa chúng bằng cách chỉ định null làm version ID. Bucket đã có dữ liệu trước khi bật versioning sẽ có bản null cho mỗi key cũ.
Delete marker
Tài liệu nêu DELETE không kèm version ID trên đối tượng có versioning tạo delete marker dài 0 byte làm bản mới nhất. Các bản trước vẫn còn. Marker che đối tượng khỏi các thao tác không chỉ định version, nhưng không xóa gì.
Xóa vĩnh viễn
Tài liệu nêu muốn xóa vĩnh viễn một bản, gửi DELETE kèm version ID. Thao tác xóa có version là không thể hoàn tác. Crawler không nên có quyền làm việc này. Quyền xóa theo version chỉ nên thuộc về quy tắc vòng đời hoặc người quản trị.
Không lưu khác biệt
Tài liệu nêu MinIO không làm versioning kiểu tăng dần hay lưu phần khác biệt. Ví dụ trong tài liệu: một tệp log 1GB được ghi thêm 100MB mỗi ngày trong mười ngày, bucket sẽ chứa hơn 14GB cho một đối tượng. Với HTML, mỗi lượt crawl là một bản đầy đủ.
Quy tắc vòng đời
Tài liệu nêu có thể đặt quy tắc vòng đời để tự hết hạn bản cũ, ví dụ xóa bản 90 ngày sau khi không còn là latest. Đây là cách giữ dung lượng trong tầm kiểm soát khi crawl hằng ngày.
Khái niệm |
Ý nghĩa với HTML thô |
|---|---|
Version ID |
Mã của một lượt tải, phải lưu vào manifest |
Latest |
Bản mà mã đọc cũ nhận được |
Bản null |
HTML ghi trước khi bật versioning |
Delete marker |
Trang bị đánh dấu xóa, bản cũ vẫn còn |
Noncurrent |
Bản đã bị bản mới thay, ứng viên để hết hạn |
MinIO object versioning raw HTML: xác minh edition và bật bucket versioning
Phần này dựng môi trường lab, kiểm trạng thái và bật versioning.
Khởi động bộ mô phỏng
Lab chạy moto ở chế độ máy chủ trên cổng 9482, rồi tạo client boto3 trỏ tới đó. Khóa truy cập là chuỗi giả.
from moto.server import ThreadedMotoServer
import boto3
srv = ThreadedMotoServer(ip_address="127.0.0.1", port=9482); srv.start()
s3 = boto3.client("s3", endpoint_url="http://127.0.0.1:9482",
aws_access_key_id="lab", aws_secret_access_key="lab-secret",
region_name="us-east-1")
Với MinIO thật, chỉ cần đổi endpoint_url và khóa. Phần còn lại của mã giữ nguyên.
Kiểm bản đang chạy
Trên MinIO thật, việc đầu tiên là biết đang chạy bản nào, vì tài liệu nguồn viết cho AIStor. Công cụ quản trị của MinIO có lệnh xem thông tin máy chủ. Lab không chạy được lệnh này. Ghi phiên bản máy chủ vào tài liệu dự án, cùng ngày kiểm.
Trạng thái versioning lúc đầu
Bucket mới tạo chưa có cấu hình versioning. Lab gọi get_bucket_versioning, phản hồi không có trường Status.
versioning luc dau: {}
Không có Status nghĩa là chưa từng bật, khác với Suspended là đã bật rồi tạm dừng.
Ghi trước khi bật
Lab ghi một bản HTML trước khi bật versioning. Phản hồi không có VersionId. Bản này sẽ trở thành bản null khi versioning được bật sau đó.
PUT khi chua bat versioning -> VersionId: None
Với bucket đã có dữ liệu crawl, mọi trang cũ sẽ ở trạng thái này. Manifest cần ghi version null cho chúng.
Bật versioning
Lab gọi put_bucket_versioning với Status Enabled, đọc lại được Enabled.
s3.put_bucket_versioning(Bucket="raw-html",
VersioningConfiguration={"Status": "Enabled"})
Trên MinIO, có thể bật bằng công cụ dòng lệnh hoặc giao diện quản trị. Bật bằng API như lab có lợi là ghi được vào mã hạ tầng.
Bật trước khi crawl
Versioning chỉ có tác dụng với lần ghi sau khi bật. Bật muộn một tuần là mất một tuần bản cũ. Với bucket mới cho HTML thô, bật versioning ngay lúc tạo bucket, trước lượt crawl đầu tiên.
Kiểm bucket có thật sự bật
Đừng chỉ tin lệnh bật đã chạy. Mã khởi động của crawler nên đọc trạng thái versioning và dừng nếu không phải Enabled. Một bucket tạo lại bằng tay ở môi trường khác có thể thiếu bước này, và lỗi chỉ lộ ra khi cần bản cũ.
Loại trừ thư mục tạm
Mục lục tài liệu MinIO có các phần loại trừ tiền tố khỏi versioning và bỏ qua đối tượng thư mục. Nếu crawler ghi tệp tạm vào cùng bucket, loại trừ tiền tố tạm giúp không lưu hàng nghìn bản vô ích. Lab không thử tính năng này vì nó là phần mở rộng riêng của MinIO.
MinIO object versioning raw HTML: ghi hai phiên bản HTML vào cùng object key
Phần này ghi hai lượt crawl của cùng một trang và dựng manifest.
Đặt key cho trang
Key dùng tên miền và đường dẫn: shop-a.test/p/1.html. Không đưa ngày vào key, vì versioning đã lo phần lịch sử. Đưa ngày vào key sẽ biến mỗi lượt thành một đối tượng riêng, và versioning trở nên vô nghĩa.
Ghi kèm metadata
Mỗi lần ghi, lab gửi kèm metadata người dùng: lượt crawl, thời điểm tải và mã băm SHA-256 của nội dung.
r = s3.put_object(Bucket=B, Key=KEY, Body=body,
ContentType="text/html; charset=utf-8",
Metadata={"crawl-run": run, "fetched-at": fetched, "sha256": sha(body)})
vid = r["VersionId"]
Metadata đi cùng từng bản, nên đọc bản cũ sẽ nhận đúng metadata của lần ghi đó.
Lượt một và lượt hai
Lượt một ghi bản có giá 450.000 đồng. Lượt hai ghi bản có giá 399.000 đồng và dòng giảm giá. Hai lần ghi trả về hai version ID khác nhau.
run-01 version_id 59c17c5b-5d75-4acf-9781-7d6f14ac59bc size 63
run-02 version_id 5d063e06-ad12-4b39-b2a7-6d97128bc5e1 size 78
Manifest

Manifest
Manifest là tài sản chính của bài. Mỗi dòng ứng với một lần ghi thành công.
Key |
Version ID |
SHA-256 |
Size |
Lượt |
Thời điểm tải |
|---|---|---|---|---|---|
shop-a.test/p/1.html |
59c17c5b-5d75… |
97ce4883… |
63 |
run-01 |
2026-11-05 08:00 |
shop-a.test/p/1.html |
5d063e06-ad12… |
0f56fa87… |
78 |
run-02 |
2026-11-06 08:00 |
Lab ghi manifest ra tệp JSON đầy đủ, gồm cả ETag và LastModified.
Vì sao cần cả SHA-256
ETag thường là MD5 với tệp tải một lần, nhưng tải nhiều phần thì ETag không còn là mã băm của nội dung. Ghi SHA-256 do chính crawler tính là bằng chứng độc lập với kho. Khi lấy lại, so mã này là biết từng byte có khớp không.
Thời điểm tải khác LastModified
LastModified là lúc kho nhận đối tượng. Thời điểm tải là lúc crawler lấy trang. Hai mốc có thể cách nhau nhiều phút nếu crawler gom rồi mới tải lên. Báo cáo theo ngày crawl phải dùng thời điểm tải trong manifest.
Liệt kê các bản
Hàm list_object_versions trả mọi bản của key, đánh dấu bản latest. Lab thấy ba bản: bản lượt hai là latest, bản lượt một, và bản null ghi trước khi bật.
list versions: [('5d063e06-...', True, 78), ('59c17c5b-...', False, 63), ('null', False, 63)]
Crawl lại trang không đổi
Lượt ba tải lại đúng nội dung của lượt hai. Kho vẫn tạo version mới, dù ETag giống hệt. Mỗi lượt crawl không đổi gì vẫn tốn thêm một bản đầy đủ. Muốn tiết kiệm, crawler so mã băm với bản latest trong manifest trước khi ghi, trùng thì chỉ ghi nhận là không đổi.
MinIO object versioning raw HTML: lưu version ID và tải lại phiên bản cũ
Phần này lấy lại bản cũ và đi qua các ca lỗi.
Lấy bản mới nhất
GET không kèm version trả bản latest. Lab so mã băm với dòng run-02 trong manifest, khớp.
Lấy bản cũ theo version ID

Lấy lại bản cũ
GET kèm VersionId của lượt một trả đúng bản 63 byte, mã băm khớp manifest, metadata đúng lượt một.
old = s3.get_object(Bucket=B, Key=KEY, VersionId=v1)
sha(old["Body"].read()) == manifest[0]["sha256"] # True
old["Metadata"] # {'crawl-run': 'run-01', 'fetched-at': '2026-11-05T08:00:00+07:00', ...}
Đây là phép thử nghiệm thu chính: version ID trong manifest đủ để lấy lại đúng bản cũ.
Lấy bản null
GET với VersionId bằng chuỗi null trả bản ghi trước khi bật versioning. Đúng như tài liệu MinIO mô tả. Mã đọc lại cần xử lý chuỗi null như một version ID hợp lệ, đừng coi nó là thiếu giá trị.
Version ID sai
GET với một UUID không tồn tại nhận lỗi NoSuchVersion, mã 404. Lỗi này khác NoSuchKey. Phân biệt hai mã giúp biết vấn đề nằm ở manifest hay ở key.
Delete marker che đối tượng
Lab gửi DELETE không kèm version. Phản hồi có DeleteMarker True và một version ID cho marker. GET thông thường sau đó nhận NoSuchKey 404, như thể trang đã mất.
DELETE khong version -> DeleteMarker: True
GET sau delete marker: NoSuchKey 404
GET v1 sau delete marker: True
Nhưng GET kèm version ID của lượt một vẫn trả đúng bản cũ. Không có gì bị xóa thật.
Khôi phục sau delete marker
Muốn trang hiện lại, xóa chính delete marker bằng DELETE kèm version ID của marker. Lab làm vậy, GET thông thường lại trả bản lượt hai. Đây là cách hoàn tác một lần xóa nhầm do job dọn dẹp chạy sai.
Ai được xóa
Crawler cần quyền ghi, không cần quyền xóa. Job dọn dẹp cần quyền xóa không kèm version để tạo marker, không cần quyền xóa theo version. Quyền xóa vĩnh viễn chỉ nên nằm ở quy tắc vòng đời. Phân quyền như vậy giảm rủi ro một dòng mã sai xóa mất lịch sử.
Đọc lại theo manifest
Mã parse lại không liệt kê version rồi đoán. Nó đọc manifest, lọc theo ngày cần, lấy key và version ID, gọi GET. Liệt kê version chỉ dùng để kiểm tra chéo. Cách này giữ đúng quan hệ giữa lượt crawl và bản HTML.
MinIO object versioning raw HTML: đối soát raw bytes, timestamp và giới hạn retention
Phần này kiểm toàn bộ manifest, ca suspend và chính sách giữ bản.
Đối soát toàn manifest

Đối soát toàn manifest
Lab chạy một vòng: với mỗi dòng manifest, GET theo version ID, tính SHA-256, so với manifest. Vòng này chạy hai lần: một lần sau delete marker và một lần cuối lab.
Suspend versioning theo tài liệu
Tài liệu MinIO nêu đối tượng tạo khi versioning tạm dừng có version ID null. Theo mô hình S3, các bản đã có version ID thật vẫn giữ nguyên, lần ghi mới chỉ thay bản null. Tạm dừng versioning vì thế không nên làm mất lịch sử đã có.
Bộ mô phỏng làm sai
Lab tạm dừng versioning, đếm được bốn bản. Ghi một lần, đếm lại chỉ còn một bản null. Moto 5.2.5 đã xóa hết bản cũ.
ngay sau suspend, so version: 4
sau PUT suspend 1, so version: 1
doi soat manifest: 3 dong, lech: [('run-01', 'NoSuchVersion'), ('run-02', 'NoSuchVersion'), ('run-03', 'NoSuchVersion')]
Đây là lỗi của bộ mô phỏng, không phải hành vi của MinIO theo tài liệu. ProxyVN giữ nguyên kết quả để anh em thấy giới hạn của lab.
Vì sao vẫn giữ ca này
Ca này cho thấy hai điều. Một, kết quả từ bộ mô phỏng không thay được thử nghiệm trên MinIO thật, nhất là với thao tác ít dùng. Hai, vòng đối soát manifest đã bắt được việc mất bản ngay lập tức. Nếu chuyện này xảy ra trên kho thật vì cấu hình sai, đối soát cũng sẽ bắt được.
Tránh suspend trên bucket HTML thô
Với bucket chỉ chứa HTML thô, không có lý do tạm dừng versioning. Muốn tiết kiệm dung lượng, dùng quy tắc vòng đời. Tạm dừng làm mọi lần ghi sau đó dùng bản null, và lịch sử từ lúc đó mất.
Quy tắc vòng đời cho HTML cũ

Hết hạn sau 90 ngày
Lab đặt quy tắc hết hạn bản noncurrent sau 90 ngày. Moto chỉ lưu cấu hình, không chạy quy tắc, nên lab không chứng minh được việc xóa.
NoncurrentVersionExpiration: {'NoncurrentDays': 90}
Con số 90 ngày lấy từ ví dụ trong tài liệu. Anh em chọn theo nhu cầu parse lại thực tế.
Manifest phải biết bản đã hết hạn
Khi quy tắc vòng đời xóa bản cũ, manifest vẫn còn dòng của bản đó. Đối soát định kỳ sẽ báo NoSuchVersion. Phân biệt bản hết hạn có chủ đích với bản mất ngoài ý muốn bằng cách tính ngày: bản đã quá 90 ngày kể từ khi bị thay thì đánh dấu hết hạn trong manifest.
Dung lượng cần tính trước
Mỗi trang sản phẩm vài trăm KB, mười nghìn trang, crawl mỗi ngày, giữ 90 ngày, là vài trăm GB chỉ cho một website. Bỏ qua bản trùng nội dung, như ca lượt ba, có thể giảm đáng kể. Tính con số này trước khi bật versioning trên kho dùng chung.
Nén trước khi ghi
MinIO không lưu phần khác biệt, nhưng HTML nén rất tốt. Nén gzip trước khi ghi và đặt Content-Encoding phù hợp giảm dung lượng mỗi bản. Mã băm trong manifest nên tính trên nội dung gốc chưa nén, để không phụ thuộc mức nén.
MinIO object versioning raw HTML: parse lại dữ liệu cũ từ bản đã lưu
Phần này nối kho HTML có versioning với việc sửa parser, lý do chính để bật versioning.
Kịch bản sửa parser
Parser cũ lấy giá ở thẻ đầu tiên có class price. Website có thêm giá gạch ngang ở thẻ cùng class, đặt trước giá bán. Từ ngày đó, dữ liệu giá sai. Sửa parser xong, việc tiếp theo là parse lại mọi bản HTML từ ngày website đổi tới hôm nay.
Chọn bản cần parse lại
Manifest có thời điểm tải của từng bản. Lọc các dòng có thời điểm tải từ ngày website đổi giao diện, nhóm theo key, lấy version ID. Danh sách này là đầu vào duy nhất của job parse lại. Không cần quét bucket, không cần đoán.
Ghi kết quả parse lại
Kết quả parse lại nên ghi kèm version ID của bản HTML nguồn và phiên bản parser. Khi có ai hỏi một con số giá đến từ đâu, câu trả lời là key, version ID và phiên bản parser. Ba thông tin này đủ để tái lập kết quả ở bất kỳ lúc nào, miễn là bản HTML chưa hết hạn.
Parse lại không cần mạng
Job parse lại chỉ đọc từ kho nội bộ, không gọi website. Nó chạy được bất cứ lúc nào, không tốn lượt tải, không bị giới hạn tốc độ của website. Đây là lợi ích lớn nhất của việc giữ HTML thô: tách bước tải khỏi bước xử lý.
Kiểm tra mã băm trước khi parse
Trước khi parse một bản, tính SHA-256 của nội dung vừa đọc, so với manifest. Lệch thì dừng và báo, đừng parse. Một bản lệch có thể do lỗi đọc, do kho có vấn đề, hoặc do manifest ghi sai. Parse trên dữ liệu không xác định chỉ sinh thêm dữ liệu sai.
Song song nhưng có giới hạn
Parse lại hàng nghìn bản có thể chạy song song. Mỗi worker nhận một nhóm dòng manifest, đọc, kiểm, parse. Giới hạn số worker theo khả năng của kho, vì kho đối tượng dùng chung còn phục vụ crawler đang chạy. Lab không đo hiệu năng, phần này là khuyến nghị vận hành.
Khi bản cần đã hết hạn
Nếu quy tắc vòng đời đã xóa bản cần, đối soát báo NoSuchVersion. Lúc đó chỉ còn cách crawl lại, và dữ liệu lấy được là của hôm nay, không phải của ngày cũ. Ghi rõ điều này vào kết quả để người dùng biết đoạn dữ liệu nào không tái lập được.
Giữ lâu hơn cho trang quan trọng
Không phải trang nào cũng cần giữ 90 ngày. Trang sản phẩm chủ lực có thể cần giữ lâu hơn để so sánh giá theo mùa. Quy tắc vòng đời theo tiền tố giúp tách nhóm này, ví dụ một tiền tố riêng cho danh mục quan trọng với thời hạn dài hơn.
MinIO object versioning raw HTML: đầu ra nghiệm thu và phần chưa chạy
Phần này gom tiêu chí đạt, tệp đầu ra và những gì còn phải kiểm.
Danh sách kiểm tra
Quy trình đạt khi mọi dòng dưới đây đúng.
- Đã xác minh bản MinIO đang chạy và bật thử versioning trên bucket lab.
- Versioning bật ngay khi tạo bucket, mã khởi động kiểm trạng thái Enabled.
- Key không chứa ngày, lịch sử do versioning giữ.
- Mỗi lần ghi lưu version ID, SHA-256, kích thước, lượt và thời điểm tải vào manifest.
- Bản null của dữ liệu cũ được ghi vào manifest.
- Parse lại đọc theo manifest, không đoán từ danh sách version.
- Crawler không có quyền xóa theo version.
- Có quy tắc vòng đời và đối soát định kỳ manifest.
Tệp đầu ra của lab
Lab tạo tệp manifest.json với ba dòng, script run.py chạy toàn bộ kịch bản, và log từng bước. Chạy lại sẽ sinh version ID mới, vì ID do kho cấp.
Những gì lab chưa chạy
Chưa chạy MinIO hay AIStor. Chưa thử loại trừ tiền tố, bỏ qua thư mục, khóa đối tượng, quy tắc vòng đời thực thi, nhân bản. Ca suspend trong lab sai so với tài liệu vì lỗi của moto 5.2.5.
Kiểm lại trên MinIO thật
Đổi endpoint và khóa, chạy lại run.py trên bucket lab. Ca quan trọng nhất là suspend rồi ghi, vì bộ mô phỏng sai ở đó. Nếu kết quả trên MinIO giữ nguyên các bản cũ như tài liệu, bỏ cảnh báo trong bài.
Proxy ở đâu trong luồng này
Proxy thuộc bước tải trang từ website, trước khi có HTML để ghi vào kho. MinIO nằm trong hạ tầng của anh em, không cần proxy. Với website được phép thu thập, đôi khi cần IP Việt Nam để nhận đúng trang hiển thị trong nước. Khi đó anh em có thể mua proxy tại trang chủ ProxyVN. Vai trò proxy có ở bài Web Scraping proxy là gì, cách ghi cấu hình ở bài định dạng proxy.
Ghi đường tải vào manifest
Nếu cùng một trang được tải qua nhiều đường khác nhau, nội dung có thể khác theo IP. Ghi thêm vào manifest đường tải đã dùng, như khu vực của proxy, giúp giải thích khi hai bản liền nhau khác nhau mà website không đổi gì.
MinIO object versioning raw HTML: câu hỏi thường gặp
Các câu dưới đây gom những điểm anh em hay hỏi.
Có cần đưa ngày vào key không?
Không. Versioning giữ lịch sử dưới cùng key. Ngày nằm trong manifest và metadata của từng bản.
Version ID có tự đặt được không?
Không. Tài liệu MinIO nêu version ID do máy chủ sinh, là UUID. Crawler phải đọc ID từ phản hồi và lưu lại.
Xóa nhầm thì sao?
DELETE không kèm version chỉ tạo delete marker. Xóa marker là trang hiện lại. Lab đã thử và lấy lại được bản mới nhất.
Crawl lại trang không đổi có tốn dung lượng không?
Có. Lab thấy kho vẫn tạo bản mới dù nội dung giống hệt. So mã băm trước khi ghi để bỏ qua bản trùng.
Tạm dừng versioning có mất bản cũ không?
Theo tài liệu thì không, chỉ lần ghi mới dùng bản null. Bộ mô phỏng trong lab lại xóa hết bản cũ, đó là lỗi của bộ mô phỏng. Hãy thử trên MinIO thật.
ETag giống nhau có nghĩa là nội dung giống không?
Với tệp tải một lần, thường là vậy, lab thấy ETag của lượt ba trùng lượt hai. Với tệp tải nhiều phần, ETag không phải mã băm của nội dung. Dùng SHA-256 do crawler tính để so cho chắc.
Manifest nên lưu ở đâu?
Lưu trong cơ sở dữ liệu của crawler, không chỉ trong metadata của đối tượng. Metadata đi theo từng bản, nhưng muốn tìm bản theo ngày thì phải liệt kê. Manifest riêng cho phép truy vấn nhanh theo key, ngày và lượt.
Có thể dùng versioning thay cho sao lưu không?
Không nên. Versioning giữ bản cũ trong cùng bucket, cùng hệ thống. Lỗi ở mức hệ thống hay xóa bucket vẫn làm mất hết. Sao lưu sang nơi khác là việc riêng.
Versioning có làm GET chậm hơn không?
Lab quá nhỏ để đo, và bộ mô phỏng không phản ánh hiệu năng MinIO. Về cơ chế, GET không kèm version vẫn trả bản latest như bucket thường. Theo dõi số bản trên mỗi key nếu crawl rất dày.
Bài có chạy MinIO không?
Không. Client boto3 là thật, máy chủ là moto mô phỏng API S3. Quy tắc về MinIO lấy từ tài liệu AIStor. Mọi kết luận về hành vi máy chủ cần chạy lại trên bản MinIO đang dùng trước khi áp dụng.
MinIO object versioning raw HTML và những điều cần nhớ
MinIO object versioning raw HTML chỉ có ích khi version ID của từng lượt được lưu vào manifest cùng mã băm, để lấy lại đúng bản cũ và kiểm từng byte. Hãy bật versioning từ đầu, đọc theo manifest, tránh suspend và đối soát định kỳ. Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam khuyên anh em chạy lại MinIO object versioning raw HTML trên bản MinIO đang dùng.