Lựa chọn và Cài đặt MinIO như Gateway Object Store
Chúng ta sẽ sử dụng MinIO phiên bản Community Edition. MinIO là phần mềm Object Store phổ biến nhất hiện nay, hỗ trợ chuẩn S3 và có khả năng chạy trong chế độ "Single Node" hoặc "Distributed".
Tuy nhiên, để đáp ứng yêu cầu sử dụng PostgreSQL làm backend lưu trữ metadata (thay vì hệ thống file mặc định), chúng ta sẽ cấu hình MinIO chạy ở chế độ Local Mode kết hợp với MinIO Client (mc) để quản lý, đồng thời sử dụng PostgreSQL đã cài đặt ở Phần 2 để lưu trữ dữ liệu metadata thông qua cơ chế External Database hoặc sử dụng MinIO làm gateway truy cập vào PostgreSQL nếu dùng plugin mở rộng. Trong bài này, để đảm bảo tính ổn định và tương thích cao nhất với Ubuntu 24.04, chúng ta sẽ cài đặt MinIO Server và cấu hình nó để lưu trữ bucket metadata vào PostgreSQL thông qua biến môi trường hoặc cấu hình file, sau đó khởi động dịch vụ.
Lưu ý: MinIO mặc định lưu metadata trên disk. Để dùng PostgreSQL làm backend cho metadata, chúng ta cần cấu hình MinIO kết nối với DB. Tuy nhiên, cách tiếp cận chuẩn nhất và được hỗ trợ native trong các bản phát hành mới là sử dụng MinIO as S3 Gateway hoặc cấu hình MinIO + PostgreSQL thông qua MinIO Console hoặc mc admin để sync metadata. Ở đây, chúng ta sẽ cài đặt MinIO Server và cấu hình kết nối trực tiếp đến PostgreSQL để lưu trữ metadata (chế độ minio server --db-url hoặc thông qua MINIO_DB_URL).
Cài đặt MinIO Server và các phụ thuộc
Trước tiên, hãy tải MinIO Server binary về hệ thống Ubuntu 24.04. Chúng ta sẽ sử dụng phương pháp download trực tiếp từ nguồn chính thức để đảm bảo phiên bản mới nhất và tương thích.
Thực hiện các lệnh sau để tải và cài đặt MinIO:
sudo apt update
sudo apt install -y wget curl jq
sudo wget https://dl.min.io/server/minio/release/linux-amd64/minio
sudo chmod +x minio
sudo mv minio /usr/local/bin/
Biến minio giờ đã được cài đặt vào /usr/local/bin/. Bạn có thể kiểm tra phiên bản bằng lệnh minio version.
Kết quả mong đợi: Xuất hiện thông tin phiên bản MinIO Server (ví dụ: Release-Date: 2024-xx-xx) và không có lỗi.
Tạo người dùng và thư mục dữ liệu cho MinIO
MinIO cần một người dùng hệ thống riêng để chạy dịch vụ và một thư mục để lưu trữ dữ liệu vật lý (data directory). Dữ liệu metadata sẽ được chuyển hướng sang PostgreSQL, nhưng MinIO vẫn cần thư mục này để cache hoặc lưu các file object nếu cấu hình lưu trữ vật lý (trong bài này, chúng ta sẽ cấu hình MinIO chỉ lưu metadata vào DB, còn object data có thể lưu vào disk hoặc cũng vào DB tùy thuộc vào plugin, nhưng để đơn giản và chuẩn S3, object data thường lưu vào disk, metadata lưu vào DB. Tuy nhiên, yêu cầu là "Object Store dựa trên PostgreSQL", nên chúng ta sẽ cấu hình MinIO để dùng PostgreSQL làm nơi lưu trữ toàn bộ metadata của bucket và object).
Tạo user minio và thư mục /var/lib/minio:
sudo useradd -r -s /bin/false minio
sudo mkdir -p /var/lib/minio/data
sudo mkdir -p /var/lib/minio/config
sudo chown -R minio:minio /var/lib/minio
Thư mục /var/lib/minio/data sẽ chứa các file object (nếu không lưu vào DB), và /var/lib/minio/config chứa cấu hình.
Kết quả mong đợi: User minio được tạo, thư mục tồn tại và quyền sở hữu thuộc về minio.
Cấu hình kết nối PostgreSQL cho MinIO
Để MinIO sử dụng PostgreSQL làm backend lưu trữ metadata, chúng ta cần cấu hình biến môi trường MINIO_DB_URL. Biến này chứa chuỗi kết nối (Connection String) đến PostgreSQL đã được tạo trong Phần 2.
Giả sử trong Phần 2, bạn đã tạo database tên là object_store_db, user là minio_user và password là minio_secret_password, chạy trên localhost cổng 5432.
Chúng ta sẽ tạo file cấu hình systemd để quản lý dịch vụ MinIO, trong đó định nghĩa rõ các biến môi trường kết nối.
Đường dẫn file cấu hình: /etc/systemd/system/minio.service
Nội dung file:
[Unit]
Description=MinIO Object Store
Documentation=https://docs.min.io/
After=network.target
Wants=network-online.target
[Service]
Type=simple
User=minio
Group=minio
Environment="MINIO_ROOT_USER=admin"
Environment="MINIO_ROOT_PASSWORD=minioadmin"
Environment="MINIO_DB_URL=postgres://minio_user:minio_secret_password@localhost:5432/object_store_db?sslmode=disable"
Environment="MINIO_VOLUMES=/var/lib/minio/data"
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES --console-address ":9001"
Restart=always
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Cấu hình này thiết lập:
MINIO_ROOT_USER và MINIO_ROOT_PASSWORD: Tài khoản quản trị mặc định.
MINIO_DB_URL: Chuỗi kết nối đến PostgreSQL. Tham số sslmode=disable để kết nối nội bộ không cần chứng chỉ SSL (có thể thay thành require nếu có cấu hình SSL).
MINIO_VOLUMES: Thư mục lưu trữ vật lý (MinIO vẫn cần nơi này để lưu file object, metadata sẽ được sync sang DB).
console-address: Cổng 9001 cho giao diện web quản lý.
Lưu ý quan trọng: Đảm bảo password trong MINIO_DB_URL khớp với password bạn đã tạo cho user minio_user trong PostgreSQL ở Phần 2. Nếu có ký tự đặc biệt trong password, hãy escape chúng.
Sau khi tạo file, hãy reload systemd daemon:
sudo systemctl daemon-reload
Kết quả mong đợi: Lệnh chạy thành công, không có lỗi. File minio.service đã sẵn sàng để start.
Khởi động dịch vụ và Kiểm tra trạng thái
Bây giờ, chúng ta sẽ khởi động dịch vụ MinIO và để nó chạy như một systemd service (chạy tự động khi máy khởi động).
Khởi động dịch vụ:
sudo systemctl start minio
sudo systemctl enable minio
MinIO đã chạy. Bước tiếp theo là kiểm tra trạng thái của service và xác nhận kết nối đến PostgreSQL.
Kiểm tra trạng thái service:
sudo systemctl status minio
Kết quả mong đợi: Trạng thái hiển thị active (running). Trong phần Logs (nếu kéo xuống dưới), bạn sẽ thấy thông báo API: http://127.0.0.1:9000 và Browser: http://127.0.0.1:9001. Quan trọng nhất, không có lỗi connection refused hoặc password authentication failed liên quan đến database.
Tiếp theo, chúng ta cần xác minh rằng MinIO đã thực sự kết nối được với PostgreSQL. Cách tốt nhất là kiểm tra log của MinIO hoặc sử dụng MinIO Console.
Kiểm tra log kết nối database (nếu có thông báo thành công):
sudo journalctl -u minio -n 50 --no-pager | grep -i "database\|postgres\|connected"
Nếu không thấy log rõ ràng, hãy truy cập MinIO Console để xác nhận. Mở trình duyệt web và truy cập http://localhost:9001 (hoặc IP của server).
Đăng nhập với:
- Username:
admin
- Password:
minioadmin
Sau khi đăng nhập, vào mục System -> Drivers (hoặc Storage). Nếu cấu hình đúng, bạn sẽ thấy MinIO đang sử dụng PostgreSQL làm backend cho metadata (hoặc hiển thị thông tin kết nối DB thành công).
Để test nhanh qua dòng lệnh (S3 Command Line), hãy sử dụng mc (MinIO Client). Đầu tiên cài đặt mc:
sudo wget https://dl.min.io/client/mc/release/linux-amd64/mc
sudo chmod +x mc
sudo mv mc /usr/local/bin/
Cấu hình alias để kết nối tới MinIO Server đang chạy:
mc alias set myminio http://localhost:9000 admin minioadmin
Thử lệnh liệt kê bucket (ban đầu sẽ rỗng):
mc ls myminio
Kết quả mong đợi: Lệnh chạy thành công, không báo lỗi kết nối. Nếu có bucket nào được tạo (từ Console hoặc lệnh trước đó), nó sẽ hiển thị. Nếu rỗng, dòng lệnh sẽ in ra thông báo No buckets found nhưng không báo lỗi Connection refused.
Để chắc chắn 100% PostgreSQL đang được dùng, hãy tạo một bucket mới và kiểm tra trong PostgreSQL:
mc mb myminio/test-bucket
Rồi kiểm tra trong PostgreSQL (chạy trên terminal khác hoặc qua psql):
psql -h localhost -U minio_user -d object_store_db -c "SELECT * FROM bucket LIMIT 10;"
Cú pháp bảng bucket có thể thay đổi tùy phiên bản MinIO và plugin, nhưng nếu bạn thấy dữ liệu trong bảng liên quan đến bucket/object trong database object_store_db sau khi chạy lệnh mc mb, thì việc tích hợp PostgreSQL đã thành công.
Kết quả cuối cùng: Bạn đã có một dịch vụ Object Store chạy trên Ubuntu 24.04, sử dụng MinIO làm gateway và PostgreSQL làm nơi lưu trữ metadata, sẵn sàng cho các bước tạo bucket và upload dữ liệu trong Phần 5.
Điều hướng series:
Mục lục: Series: Triển khai Database Object Store với PostgreSQL và Ubuntu 24.04
« Phần 2: Cấu hình cơ sở dữ liệu PostgreSQL cho Object Store
Phần 4: Cấu hình bảo mật và quản lý truy cập cho Object Store »