Tạo User Hệ Thống Riêng Biệt cho DuckDB
Chúng ta cần tạo một user hệ thống không có shell (non-login user) để chạy tiến trình DuckDB. Việc này ngăn chặn việc truy cập trực tiếp vào tài khoản này qua SSH, giảm thiểu bề mặt tấn công nếu service bị xâm nhập.
Tại sao: Tách biệt quyền hạn của service khỏi user root hoặc user developer, tuân thủ nguyên tắc Least Privilege.
Kết quả mong đợi: User duckdb được tạo, có home directory và không thể login.
useradd --system --no-create-home --shell /bin/false duckdb
Thay đổi quyền sở hữu của thư mục dữ liệu DuckDB (giả định đã tạo ở phần trước là /var/lib/duckdb) sang user mới tạo.
chown -R duckdb:duckdb /var/lib/duckdb
Verify kết quả bằng cách kiểm tra thông tin user và quyền sở hữu thư mục.
id duckdb && ls -ld /var/lib/duckdb
Viết File Unit cho Systemd
Cấu trúc và nội dung file service
Chúng ta sẽ tạo file định nghĩa service tại /etc/systemd/system/duckdb.service. File này mô tả cách systemd khởi động, dừng, và giám sát tiến trình DuckDB.
Tại sao: Systemd cần một file unit để hiểu cách quản lý vòng đời của ứng dụng, bao gồm khởi động, tự động restart khi lỗi, và phân bổ tài nguyên.
Kết quả mong đợi: File cấu hình tồn tại, cú pháp hợp lệ, sẵn sàng để systemd nhận diện.
Trước khi tạo file, đảm bảo thư mục /etc/systemd/system đã tồn tại và bạn đang chạy với quyền root (hoặc sudo).
cat > /etc/systemd/system/duckdb.service
Reload daemon systemd để nhận diện file unit mới.
systemctl daemon-reload
Verify kết quả bằng cách kiểm tra trạng thái file unit (chưa chạy).
systemctl cat duckdb.service
Cấu hình Tự động Khởi động và Logs
Enable và Start Service
Cho phép service tự động khởi động khi hệ thống reboot và khởi động ngay lập tức.
Tại sao: Đảm bảo database luôn sẵn sàng phục vụ sau khi server được bật lại hoặc sau khi maintenance.
Kết quả mong đợi: Trạng thái service là active (running).
systemctl enable duckdb.service
systemctl start duckdb.service
Kiểm tra trạng thái chi tiết của service.
systemctl status duckdb.service
Quản lý Logs qua Journalctl
Sử dụng journalctl để xem logs của DuckDB. Logs được ghi vào journal của systemd thay vì file log riêng nếu không cấu hình thêm.
Tại sao: Centralized logging giúp dễ dàng giám sát, tìm kiếm và phân tích sự cố mà không cần vào thư mục data.
Kết quả mong đợi: Xem được dòng log khởi động và trạng thái hoạt động của server.
journalctl -u duckdb.service -f
Để kiểm tra logs của lần khởi động gần nhất (sau khi restart hoặc reboot).
journalctl -u duckdb.service -b
Thiết lập Giới hạn Tài nguyên (Resource Limits)
Giới hạn RAM và CPU trong Unit File
File unit đã được cấu hình các tham số MemoryHigh, MemoryMax và CPUWeight.
Tại sao: Ngăn chặn DuckDB tiêu thụ hết RAM của máy chủ gây treo hệ điều hành (OOM Killer), và ưu tiên CPU cho các tiến trình quan trọng khác nếu cần.
Kết quả mong đợi: Service chạy nhưng bị giới hạn bộ nhớ tối đa 8GB và ưu tiên CPU ở mức 100.
Kiểm tra các giới hạn đã áp dụng thực tế cho tiến trình.
systemctl show duckdb.service | grep -E 'MemoryHigh|MemoryMax|CPUWeight'
Thử nghiệm giới hạn RAM (tùy chọn): Nếu bạn chạy các query lớn vượt quá 8GB, systemd sẽ cố gắng giảm bộ nhớ, nếu vượt quá MemoryMax thì tiến trình sẽ bị kill.
Để thay đổi giới hạn sau này, bạn có thể chỉnh sửa file /etc/systemd/system/duckdb.service và chạy lại systemctl daemon-reload rồi systemctl restart duckdb.
Verify Trạng thái cuối cùng
Đảm bảo service đang chạy, tự động khởi động, và logs hoạt động bình thường.
systemctl is-enabled duckdb.service && systemctl is-active duckdb.service
Kiểm tra tiến trình đang chạy dưới user duckdb.
ps aux | grep duckdb | grep -v grep
Điều hướng series:
Mục lục: Series: Triển khai Database Serverless với DuckDB và Ubuntu 24.04
« Phần 2: Cấu hình DuckDB để hoạt động như một Server độc lập
Phần 4: Kết nối DuckDB từ các ứng dụng Python và SQL Client »