Khởi tạo Database và Cấu hình Quyền truy cập
Bước đầu tiên là tạo thư mục dữ liệu chuyên biệt và khởi tạo file database vật lý (.db) để DuckDB có nơi lưu trữ trạng thái.
Chúng ta cần tạo thư mục riêng biệt để tránh xung đột quyền với hệ thống và đảm bảo tính bảo mật cho dữ liệu nhạy cảm.
mkdir -p /opt/duckdb/data
touch /opt/duckdb/data/production.db
chmod 750 /opt/duckdb/data
chown -R $USER:$USER /opt/duckdb/data
Kết quả: Thư mục /opt/duckdb/data được tạo, file production.db tồn tại với quyền đọc/ghi cho owner và quyền đọc cho group, ngăn chặn người dùng khác truy cập trái phép.
Tạo Schema và Bảng mẫu qua CLI
Sử dụng DuckDB CLI để định nghĩa cấu trúc dữ liệu (Schema) và các bảng (Tables) cần thiết cho ứng dụng server.
Chúng ta sẽ tạo một bảng mẫu để lưu trữ dữ liệu giao dịch, bao gồm các trường ID, timestamp và giá trị số thực.
duckdb /opt/duckdb/data/production.db -c "CREATE SCHEMA IF NOT EXISTS public; CREATE TABLE public.transactions (id INTEGER PRIMARY KEY, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, amount DOUBLE, currency VARCHAR(3) NOT NULL);"
Kết quả: Schema 'public' được tạo (nếu chưa tồn tại) và bảng 'transactions' được khởi tạo thành công mà không báo lỗi.
Chèn dữ liệu mẫu và Kiểm tra
Nhập một lượng dữ liệu mẫu vào bảng vừa tạo để xác nhận khả năng ghi (write) và đọc (read) của database.
Việc này giúp kiểm tra ngay lập tức xem engine DuckDB đã xử lý đúng kiểu dữ liệu và ràng buộc (constraints) hay chưa.
duckdb /opt/duckdb/data/production.db -c "INSERT INTO public.transactions (amount, currency) VALUES (100.50, 'USD'), (250.00, 'EUR'), (50.25, 'VND'); SELECT COUNT(*) FROM public.transactions;"
Kết quả: Câu lệnh INSERT thực thi thành công và câu lệnh SELECT trả về giá trị 3, chứng tỏ dữ liệu đã được lưu trữ và truy xuất chính xác.
Verify quyền truy cập thư mục
Kiểm tra lại quyền sở hữu và quyền truy cập của thư mục dữ liệu để đảm bảo an toàn trước khi triển khai service.
Chúng ta cần xác nhận rằng chỉ người dùng hiện tại (hoặc group được chỉ định) mới có thể ghi dữ liệu vào thư mục này.
ls -ld /opt/duckdb/data
Kết quả: Đầu ra hiển thị quyền 'drwxr-x---' và owner là user hiện hành, xác nhận cấu hình bảo mật đã đúng chuẩn.
Cấu hình DuckDB Server và Tối ưu hóa Hiệu suất
DuckDB bản chất là một database nhúng (embedded), nhưng chúng ta có thể cấu hình nó để lắng nghe kết nối mạng thông qua DuckDB Server (HTTP/gRPC) hoặc chuẩn bị các tham số tối ưu cho môi trường server.
Để DuckDB hoạt động như một server độc lập, chúng ta cần sử dụng DuckDB Server binary (thường là duckdb-server) thay vì CLI thông thường, hoặc cấu hình các tham số trong file config để tối ưu bộ nhớ.
Kiểm tra và Khởi động DuckDB Server
Khởi động DuckDB Server để lắng nghe kết nối trên cổng HTTP và gRPC, cho phép các client bên ngoài kết nối qua giao thức chuẩn.
Chúng ta cần chỉ định rõ đường dẫn đến file database và cổng kết nối để tránh xung đột với các dịch vụ khác trên máy chủ.
duckdb-server --http-port 8080 --grpc-port 9090 /opt/duckdb/data/production.db
Kết quả: Terminal hiển thị thông báo "DuckDB Server started on port 8080 (HTTP) and 9090 (gRPC)", server bắt đầu lắng nghe và sẵn sàng nhận kết nối.
Tối ưu hóa Bộ nhớ và Cache
Cấu hình các tham số bộ nhớ (Memory) và cache để tối ưu hóa hiệu suất truy xuất dữ liệu cho workload server.
Trên môi trường server, chúng ta cần giới hạn bộ nhớ sử dụng để tránh làm tràn RAM hệ thống và tăng kích thước cache để giảm I/O đĩa.
duckdb /opt/duckdb/data/production.db -c "SET memory_limit='4GB'; SET temp_directory='/tmp/duckdb_temp'; SET io_thread_count=4; SELECT current_setting('memory_limit');"
Kết quả: Giá trị memory_limit được thiết lập là 4GB, thư mục temp được chỉ định rõ ràng và số luồng I/O được điều chỉnh, trả về giá trị cấu hình hiện hành.
Cấu hình File Config (Tùy chọn cho Service)
Tạo một file cấu hình riêng để lưu trữ các tham số tối ưu hóa, giúp dễ dàng quản lý khi chạy dưới dạng Systemd Service ở phần sau.
File config này sẽ chứa các tham số môi trường hoặc cờ khởi động cần thiết cho DuckDB Server.
cat > /etc/duckdb/server.conf
Kết quả: File cấu hình /etc/duckdb/server.conf được tạo thành công với các tham số đã định nghĩa và quyền truy cập an toàn.
Verify kết nối từ xa
Thử nghiệm kết nối đến DuckDB Server từ một terminal khác hoặc sử dụng curl để xác nhận server đang hoạt động trên mạng.
Chúng ta sẽ gửi một yêu cầu HTTP đơn giản đến endpoint quản lý của DuckDB Server để kiểm tra trạng thái.
curl -s http://localhost:8080/ready
Kết quả: Trả về chuỗi JSON hoặc text "OK" (hoặc tương tự tùy phiên bản), xác nhận server đã lắng nghe cổng HTTP và phản hồi yêu cầu.
Điều hướng series:
Mục lục: Series: Triển khai Database Serverless với DuckDB và Ubuntu 24.04
« Phần 1: Chuẩn bị môi trường Ubuntu 24.04 và cài đặt DuckDB
Phần 3: Triển khai DuckDB dưới dạng Service Systemd trên Ubuntu »