Khái niệm về Tablespaces và sự phân tách dữ liệu trong YugabyteDB
Trong YugabyteDB, Tablespaces đóng vai trò là điểm nối giữa logic SQL của PostgreSQL và hệ thống lưu trữ vật lý phân tán.
Tablespaces cho phép bạn chỉ định vị trí vật lý cụ thể trên đĩa cứng nơi dữ liệu của một Database hoặc Schema sẽ được lưu trữ.
Việc sử dụng Tablespaces giúp tách biệt dữ liệu quan trọng (như giao dịch tài chính) ra khỏi dữ liệu log hoặc dữ liệu tạm thời, từ đó tối ưu hóa I/O và bảo vệ hiệu năng.
Khác với PostgreSQL truyền thống, YugabyteDB phân tán dữ liệu qua nhiều node, nhưng Tablespaces vẫn được quản lý tại node Master để định danh vị trí lưu trữ ban đầu của các Tablet (bản sao dữ liệu).
Verify kết quả bước này
Để kiểm tra xem YugabyteDB có hỗ trợ và hiểu về Tablespaces hay không, hãy truy vấn danh sách tablespace mặc định.
yugabyted --system=yugabyte --user=yugabyte --password=yugabyte --database=yugabyte --command="SELECT name, pg_size_pretty(pg_tablespace_size(name)) FROM pg_tablespace;"
Kết quả mong đợi: Xuất hiện danh sách các tablespace mặc định như 'pg_default' và 'pg_global' với kích thước hiện tại.
Tạo Tablespace với các tham số lưu trữ tùy chỉnh
Bước này hướng dẫn cách tạo một tablespace mới chỉ định rõ đường dẫn thư mục trên hệ thống Linux.
Trước khi tạo trong SQL, bạn phải tạo thư mục vật lý trên OS và cấp quyền cho user `yugabyte` để đảm bảo an toàn và tránh lỗi permission.
sudo mkdir -p /var/lib/yugabyte/custom_tablespace
sudo chown yugabyte:yugabyte /var/lib/yugabyte/custom_tablespace
Kết quả mong đợi: Thư mục được tạo thành công và thuộc quyền sở hữu của user `yugabyte`.
Sau khi chuẩn bị thư mục, thực thi lệnh SQL để tạo tablespace mới mang tên `ts_custom` trỏ về đường dẫn đã tạo.
yugabyted --system=yugabyte --user=yugabyte --password=yugabyte --database=yugabyte --command="CREATE TABLESPACE ts_custom LOCATION '/var/lib/yugabyte/custom_tablespace';"
Kết quả mong đợi: Thông báo "NOTICE: CREATE TABLESPACE" hoặc không có lỗi, xác nhận tablespace đã được đăng ký vào catalog của hệ thống.
Verify kết quả bước này
Kiểm tra xem tablespace `ts_custom` đã xuất hiện trong danh sách chưa.
yugabyted --system=yugabyte --user=yugabyte --password=yugabyte --database=yugabyte --command="SELECT name, location FROM pg_tablespace WHERE name = 'ts_custom';"
Kết quả mong đợi: Trả về một dòng duy nhất với name là `ts_custom` và location là `/var/lib/yugabyte/custom_tablespace`.
Gán Tablespace cho Database và Schema mới
Mục đích là tạo một database mới và ép buộc mọi object trong đó phải lưu vào tablespace `ts_custom` đã tạo ở bước trên.
Tham số `TABLESPACE` trong lệnh `CREATE DATABASE` xác định nơi lưu trữ mặc định cho tất cả các bảng, chỉ mục và dữ liệu trong database đó.
yugabyted --system=yugabyte --user=yugabyte --password=yugabyte --database=yugabyte --command="CREATE DATABASE db_production TABLESPACE ts_custom;"
Kết quả mong đợi: Database `db_production` được tạo thành công, dữ liệu của nó sẽ nằm trong thư mục `/var/lib/yugabyte/custom_tablespace`.
Để quản lý granular hơn, bạn có thể tạo một Schema riêng trong database đó và gán tablespace cụ thể cho schema này.
yugabyted --system=yugabyte --user=yugabyte --password=yugabyte --database=db_production --command="CREATE SCHEMA schema_finance TABLESPACE ts_custom;"
Kết quả mong đợi: Schema `schema_finance` được tạo và các bảng tạo mới trong schema này sẽ tự động sử dụng tablespace `ts_custom` nếu không được chỉ định khác.
Bạn cũng có thể gán tablespace trực tiếp cho từng bảng cụ thể ngay khi tạo bảng, bất kể setting mặc định của database hay schema.
yugabyted --system=yugabyte --user=yugabyte --password=yugabyte --database=db_production --command="CREATE TABLE schema_finance.transactions (id SERIAL, amount NUMERIC) TABLESPACE ts_custom;"
Kết quả mong đợi: Bảng `transactions` được tạo thành công và dữ liệu vật lý của nó nằm trong `ts_custom`.
Verify kết quả bước này
Kiểm tra xem database `db_production` đang sử dụng tablespace nào làm mặc định.
yugabyted --system=yugabyte --user=yugabyte --password=yugabyte --database=yugabyte --command="SELECT datname, dattablespace::regtspace FROM pg_database WHERE datname = 'db_production';"
Kết quả mong đợi: Cột `dattablespace` hiển thị tên `ts_custom` thay vì `pg_default`.
Kiểm tra phân bổ không gian đĩa cho từng Tablespace
Bước cuối cùng là xác minh xem dữ liệu thực tế đã được ghi vào đúng thư mục vật lý của tablespace mới hay chưa.
Sử dụng hàm `pg_tablespace_size` để lấy tổng kích thước của tablespace tính bằng byte và chuyển đổi sang định dạng dễ đọc.
yugabyted --system=yugabyte --user=yugabyte --password=yugabyte --database=yugabyte --command="SELECT name, pg_size_pretty(pg_tablespace_size(name)) AS size FROM pg_tablespace ORDER BY pg_tablespace_size(name) DESC;"
Kết quả mong đợi: Bảng kết quả hiển thị `ts_custom` có kích thước lớn hơn 0 (do đã tạo database và bảng), trong khi các tablespace khác có thể vẫn ở mức nhỏ.
Để xác nhận chắc chắn trên hệ thống file, hãy dùng lệnh `du` của Linux để kiểm tra dung lượng thư mục vật lý tương ứng.
du -sh /var/lib/yugabyte/custom_tablespace
Kết quả mong đợi: Con số dung lượng hiển thị trùng khớp (trong phạm vi làm tròn) với kết quả từ truy vấn SQL ở bước trên, xác nhận dữ liệu ACID đã được ghi đúng vị trí.
Bạn cũng có thể kiểm tra chi tiết kích thước của từng bảng nằm trong tablespace đó để phân bổ tài nguyên chính xác.
yugabyted --system=yugabyte --user=yugabyte --password=yugabyte --database=db_production --command="SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) AS size FROM pg_stat_user_tables ORDER BY pg_total_relation_size(relid) DESC;"
Kết quả mong đợi: Danh sách các bảng trong database `db_production` kèm kích thước, tất cả đều nằm trong không gian lưu trữ của `ts_custom`.
Điều hướng series:
Mục lục: Series: Triển khai Database ACID với YugabyteDB trên Ubuntu 24.04
« Phần 2: Cài đặt và khởi động cụm YugabyteDB đơn node trên Ubuntu 24.04
Phần 4: Tối ưu hóa hiệu năng ghi và đọc với cấu hình ACID »