Auto-tiering Ceph Object Storage - PART 2

Auto-tiering Ceph Object Storage - PART 2 — Mở đầu
Trong bài viết này, chúng ta bước vào phần thú vị: viết một Lua script đơn giản để bắt đầu tự động tiering (sắp xếp) các S3 object vào đúng pool, bằng cách thay đổi động thiết lập Storage Class ngay tại thời điểm object đang được upload (S3 PUT).
Nếu bạn chưa đọc PART 1, hãy xem qua bài đó, vì nó đặt nền tảng cho những gì chúng ta làm ở PART 2 này.
Why Auto-Tiering Matters — Vì sao auto-tiering lại quan trọng
Việc có nhiều tier (Storage Class) khác nhau thực sự quan trọng, không chỉ để tiết kiệm chi phí mà còn vì các yếu tố hiệu năng. Như đã thảo luận ở PART 1, nếu bạn upload hàng triệu object nhỏ cỡ 1K thì việc ghi những object đó vào một data pool erasure-coded nói chung là một ý tưởng tệ. Nó sẽ chậm, bạn sẽ lãng phí rất nhiều dung lượng do object padding, và người dùng của bạn sẽ không hài lòng. Nhưng điểm then chốt là các object phải được gán vào storage class phù hợp một cách tự động, vì người dùng thường sẽ không tự bỏ công phân loại chúng.

Nhìn lại sơ đồ từ PART 1, chúng ta sẽ dùng lại ví dụ này trong PART 2 khi viết Lua script.
Tuy nhiên, trước khi bắt tay vào Lua, xin gửi lời CẢM ƠN lớn tới Yuval Lifshitz và cả team vì đã triển khai tính năng mà chúng ta đang bàn tới hôm nay. Tính năng đó tất nhiên chính là khả năng inject các script Lua vào CephRGW (CephRGW = Ceph Rados Gateway = gateway giao thức S3), để ta có thể làm những việc thú vị như auto-tiering.
Tôi cũng muốn nhắc tới phần Lua scripting và bài nói của Anthony D'Atri và Curt Bruns mà bạn có thể xem trên YouTube tại đây — đó chính là nguồn cảm hứng cho loạt bài này. Trong video đó, bạn sẽ thấy cách họ phát triển một Lua script để auto-tier giữa NVMe storage dựa trên TLC và QLC; rất đáng xem.
A Basic Lua Example — Một ví dụ Lua cơ bản
Chúng ta sẽ bắt đầu với một ví dụ cơ bản, vay mượn từ Lua script của Curt & Anthony. Trong script này, ta sẽ gán object vào ba Storage Class khác nhau mà ta đã định nghĩa trong ví dụ ở PART 1. Ba Storage Class đó là STANDARD (cho các object lớn hơn 1MB), MEDIUM_OBJ (cho object từ 16K đến 1MB), và SMALL_OBJ cho mọi thứ nhỏ hơn 16K.
-- Lua script to auto-tier S3 object PUT requests
-- exit script quickly if it is not a PUT request
if Request == nil or Request.RGWOp ~= "put_obj"
then
return
end
-- apply StorageClass only if user hasn't already assigned a storage-class
if Request.HTTP.StorageClass == nil or Request.HTTP.StorageClass == '' then
if Request.ContentLength < 16384 then
Request.HTTP.StorageClass = "SMALL_OBJ"
elseif Request.ContentLength < 1048576 then
Request.HTTP.StorageClass = "MEDIUM_OBJ"
else
Request.HTTP.StorageClass = "STANDARD"
end
RGWDebugLog("applied '" .. Request.HTTP.StorageClass .. "' to object '" .. Request.Object.Name .. "'")
end
Installing Lua Scripts into CephRGW — Cài Lua script vào CephRGW
Tiếp theo, bạn lưu Lua script ở trên vào một file, chẳng hạn autotier.lua, rồi cài nó vào các CephRGW gateway như sau:
radosgw-admin script put --infile=./autotier.lua --context=preRequest
Không cần restart các instance CephRGW; script có hiệu lực ngay lập tức với tất cả các RGW instance trong zone. Tuy nhiên lưu ý rằng nếu bạn viết script phức tạp hơn và có thêm một Lua package mới, thì các instance CephRGW sẽ cần được restart một lần trên tất cả các node trong zone, như sau:
# sudo systemctl restart ceph-radosgw@radosgw.*

Như sơ đồ minh họa, thông tin object của mỗi request — bao gồm cả request S3 PUT — được gửi tới script autotier.lua của chúng ta. Trong đó, ta có thể cập nhật động giá trị Request.HTTP.StorageClass để đưa object vào các data pool tối ưu. Giờ chỉ cần upload vài object lên bất kỳ bucket nào, bạn sẽ thấy chúng được route tới các data pool khác nhau dựa trên giá trị StorageClass mà script autotier.lua gán động cho chúng.
Debugging — Gỡ lỗi
Để debug script và xem những gì đang diễn ra qua các message RGWDebugLog, ta cần bật debug mode trên CephRGW; việc này được thực hiện bằng cách sửa file ceph.conf, thêm ‘debug rgw 20’ vào section RGW, rồi restart CephRGW. Đây là section radosgw của tôi — bạn có thể bỏ qua toàn bộ phần còn lại, chỉ cần chú ý hai tùy chọn debug được thêm vào cuối.
[client.radosgw.smu-80]
admin_socket = /var/run/ceph/ceph-client.radosgw.smu-80.asok
host = smu-80
keyring = /etc/ceph/ceph.client.radosgw.keyring
log file = /var/log/radosgw/client.radosgw.smu-80.log
rgw dns name = smu-80.osnexus.net
rgw frontends = beast endpoint=10.0.8.80:7480
rgw print continue = false
rgw zone = us-east-1
debug rgw = 20
Giờ ta restart CephRGW để áp dụng các thiết lập debug vừa thêm vào ceph.conf. Có những cách để bật debug mode một cách động mà không cần sửa ceph.conf, ví dụ (ceph config set client.radosgw.smu-80 debug_rgw 20), nhưng nói chung nên cập nhật ceph.conf để thiết lập debug mode được lưu lại giữa các lần restart.
# sudo systemctl restart ceph-radosgw@radosgw.*
Cuối cùng, hãy xem log. Trên RHEL bạn sẽ tìm thấy log tại /var/log/ceph/FSID/, nhưng tôi đã cấu hình file log của mình nằm ở /var/log/radosgw/client.radosgw.smu-80.log, nên tôi dùng lệnh sau để xem các message debug của Lua:
# tail -f /var/log/radosgw/client.radosgw.smu-80.log | grep Lua
Giờ tôi có thể thấy toàn bộ message về cách các object được tag khi tôi upload object vào object store.
2024-02-14T06:08:11.257+0000 7f16a8dc1700 20 Lua INFO: applied 'MEDIUM_OBJ' to object 'security_features_2023.pdf'
2024-02-14T06:08:12.345+0000 7f171569a700 20 Lua INFO: applied 'MEDIUM_OBJ' to object 'security_features_2023.pdf'
2024-02-14T06:08:13.389+0000 7f16a55ba700 20 Lua INFO: applied 'MEDIUM_OBJ' to object 'security_features_2023.pdf'
2024-02-14T06:08:14.465+0000 7f1742ef5700 20 Lua INFO: applied 'MEDIUM_OBJ' to object 'security_features_2023.pdf'
2024-02-14T06:08:42.928+0000 7f16d7e1f700 20 Lua INFO: applied 'SMALL_OBJ' to object 'whitepaper.docx'
2024-02-14T06:08:44.012+0000 7f1680570700 20 Lua INFO: applied 'SMALL_OBJ' to object 'whitepaper.docx'
2024-02-14T06:08:45.056+0000 7f1674558700 20 Lua INFO: applied 'SMALL_OBJ' to object 'whitepaper.docx'
2024-02-14T06:08:46.092+0000 7f1664d39700 20 Lua INFO: applied 'SMALL_OBJ' to object 'whitepaper.docx'
Testing — Kiểm thử
Để thử nghiệm, bạn hãy upload một số object với nhiều kích thước khác nhau, và bạn sẽ thấy tag storage-class được áp dụng động cho chúng. Lưu ý rằng nếu bạn gán một tag như “PERFORMANCE” cho một PUT request mà bạn chưa cấu hình tag đó, thì dữ liệu của bạn sẽ chỉ được route vào pool gắn với storage-class “STANDARD” — thường là rgw.default.bucket.data nếu bạn dùng cấu hình mặc định.
Summary — Tổng kết
Hy vọng bạn thấy hứng thú với hướng dẫn về auto-tiering cho Ceph object storage bằng Lua này. Ở phần cuối, PART 3, chúng ta sẽ đi sâu vào việc thiết lập một Ceph object cluster với ba Storage Class từ đầu bằng QuantaStor 6. Sẽ có một video đi kèm trên YouTube, trong đó chúng ta cùng thiết lập mọi thứ, rồi đi tiếp vào CephRGW Lua scripting để sắp xếp object không chỉ theo kích thước mà còn theo string match với các phần mở rộng tên file cụ thể. Cuối cùng, xin cảm ơn Anthony D'Atri và Yuval Lifshitz vì đã giúp review và đọc soát các bài viết này.
Nguồn: https://ceph.io/en/news/blog/2024/auto-tiering-ceph-object-storage-part-2/
Nguồn tham khảo
- Auto-tiering Ceph Object Storage - PART 2 — https://ceph.io/en/news/blog/2024/auto-tiering-ceph-object-storage-part-2/
Ghi chú về nguồn
- URL fetch thành công.
- Trong bản gốc, các tiêu đề mục (Auto-tiering Ceph Object Storage - PART 2, Why Auto-Tiering Matters, A Basic Lua Example, Installing Lua Scripts into CephRGW, Debugging, Testing, Summary) được trình bày bằng chữ in đậm trong dòng văn bản, không phải thẻ heading. Bản dịch chuyển chúng thành heading cấp
##để tạo mục lục có anchor link theo yêu cầu; thứ tự và nội dung giữ nguyên. Lưu ý bản gốc lặp lại tiêu đề bài viết dưới dạng in đậm ngay sau H1 — mục này được giữ lại đúng vị trí đó. - Toàn bộ code block Lua, lệnh, đoạn ceph.conf và log được giữ nguyên 100%, kể cả comment tiếng Anh trong script (comment nằm trong code Lua có ý nghĩa tham chiếu tới đúng dòng code, nên giữ nguyên bản gốc).
- Bản gốc nhắc tới PART 1 nhưng không kèm hyperlink ("check that out over here" không có link trong nội dung lấy được), nên bản dịch cũng không thêm link.
- Các đường dẫn ảnh được giữ nguyên như trong bản gốc.