Cấu hình client driver PostgreSQL cho YSQL
YugabyteDB YSQL tương thích hoàn toàn với giao thức PostgreSQL, cho phép sử dụng bất kỳ driver nào hỗ trợ Postgres để kết nối. Chúng ta sẽ cấu hình ứng dụng mẫu sử dụng driver psycopg2 cho Python để kết nối vào instance YSQL đã deploy trong phần trước.
Mục đích là thiết lập tham số kết nối chính xác, bao gồm host, port, user, password và đặc biệt là sslmode để đảm bảo an toàn và khả năng tương thích với YugabyteDB.
Trước tiên, kiểm tra lại địa chỉ public endpoint hoặc internal service của YSQL. Giả sử chúng ta đã có một service với tên yb-ysql và port 5433 (mặc định cho YSQL trong cluster Helm).
Cài đặt thư viện driver psycopg2 vào môi trường Linux của bạn:
pip install psycopg2-binary
Thư viện psycopg2-binary đã được cài đặt. Tiếp theo, tạo file cấu hình kết nối ứng dụng. File này sẽ chứa thông tin đăng nhập mà chúng ta đã thiết lập trong Phần 3.
Tạo file /app/config/database.yml với nội dung hoàn chỉnh:
database:
host: "yb-ysql.default.svc.cluster.local"
port: 5433
user: "yugabyte"
password: "yugabyte"
dbname: "yugabyte"
sslmode: "require"
connect_timeout: 10
File cấu hình đã được tạo. Tham số sslmode: require bắt buộc kết nối qua SSL, đây là tiêu chuẩn an toàn của YugabyteDB. Nếu bạn chạy từ bên ngoài cluster mà chưa cấu hình SSL tự ký, hãy đổi thành prefer hoặc disable để test, nhưng trong production luôn dùng require.
Viết một script Python ngắn /app/test_connection.py để verify kết nối:
import psycopg2
import yaml
# Load config
with open('/app/config/database.yml', 'r') as f:
config = yaml.safe_load(f)
try:
conn = psycopg2.connect(
host=config['database']['host'],
port=config['database']['port'],
user=config['database']['user'],
password=config['database']['password'],
dbname=config['database']['dbname'],
sslmode=config['database']['sslmode']
)
print("Connection established successfully.")
conn.close()
except Exception as e:
print(f"Connection failed: {e}")
Kết quả mong đợi: Script in ra dòng Connection established successfully.. Nếu lỗi, kiểm tra lại log của pod YugabyteDB hoặc firewall.
Cài đặt và sử dụng ySQL Shell để tương tác trực tiếp
Để tương tác trực tiếp với YSQL mà không cần viết code, chúng ta sử dụng yb-yql hoặc yb-ysh (YSQL Shell) có sẵn trong binary YugabyteDB. Tuy nhiên, cách phổ biến nhất và nhanh nhất là sử dụng psql tiêu chuẩn của PostgreSQL vì YSQL hỗ trợ 100%.
Chúng ta sẽ sử dụng psql để kết nối vào cluster đang chạy. Đảm bảo bạn đã có psql trong PATH (thường có sẵn trên Ubuntu/Debian/CentOS hoặc cài qua apt install postgresql-client).
Thực thi lệnh kết nối trực tiếp vào instance YSQL đầu tiên (t-node). Lệnh này giả định bạn đang chạy trên một máy có thể resolve tên service yb-ysql.
psql -h yb-ysql.default.svc.cluster.local -p 5433 -U yugabyte -d yugabyte
Hệ thống sẽ yêu cầu nhập password. Nhập yugabyte (hoặc password đã cấu hình trong Phần 3).
Kết quả mong đợi: Bạn sẽ thấy prompt chuyển thành yugabyte@yugabyte=#. Đây là dấu hiệu bạn đã vào được shell SQL của YugabyteDB.
Để kiểm tra phiên bản và xác nhận đây là YugabyteDB chứ không phải PostgreSQL thông thường, chạy lệnh:
SHOW server_version;
Kết quả sẽ hiển thị phiên bản tương tự 14.0 (YugabyteDB 2.12.x). Dòng này xác nhận bạn đang giao tiếp với YSQL engine.
Tạo schema, bảng và chèn dữ liệu mẫu vào YSQL
Giờ chúng ta sẽ thực hành tạo cấu trúc dữ liệu. YugabyteDB hỗ trợ đa tenant thông qua schema (database logic). Chúng ta sẽ tạo một schema mới cho ứng dụng e-commerce.
Trong prompt psql đã mở ở bước trên, tạo schema mới:
CREATE SCHEMA ecommerce;
Schema ecommerce đã được tạo. Bây giờ chuyển context sang schema này để tạo bảng:
SET search_path TO ecommerce;
Tạo bảng products với các cột tiêu biểu cho dữ liệu phân tán. Lưu ý sử dụng kiểu dữ liệu phù hợp với phân vùng (partition key).
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
category VARCHAR(100),
price DECIMAL(10, 2),
stock_quantity INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Bảng products đã được tạo thành công. YugabyteDB tự động phân vùng dữ liệu dựa trên primary key product_id.
Chèn dữ liệu mẫu vào bảng. Chúng ta sẽ chèn nhiều dòng để thấy rõ khả năng phân tán:
INSERT INTO products (name, category, price, stock_quantity) VALUES
('Laptop Pro X', 'Electronics', 1200.00, 50),
('Wireless Mouse', 'Electronics', 25.50, 200),
('Office Chair', 'Furniture', 150.00, 30),
('Standing Desk', 'Furniture', 450.00, 15);
Kết quả mong đợi: Thông báo INSERT 0 4, xác nhận 4 dòng đã được chèn vào tất cả các node t-node trong cluster.
Verify dữ liệu bằng cách truy vấn toàn bộ bảng:
SELECT * FROM products;
Bảng kết quả sẽ hiển thị 4 dòng dữ liệu đầy đủ. Nếu bạn chạy lệnh này trên node khác, dữ liệu vẫn hiển thị giống hệt nhờ cơ chế replication đồng bộ của YugabyteDB.
Kết nối và thực thi truy vấn NoSQL (CQL) với YCQL
YugabyteDB không chỉ có YSQL mà còn có YCQL (Yugabyte Cassandra Query Language) để làm việc với dữ liệu NoSQL dạng Wide Column. Để sử dụng YCQL, chúng ta cần kết nối qua port khác (mặc định là 9042).
Cài đặt driver CQL client cho Linux. Chúng ta sẽ dùng cqlsh (Cassandra Query Language Shell) hoặc yb-cqlsh nếu có sẵn trong binary YugabyteDB.
apt-get install python3-pip && pip3 install cassandra-driver
Thư viện driver Cassandra đã được cài đặt. Bây giờ, hãy kết nối vào YCQL service. Port mặc định của YCQL là 9042.
Sử dụng cqlsh để kết nối:
cqlsh -h yb-ysql.default.svc.cluster.local -p 9042 -u yugabyte -pw yugabyte
Hệ thống sẽ kết nối và chuyển prompt thành cqlsh>. Nếu bạn dùng yb-cqlsh từ binary YugabyteDB, lệnh tương tự nhưng ưu tiên kết nối nội bộ tốt hơn.
Trong môi trường NoSQL, đơn vị cơ bản là Keyspace (tương đương Database) và Table với Primary Key bắt buộc. Tạo keyspace mới cho ứng dụng:
CREATE KEYSPACE ecommerce_no_sql WITH replication = {'class': 'NetworkTopologyStrategy', 'dc1': 3};
Keyspace ecommerce_no_sql được tạo với hệ số replication là 3 (3 bản sao trên 3 node). Tham số NetworkTopologyStrategy đảm bảo dữ liệu được phân phối đều trong datacenter.
Chuyển context sang keyspace mới:
USE ecommerce_no_sql;
Tạo bảng NoSQL. Khác với SQL, ở đây phải định nghĩa rõ PRIMARY KEY gồm partition key và clustering key:
CREATE TABLE products_no_sql (
product_id UUID,
name TEXT,
category TEXT,
price DECIMAL,
stock_quantity INT,
PRIMARY KEY (product_id)
);
Bảng products_no_sql đã được tạo. Lưu ý kiểu dữ liệu UUID cho product_id là tối ưu cho việc phân tán (partitioning) trong Cassandra.
Chèn dữ liệu vào bảng NoSQL:
INSERT INTO products_no_sql (product_id, name, category, price, stock_quantity) VALUES (uuid(), 'Gaming Monitor', 'Electronics', 350.00, 40);
Lệnh uuid() tự động sinh ID duy nhất. Kết quả mong đợi: Không có thông báo thành công cụ thể như SQL, nhưng prompt sẽ quay lại cqlsh> nếu không có lỗi.
Verify dữ liệu bằng lệnh SELECT:
SELECT * FROM products_no_sql;
Hệ thống trả về 1 dòng dữ liệu với các trường tương ứng. Dữ liệu này được lưu trữ dưới dạng Wide Column, tối ưu cho đọc viết tốc độ cao và mở rộng ngang (horizontal scaling).
So sánh hiệu năng và cú pháp giữa YSQL và YCQL
Để hiểu rõ sự khác biệt, chúng ta sẽ thực hiện một bài test đơn giản so sánh cú pháp và đặc điểm lưu trữ của hai engine này trên cùng một dataset.
Điểm khác biệt lớn nhất về cú pháp:
- YSQL: Sử dụng
SERIAL hoặc BIGSERIAL để tự động tăng ID. Hỗ trợ JOIN, GROUP BY phức tạp, và Foreign Key.
- YCQL: Không có tự động tăng ID (phải dùng
uuid() hoặc logic client). Không hỗ trợ JOIN (bắt buộc denormalization). Không có Foreign Key.
Thực hiện truy vấn phức tạp trên YSQL để thấy sức mạnh của SQL:
SELECT category, COUNT(*) as count, AVG(price) as avg_price FROM products GROUP BY category;
Kết quả: YSQL trả về bảng tổng hợp theo danh mục với số lượng và giá trung bình. Đây là thao tác mạnh mẽ của Relational Database.
Thử thực hiện tương tự trên YCQL (sẽ gặp lỗi nếu không denormalize trước):
SELECT category, COUNT(*) FROM products_no_sql GROUP BY category;
Kết quả: CQL hỗ trợ GROUP BY nhưng rất hạn chế. Nó chỉ hoạt động nếu GROUP BY trên các phần của Primary Key. Ở đây category không phải là PK nên lệnh này có thể bị lỗi hoặc không trả về kết quả như mong đợi.
So sánh về hiệu năng:
- Write Performance (YCQL): Thường nhanh hơn YSQL khi chèn dữ liệu hàng triệu dòng mỗi giây vì không có ràng buộc ACID mạnh và không cần lock row phức tạp. Phù hợp cho IoT, Logging.
- Read Performance (YSQL): Tối ưu cho các truy vấn phức tạp, giao dịch tài chính cần tính nhất quán ngay lập tức (Strong Consistency). YugabyteDB đảm bảo tính nhất quán cho cả YSQL và YCQL, nhưng mô hình truy vấn khác nhau.
Để verify hiệu năng thực tế, hãy chạy EXPLAIN ANALYZE trên YSQL:
EXPLAIN ANALYZE SELECT * FROM products WHERE price > 100;
Kết quả: Hiển thị execution plan, thời gian thực thi và các node tham gia. YugabyteDB sẽ phân tích và định tuyến query đến đúng node chứa dữ liệu (scattering).
Tương tự, trên CQL không có EXPLAIN chuẩn như SQL, nhưng bạn có thể dùng DESCRIBE để xem cấu trúc phân vùng:
DESCRIBE products_no_sql;
Kết quả: Hiển thị rõ partition key và clustering key, giúp bạn hiểu cách dữ liệu được vật lý hóa trên disk.
Qua hai bước trên, bạn đã thấy rõ: YSQL dùng cho ứng dụng giao dịch truyền thống cần join và ràng buộc, YCQL dùng cho dữ liệu lớn, write-heavy, và schema linh hoạt. YugabyteDB cho phép bạn dùng cả hai trên cùng một cluster.
Điều hướng series:
Mục lục: Series: Xây dựng hệ thống Database phân tán với YugabyteDB và Kubernetes
« Phần 3: Cấu hình bảo mật và xác thực truy cập
Phần 5: Mở rộng và thu hẹp cụm Database (Scaling) »