You are on page 1of 9

Tài liệu nghiên cứu MinIO

1. Tổng quan

MinIO là một hệ thống lưu trữ đối tượng (object storage) mã nguồn mở và được
thiết kế để lưu trữ và quản lý dữ liệu lớn. Nó cho phép lưu trữ các đối tượng
dưới dạng tệp hoặc dữ liệu nhị phân và cung cấp một giao diện API đơn giản để
truy cập và quản lý các đối tượng này.

MinIO có thể được triển khai trên các máy chủ riêng lẻ hoặc trên các dịch vụ
đám mây công cộng như Amazon S3, Google Cloud Storage hoặc Microsoft
Azure Blob Storage. Nó cung cấp các tính năng như bảo mật, sao lưu, đồng bộ
hóa và khả năng mở rộng tốt. Với thiết kế hướng đối tượng, MinIO là một giải
pháp lưu trữ linh hoạt và có thể được sử dụng cho nhiều ứng dụng khác nhau, từ
lưu trữ dữ liệu lớn đến lưu trữ tệp đa phương tiện và lưu trữ dữ liệu IoT.

Tài liệu tập trung vào tính năng lưu trữ (storage) file, chức năng hiện đang cần
dùng, mọi người có thể tự tìm hiểu thêm nhé :V

Đây là mô hình tổng quan nhé


SSE-S3 là một dịch vụ mã hóa dữ liệu được hỗ trợ trên Amazon S3 (Simple
Storage Service). SSE-S3 (Server-Side Encryption - S3) cho phép bạn mã hóa
dữ liệu trên máy chủ của Amazon S3 bằng các khóa mã hóa được quản lý bởi
AWS. Khi dữ liệu được mã hóa bằng SSE-S3, nó được lưu trữ trên ổ đĩa
Amazon S3 dưới dạng đã được mã hóa, điều này giúp bảo vệ dữ liệu khỏi các
mối đe dọa bảo mật.

SSE-C (Server-Side Encryption with Customer-Provided Keys) là một tính


năng bảo mật khác được hỗ trợ trên Amazon S3 và MinIO. SSE-C cho phép bạn
mã hóa dữ liệu trên máy chủ của Amazon S3 hoặc MinIO bằng khóa mã hóa
được cung cấp bởi khách hàng, thay vì sử dụng khóa do nhà cung cấp quản lý.

KMS (Key Management Service) là một dịch vụ quản lý khóa mã hóa của
Amazon Web Services (AWS).

Các khái niệm treen giới thiệu qua cho mọi người có cái nhìn tổng quan về
minIO thôi, đây không phải nội dung chính của bộ tài liệu này, mọi người có thể
tìm hiểu thêm nhé

2. Cài đặt

MinIO có thể được cài đặt trên các nền tảng khác nhau, bao gồm Linux,
Windows và MacOS. Bạn có thể tải xuống phiên bản mới nhất của MinIO từ
trang web chính thức của nó. Sau khi tải xuống, bạn có thể cài đặt MinIO bằng
các lệnh dòng lệnh tương ứng với nền tảng của mình.
https://min.io/docs/minio/container/index.html

3. Sử dụng

Lưu ý là minIO dùng 2 port:


+1 port để giao tiếp với API: 9000
+1 port để giao tiếp với Dashboard: 9090

Cũng tương ứng với 2 port thì có 2 cách để thao tác với minIO, phần này sẽ chia
rõ ràng ra 2 phần
3.1 Dashboard
Dashboard thì vốn nó được thiết kế để dễ sử dụng rồi nên mình chỉ đi vào các
phần quan trọng thôi, cái phần code api mới có nhiều cái để nói

3.1.1 Bucket
Bucket là một khái niệm dùng để định nghĩa một không gian lưu trữ dùng để
chứa các đối tượng (object). Bucket tương tự như một thư mục trong hệ thống
file của bạn, nó là một đối tượng logic giúp bạn phân loại và quản lý các đối
tượng lưu trữ.

Tại đây bạn có thể tạo, quản lý, xóa, bla bla các Bucket

3.1.2 Object Browser


Đây là cái mà mình quan tâm nhất hiện tại, đây là chỗ để tải file lên và down
file về, Dashboard thì đơn giản, cứ đọc là hiểu chức năng thôi
3.1.2 Access Key
Access Key trong MinIO là một chuỗi ký tự đại diện cho tài khoản người dùng
hoặc ứng dụng được sử dụng để truy cập vào các tài nguyên trong hệ thống lưu
trữ đám mây MinIO. Access Key thường được sử dụng kèm với Secret Key để
xác thực người dùng hoặc ứng dụng truy cập vào các tài nguyên lưu trữ trong
MinIO.

Khi tạo một tài khoản trên MinIO, hệ thống sẽ tạo tự động một Access Key và
Secret Key tương ứng cho tài khoản đó. Access Key được hiển thị trên giao diện
web của MinIO hoặc có thể được truy xuất thông qua các API. Access Key và
Secret Key có vai trò quan trọng trong việc bảo mật và kiểm soát truy cập vào
tài nguyên lưu trữ trong MinIO, do đó cần được bảo mật và quản lý cẩn thận.

Bạn có thể tạo thêm các Access Key và Secret Key khác cho các người dùng
hoặc ứng dụng khác nhau và cấu hình các quyền truy cập cho từng Access Key
để tăng cường bảo mật và kiểm soát truy cập vào tài nguyên lưu trữ trong
MinIO.

Giao diện trên dashboard sẽ như này:


3.1.3 Identity
Tạo và quản lý User, Group, …

3.2 API
-Để tích hợp và sử dụng minIO trong dự án của mình cần thêm dependency
minio vào file pom
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.5</version>
</dependency>

-Tất cả các giao tiếp với minIO được thông qua lớp MinioClient
-Để có thể kết nối đến minIO cần cấu hình các thuộc tính cho MinioClient:
+Url: end point của service minIO đang chạy trên local
+Access Key
+Secret Key
(Access Key và Secret Key là gì đã giải thích ở phần trên)

-Tạo Access Key và Secret Key thì ngoài tạo trên Dashboard thì có thể tạo bằng
dòng lệnh, nói chung là gần như tất cả các thao tác với minIO trên Dashboard
thì đều có thể thực hiện tương tự với code
-VD:

import io.minio.MinioClient;
import io.minio.admin.AdminClient;

public class MinioExample {


public static void main(String[] args) {
// Tạo đối tượng MinioClient để kết nối đến MinIO server
MinioClient minioClient = MinioClient.builder()
.endpoint("http://my-minio-server.com:9000")
.credentials("my-access-key", "my-secret-key")
.build();

// Tạo đối tượng AdminClient để thực hiện các thao tác quản lý
AdminClient adminClient = AdminClient.builder()
.endpoint("http://my-minio-server.com:9000")
.credentials("my-access-key", "my-secret-key")
.build();

// Tạo Access Key mới với tên người dùng và mật khẩu
String username = "new-user";
String password = "new-password";
try {
adminClient.createUser(username, password);
// Lấy Access Key và Secret Key của người dùng mới
String[] keys = adminClient.getAccessKey(username);
String accessKey = keys[0];
String secretKey = keys[1];
System.out.println("Access Key: " + accessKey);
System.out.println("Secret Key: " + secretKey);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}

-Sau khi có Access Key và Secret Key thì ta có thể tạo MinioClient để thực hiện
các thao tác với server, cụ thể trong tài liệu này thì tìm hiểu các chức năng up
file và get file

3.2.1 Upload file


Có 2 method chính để thực hiện đẩy file lên minIO:
+uploadObject();
+putObject();

Cả hai phương thức uploadObject() và putObject() đều được sử dụng để đẩy file
lên MinIO, tuy nhiên chúng có một số khác biệt như sau:

+uploadObject() là một phương thức dựa trên sự kiện (event-based) được gọi
khi một file được tải lên. Phương thức này được sử dụng để tải nhiều file lên
cùng một lúc. Trong khi đó, putObject() là một phương thức đồng bộ
(synchronous) được sử dụng để tải lên một file đơn lẻ.

+uploadObject() được sử dụng để tải lên file theo kiểu dữ liệu dòng (stream
data) và được xử lý bởi server. Điều này có nghĩa là nó sử dụng ít bộ nhớ hơn
khi tải lên file lớn. Trong khi đó, putObject() yêu cầu tải lên toàn bộ file vào bộ
nhớ trước khi tải lên.

+uploadObject() có thể chia nhỏ file thành các phần nhỏ hơn và tải lên song
song để tăng tốc độ tải lên. Trong khi đó, putObject() chỉ tải lên một file duy
nhất một lần.
Tóm lại, uploadObject() và putObject() đều là các phương thức được sử dụng để
tải lên file lên MinIO, tuy nhiên, phương thức uploadObject() được sử dụng để
tải nhiều file lên cùng một lúc, tải lên dữ liệu dòng, có thể chia nhỏ file và tải
lên song song để tăng tốc độ tải lên. Trong khi đó, phương thức putObject()
được sử dụng để tải lên một file duy nhất và yêu cầu tải lên toàn bộ file vào bộ
nhớ trước khi tải lên.

3.2.1.1 uploadObject()

3.2.1.2 putObject()

3.2.2 Get file


Trong MinIO, getObject() và downloadObject() là hai phương thức khác nhau
được sử dụng để lấy dữ liệu đối tượng (object) từ máy chủ MinIO. Dưới đây là
sự khác biệt giữa hai phương thức này:

+getObject() là phương thức lấy dữ liệu đối tượng từ MinIO bằng cách trả về
một Object đại diện cho dữ liệu đối tượng đó. Phương thức này sử dụng các đối
số khác nhau để xác định nơi lưu trữ đối tượng và cách thức truy cập vào nó.
getObject() trả về dữ liệu đối tượng dưới dạng dữ liệu byte.

+downloadObject() là phương thức lấy dữ liệu đối tượng từ MinIO bằng cách
tải nó về máy khách. Phương thức này sử dụng các đối số khác nhau để xác
định nơi lưu trữ đối tượng và cách thức truy cập vào nó. downloadObject() trả
về dữ liệu đối tượng dưới dạng tệp tin trên máy khách.

+Tóm lại, getObject() và downloadObject() đều được sử dụng để lấy dữ liệu đối
tượng từ MinIO, tuy nhiên phương thức getObject() trả về dữ liệu đối tượng
dưới dạng dữ liệu byte, trong khi downloadObject() trả về dữ liệu đối tượng
dưới dạng tệp tin trên máy khách. Chọn phương thức nào phù hợp sẽ phụ thuộc
vào cách thức sử dụng dữ liệu đối tượng sau khi lấy về.

3.2.2.1 downloadObject()

3.2.2.2 getObject()
Note: phần cuối này còn 1 xíu nữa tại đang tìm hiểu cái khác ưu tiên hơn, ae có
thể tự nghiên cứu nhé :v

You might also like