1. Tổng quan.
S3, hay Amazon Simple Storage Service, là một dịch vụ lưu trữ đối tượng được cung cấp bởi Amazon Web Services (AWS). S3 cho phép bạn lưu trữ và truy xuất dữ liệu trên web. Nó được thiết kế để cung cấp độ bền 99.999999999% (11 chữ số 9) và 99.99% thời gian hoạt động trong một năm.
Một “Bucket” trong S3 tương tự như một thư mục trên hệ thống file của bạn. Nó là một container cho dữ liệu, và bạn có thể lưu trữ bất kỳ loại dữ liệu nào trong một bucket S3. Mỗi bucket có một tên duy nhất trên toàn bộ AWS và nó có thể chứa một số lượng không giới hạn các đối tượng (file).
RADOS Gateway (radosgw) là một phần của Ceph, một hệ thống lưu trữ phân tán mã nguồn mở. Radosgw cung cấp một giao diện tương thích với S3, cho phép bạn tương tác với Ceph bằng cách sử dụng các công cụ và thư viện tương thích với S3.
Một “Bucket” trong S3 của radosgw hoạt động giống như một “Bucket” trong S3 của AWS. Nó là một container cho dữ liệu, và bạn có thể lưu trữ bất kỳ loại dữ liệu nào trong một bucket. Mỗi bucket có một tên duy nhất trong radosgw và nó có thể chứa một số lượng không giới hạn các đối tượng (file).
Bạn có thể tạo, xóa và liệt kê các bucket, cũng như tải lên, tải xuống, và quản lý các đối tượng trong các bucket. S3 cũng cung cấp các tính năng như quản lý phiên bản, mã hóa và quyền truy cập chi tiết để giúp bạn bảo mật dữ liệu của mình.
Bạn có thể tạo nhiều bucket trên một tài khoản S3 được tạo từ RADOS Gateway (radosgw) của Ceph.
Ceph là một hệ thống lưu trữ phân tán, và RADOS Gateway là một giao diện của Ceph tương thích với S3 và Swift. Điều này có nghĩa là bạn có thể sử dụng các công cụ và thư viện tương thích với S3 để tương tác với Ceph qua radosgw, bao gồm việc tạo, xóa, và quản lý các bucket và đối tượng.
Tuy nhiên, giới hạn về số lượng bucket mà một tài khoản có thể tạo có thể phụ thuộc vào cấu hình của Ceph và radosgw. Trong một số trường hợp, số lượng bucket có thể bị giới hạn bởi cấu hình hoặc tài nguyên của hệ thống.
2. Sơ đồ Lab.
|
+-------------------------+ | +-------------------------+
|[ceph-client.hoanghd.com]|192.168.13.234 | 192.168.13.235| [radosgw.hoanghd.com] |
| Ceph Client +-------------------+-------------------| RADOSGW |
| | | | |
+-------------------------+ | +-------------------------+
|
+----------------------------------+-----------------------------------+
|public: 192.168.13.231 |public: 192.168.13.232 |public: 192.168.13.233
|cluster: 172.16.13.231 |cluster: 172.16.13.232 |cluster: 172.16.13.233
+--------------+--------------+ +--------------+--------------+ +--------------+--------------+
| [ceph-node1.hoanghd.com] | | [ceph-node2.hoanghd.com] | | [ceph-node3.hoanghd.com] |
| Object Storage +----| Object Storage +-----| Object Storage |
| Monitor Daemon | | | | |
| Manager Daemon | | | | |
+-----------------------------+ +-----------------------------+ +-----------------------------+
3. Tìm hiểu công cụ s3cmd
và s3fs.
Để kết nối với RADOS Gateway (radosgw) từ một máy khách Ubuntu, bạn có thể sử dụng s3cmd hoặc s3fs, đây là hai công cụ phổ biến cho phép làm việc với dịch vụ tương thích với S3.
s3cmd
là một công cụ dòng lệnh được thiết kế để tương tác với Amazon S3 và các dịch vụ tương tự. Nó cung cấp các chức năng như:
- Tạo và xóa bucket
- Tải lên và tải xuống file
- Liệt kê các bucket và file
- Đồng bộ hóa dữ liệu giữa máy cục bộ và S3
- Và nhiều hơn nữa
Tuy nhiên, s3cmd
không hỗ trợ việc mount một bucket như một hệ thống file trên máy của bạn.
s3fss3fs
là một hệ thống file FUSE cho phép bạn mount một bucket S3 như một hệ thống file trên Linux. Khi một bucket được mount bằng s3fs
, bạn có thể tương tác với nó giống như bất kỳ thư mục nào khác trên hệ thống file của bạn.
Ví dụ, bạn có thể:
- Xem và chỉnh sửa file trực tiếp từ hệ thống file
- Sử dụng các lệnh dòng lệnh thông thường như
ls
,cp
,mv
, v.v. để tương tác với file - Chạy các ứng dụng mà tương tác với file thông qua hệ thống file
Tuy nhiên, s3fs
không cung cấp một số chức năng cao cấp của S3 như versioning, multi-part uploads, v.v.
4. Sử dụng s3cmd
để tương tác với S3.
Cài đặt s3cmd.
sudo apt-get install s3cmd
Sau đó, cấu hình s3cmd bằng cách chạy:
s3cmd --configure
Trong quá trình cấu hình, bạn sẽ cần cung cấp Access Key, Secret Key và endpoint của radosgw. Endpoint thường có dạng http://<radosgw-host>:<port>
. Ví dụ.
shell> s3cmd --configure
Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.
Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key [VMQLCRI4P66LQE6JIIAX]:
Secret Key [8Omx5v24CJls4PoIEz09N0Un5Yq6CNomfUWPI4vA]:
Default Region [US]:
Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
S3 Endpoint [192.168.13.235:8080]:
Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used
if the target S3 system supports dns based buckets.
DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.192.168.13.235:8080]: 192.168.13.235:8080
Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password:
Path to GPG program [/usr/bin/gpg]:
When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [No]:
On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name:
New settings:
Access Key: VMQLCRI4P66LQE6JIIAX
Secret Key: 8Omx5v24CJls4PoIEz09N0Un5Yq6CNomfUWPI4vA
Default Region: US
S3 Endpoint: 192.168.13.235:8080
DNS-style bucket+hostname:port template for accessing a bucket: 192.168.13.235:8080
Encryption password:
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol: False
HTTP Proxy server name:
HTTP Proxy server port: 0
Test access with supplied credentials? [Y/n] y
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)
Now verifying that encryption works...
Not configured. Never mind.
Save settings? [y/N] y
Configuration saved to '/root/.s3cfg'
Các trường cài đặt trên có ý nghĩa như sau:
- Access Key: Đây là ID key truy cập mà bạn sử dụng để xác thực với dịch vụ S3. Nó tương tự như một tên người dùng.
- Secret Key: Đây là key bí mật tương ứng với Access Key. Nó tương tự như một mật khẩu và được sử dụng cùng với Access Key để xác thực.
- Default Region: Đây là khu vực mặc định mà s3cmd sẽ sử dụng khi tạo hoặc tương tác với các bucket. Trong trường hợp của Ceph và radosgw, giá trị này thường không quan trọng.
- S3 Endpoint: Đây là địa chỉ của dịch vụ S3 mà s3cmd sẽ kết nối đến. Trong trường hợp của bạn, đó là địa chỉ của radosgw.
- DNS-style bucket+hostname:port template for accessing a bucket: Đây là cách s3cmd sẽ tạo URL để truy cập vào các bucket. Trong trường hợp của bạn, nó sẽ tạo các URL có dạng
192.168.13.235:8080
. - Encryption password: Nếu bạn muốn s3cmd mã hóa các file trước khi tải lên, bạn có thể cung cấp một mật khẩu ở đây.
- Path to GPG program: Nếu bạn cung cấp một mật khẩu mã hóa, s3cmd sẽ sử dụng chương trình GPG tại đường dẫn này để thực hiện việc mã hóa.
- Use HTTPS protocol: Nếu đặt thành
True
, s3cmd sẽ sử dụng giao thức HTTPS khi kết nối đến dịch vụ S3. Trong trường hợp của bạn, nó đang được đặt thànhFalse
, nghĩa là s3cmd sẽ sử dụng giao thức HTTP. - HTTP Proxy server name: Nếu bạn muốn s3cmd kết nối đến dịch vụ S3 thông qua một proxy HTTP, bạn có thể cung cấp tên máy chủ proxy ở đây.
- HTTP Proxy server port: Nếu bạn cung cấp tên máy chủ proxy, bạn cũng cần cung cấp cổng mà proxy đang lắng nghe ở đây.
Khi đã cấu hình xong, bạn có thể sử dụng s3cmd để tương tác với radosgw.
Ví dụ, để liệt kê tất cả các bucket:
shell> s3cmd ls
2024-01-25 06:51 s3://my-new-bucket
Để tạo một bucket mới bằng s3cmd, bạn có thể sử dụng lệnh s3cmd mb
. Ví dụ, để tạo một bucket có tên là my-new-bucket
, bạn có thể chạy lệnh sau:
s3cmd mb s3://<bucket_name>
Lưu ý rằng tên bucket phải là duy nhất trên toàn bộ hệ thống S3 của bạn, không chỉ duy nhất trong tài khoản của bạn. Nếu một bucket với tên bạn chọn đã tồn tại, lệnh trên sẽ thất bại.
Ví dụ.
shell> s3cmd mb s3://bucket-hoanghd
Bucket 's3://bucket-hoanghd/' created
Kết quả khi list bucket.
shell> s3cmd ls
2024-01-25 07:54 s3://bucket-hoanghd
2024-01-25 06:51 s3://my-new-bucket
5. Mount S3 sử dụng s3fs.
Như đã nói ở trên s3cmd
là một công cụ dòng lệnh được thiết kế để tương tác với Amazon S3 và các dịch vụ tương tự. Nó cung cấp các chức năng như tạo và xóa bucket, tải lên và tải xuống file, liệt kê các bucket và file, và nhiều hơn nữa. Tuy nhiên, s3cmd
không hỗ trợ việc mount một bucket như một hệ thống file trên máy của bạn.
Nếu bạn muốn mount một bucket S3 như một hệ thống file, bạn cần sử dụng một công cụ khác như s3fs
. s3fs
là một hệ thống file FUSE cho phép bạn mount một bucket S3 như một hệ thống file trên Linux.
Cài đặt s3fs
.
sudo apt-get update
sudo apt-get install s3fs
Tạo file chứa thông tin xác thực S3 của bạn. Thông tin này bao gồm Access Key ID và Secret Access Key:
echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ~/.passwd-s3fs
chmod 600 ~/.passwd-s3fs
Thay ACCESS_KEY_ID
và SECRET_ACCESS_KEY
bằng Access Key ID và Secret Access Key thực sự của bạn.
Ví dụ tôi có thông tin S3 như sau:
shell> radosgw-admin user info --uid=hoanghd-radosgw
{
"user_id": "hoanghd-radosgw",
"display_name": "Ha Dang Hoang Radosgw",
"email": "admin@hoanghd.com",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "hoanghd-radosgw",
"access_key": "VMQLCRI4P66LQE6JIIAX",
"secret_key": "8Omx5v24CJls4PoIEz09N0Un5Yq6CNomfUWPI4vA"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
Và thông tin Bucket.
shell> radosgw-admin bucket list
[
"my-new-bucket",
"bucket-hoanghd"
]
shell> radosgw-admin bucket stats --bucket=bucket-hoanghd
{
"bucket": "bucket-hoanghd",
"num_shards": 11,
"tenant": "",
"zonegroup": "2b9bfa30-0a37-4577-870f-1b9506420c0b",
"placement_rule": "default-placement",
"explicit_placement": {
"data_pool": "",
"data_extra_pool": "",
"index_pool": ""
},
"id": "b0cc9e38-4c73-48a3-adb6-099e65cf463e.24395.3",
"marker": "b0cc9e38-4c73-48a3-adb6-099e65cf463e.24395.3",
"index_type": "Normal",
"owner": "hoanghd-radosgw",
"ver": "0#1,1#1,2#1,3#1,4#1,5#1,6#1,7#1,8#1,9#1,10#1",
"master_ver": "0#0,1#0,2#0,3#0,4#0,5#0,6#0,7#0,8#0,9#0,10#0",
"mtime": "2024-01-25T07:54:01.700714Z",
"creation_time": "2024-01-25T07:54:01.485594Z",
"max_marker": "0#,1#,2#,3#,4#,5#,6#,7#,8#,9#,10#",
"usage": {},
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
}
}
Ghi thông tin Access Key ID và Secret Access Key vào file ~/.passwd-s3f
.
echo VMQLCRI4P66LQE6JIIAX:8Omx5v24CJls4PoIEz09N0Un5Yq6CNomfUWPI4vA > ~/.passwd-s3f
chmod 600 ~/.passwd-s3fs
Tạo một thư mục mount point. Ví dụ, để tạo một thư mục tại /mnt/s3
, bạn có thể sử dụng lệnh sau:
sudo mkdir /mnt/s3
Mount S3 bucket của bạn tại thư mục mount point:
s3fs bucket-hoanghd /mnt/s3 \
-o passwd_file=~/.passwd-s3fs \
-o url="http://192.168.13.235:8080" \
-o use_path_request_style
bucket-hoanghd
: Tên của bucket bạn muốn mount./mnt/s3
: Đường dẫn trên hệ thống file local nơi bạn muốn mount bucket.-o passwd_file=~/.passwd-s3fs
: Đường dẫn đến file chứa thông tin xác thực của bạn (Access Key và Secret Key). File này phải có định dạngaccessKeyId:secretAccessKey
.-o url="http://192.168.13.235:8080"
: URL của dịch vụ S3 mà bạn muốn tương tác. Trong trường hợp này, đó là một dịch vụ S3 tương thích chạy trên192.168.13.235
với cổng8080
.-o use_path_request_style
: Sử dụng kiểu yêu cầu đường dẫn (path request style) thay vì kiểu yêu cầu phụ tên miền (subdomain request style). Khi option này được bật, các yêu cầu sẽ có dạnghttp://192.168.13.235:8080/bucket-hoanghd
thay vìhttp://bucket-hoanghd.192.168.13.235:8080
.
Bây giờ, bạn có thể truy cập và làm việc với S3 bucket của bạn như một hệ thống file cục bộ tại /mnt/s3
.
Nếu bucket-hoanghd
đã được mount thành công, lệnh df -h /mnt/s3
hoặc mount -t fuse.s3fs
sẽ trả về một dòng chứa thông tin về dung lượng và không gian đã sử dụng của /mnt/s3
.
shell> mount -t fuse.s3fs
s3fs on /mnt/s3 type fuse.s3fs (rw,nosuid,nodev,relatime,user_id=0,group_id=0)
shell> df -h /mnt/s3
Filesystem Size Used Avail Use% Mounted on
s3fs 256T 0 256T 0% /mnt/s3
Nếu cả hai lệnh trên đều không trả về kết quả, có thể bucket-hoanghd
chưa được mount thành công. Trong trường hợp này, bạn nên kiểm tra lại quá trình mount và đảm bảo rằng bạn đã cung cấp đúng thông tin xác thực và tên bucket.
Khi bạn mount một bucket S3 bằng s3fs
, hệ thống file không thực sự biết được dung lượng thực tế của bucket. Điều này là do S3 không phải là một hệ thống file truyền thống và không cung cấp thông tin về dung lượng tổng cộng hoặc dung lượng còn trống.
Do đó, s3fs
mặc định sẽ báo cáo rằng bucket có dung lượng rất lớn (256TB trong trường hợp của bạn) và không có dữ liệu nào được sử dụng. Điều này giúp đảm bảo rằng bạn không gặp phải vấn đề về không gian khi làm việc với bucket.
Nếu bạn muốn xem dung lượng thực tế được sử dụng và còn trống của hệ thống lưu trữ S3 của mình, bạn sẽ cần sử dụng công cụ quản lý S3 hoặc API của S3.
Lưu ý hãy đảm bảo rằng bạn đã cấp đủ quyền cho Access Key ID và Secret Access Key để truy cập vào S3 bucket.