Cấu hình môi trường kết nối và xác thực
Bước đầu tiên là thiết lập quyền truy cập từ máy Ubuntu 24.04 của bạn vào dịch vụ Spanner trên Google Cloud. Bạn cần cấu hình file credentials JSON để các công cụ dòng lệnh (CLI) và ứng dụng có thể xác thực.
Trước tiên, hãy đảm bảo bạn đã cài đặt Google Cloud SDK và đã chạy lệnh gcloud auth application-default login để tạo file cấu hình mặc định. Nếu cần chỉ định file cụ thể, hãy tạo file JSON thủ công.
Tạo file credentials JSON tại đường dẫn mặc định của hệ thống để Spanner CLI tự động phát hiện:
cat > /home/ubuntu/.config/gcloud/application_default_credentials.json
Sau khi tạo file, hãy đặt quyền riêng tư để chỉ người dùng hiện tại có thể đọc, đảm bảo an toàn cho key:
chmod 600 /home/ubuntu/.config/gcloud/application_default_credentials.json
Kiểm tra xem Google Cloud CLI đã nhận diện đúng project và credentials chưa:
gcloud config list --format="value(core.project)"
Kết quả mong đợi: Trả về tên project ID của bạn (ví dụ: my-spanner-project-123).
Sử dụng Spanner CLI để tạo Instance và Database
Spanner CLI là công cụ dòng lệnh mạnh mẽ giúp bạn quản lý cơ sở dữ liệu mà không cần dùng Console web. Nó hỗ trợ tương tác trực tiếp với Local Emulator (đã cài ở Phần 2) hoặc Cloud Spanner thực tế.
Trước khi tạo, hãy xác định endpoint. Nếu dùng Local Emulator, endpoint là localhost:9010. Nếu dùng Cloud, bạn sẽ dùng spanner.googleapis.com. Ở đây chúng ta giả định bạn đang chạy Local Emulator để test nhanh.
Khởi động Spanner CLI kết nối tới Local Emulator:
spanner emulator --project=my-spanner-project-123 --instance=dev-instance
Trong giao diện CLI của Spanner, thực hiện lệnh tạo Instance. Lưu ý: Trong chế độ Local, bạn có thể tạo instance mà không cần chỉ định config cụ thể như trên Cloud.
CREATE INSTANCE dev-instance
Ngay sau khi instance được tạo, thực hiện lệnh tạo Database bên trong instance đó. Đây là bước thiết lập namespace cho dữ liệu:
CREATE DATABASE dev-db
Để xác minh instance và database đã được tạo thành công, hãy liệt kê danh sách:
LIST INSTANCES
Kết quả mong đợi: Xuất hiện dòng dev-instance trong danh sách.
LIST DATABASES
Kết quả mong đợi: Xuất hiện dòng dev-db trong danh sách.
Tạo schema bảng và định nghĩa kiểu dữ liệu NewSQL
Spanner hỗ trợ mô hình dữ liệu NewSQL với các kiểu dữ liệu mạnh mẽ như INT64, STRING, BYTES, BOOL, TIMESTAMP và ARRAY. Bạn sẽ thực hiện lệnh DDL (Data Definition Language) trực tiếp trong CLI.
Vào chế độ quản trị (DML) để tạo bảng. Trong Spanner CLI, bạn có thể chạy lệnh SQL trực tiếp. Tạo bảng Users với các trường cơ bản:
CREATE TABLE Users (
UserId INT64,
Username STRING(50),
Email STRING(255),
CreatedAt TIMESTAMP,
IsPremium BOOL,
Tags ARRAY,
CONSTRAINT pk_users PRIMARY KEY (UserId)
)
Tạo bảng Orders để chuẩn bị cho việc liên kết dữ liệu (Interleave) sau này:
CREATE TABLE Orders (
OrderId INT64,
UserId INT64,
OrderDate TIMESTAMP,
TotalAmount INT64,
CONSTRAINT pk_orders PRIMARY KEY (OrderId, UserId)
)
Kiểm tra cấu trúc bảng đã tạo bằng lệnh mô tả (DESCRIBE):
DESCRIBE Users
Kết quả mong đợi: Hiển thị danh sách các cột, kiểu dữ liệu và ràng buộc Primary Key của bảng Users.
DESCRIBE Orders
Kết quả mong đợi: Hiển thị Primary Key là tổ hợp của OrderId và UserId.
Cấu hình Partition và Interleave để tối ưu hiệu năng
Để đạt hiệu năng cao và giảm chi phí lưu trữ, Spanner sử dụng cơ chế Interleaving (lồng ghép). Điều này cho phép dữ liệu của bảng con được lưu trữ vật lý gần với bảng cha, giúp truy vấn JOIN nhanh hơn và giảm I/O.
Định nghĩa lại bảng OrderItems (chi tiết đơn hàng) để lồng ghép vào bảng Orders. Điều này có nghĩa là dữ liệu OrderItems sẽ được phân vùng dựa trên khóa chính của Orders.
CREATE TABLE OrderItems (
OrderId INT64,
ItemId INT64,
Quantity INT64,
Price INT64,
CONSTRAINT pk_order_items PRIMARY KEY (OrderId, ItemId)
) INTERLEAVE IN PARENT Orders ON DELETE CASCADE
Cấu trúc INTERLEAVE IN PARENT ở trên đảm bảo khi xóa một đơn hàng (Orders), tất cả các chi tiết (OrderItems) liên quan cũng sẽ bị xóa theo (CASCADE). Đây là tính năng quan trọng của Spanner.
Để phân tích cách dữ liệu được phân vùng, hãy xem thông tin chi tiết của bảng con:
DESCRIBE OrderItems
Kết quả mong đợi: Trong phần mô tả, bạn sẽ thấy dòng Interleaved in table: Orders, xác nhận cấu trúc lồng ghép đã thành công.
Thử nghiệm truy vấn SQL cơ bản trên Spanner
Bây giờ khi schema đã sẵn sàng, hãy thực hiện các thao tác CRUD (Create, Read, Update, Delete) cơ bản để đảm bảo kết nối và logic hoạt động đúng.
Chèn dữ liệu mẫu vào bảng Users. Lưu ý: CURRENT_TIMESTAMP() là hàm đặc thù của Spanner để lấy thời gian đồng bộ toàn cầu.
INSERT INTO Users (UserId, Username, Email, CreatedAt, IsPremium, Tags)
VALUES (
1001,
'nguyen_van_a',
'a@example.com',
CURRENT_TIMESTAMP(),
TRUE,
['vip', 'early_adopter']
)
Chèn dữ liệu vào bảng cha Orders và bảng con OrderItems để test liên kết:
INSERT INTO Orders (OrderId, UserId, OrderDate, TotalAmount)
VALUES (5001, 1001, CURRENT_TIMESTAMP(), 500000);
INSERT INTO OrderItems (OrderId, ItemId, Quantity, Price)
VALUES (5001, 1, 2, 250000);
Thực hiện truy vấn SELECT để lấy dữ liệu người dùng cùng với tổng đơn hàng (JOIN ngầm định nhờ Interleave):
SELECT u.Username, u.Email, o.OrderId, o.TotalAmount
FROM Users u
JOIN Orders o ON u.UserId = o.UserId
WHERE u.UserId = 1001
Kết quả mong đợi: Trả về một hàng dữ liệu với thông tin nguyen_van_a, email, OrderId 5001 và số tiền 500000.
Cuối cùng, thực hiện cập nhật dữ liệu để test giao dịch (transaction) đơn giản:
UPDATE Users
SET IsPremium = FALSE
WHERE UserId = 1001
Verify lại kết quả sau khi cập nhật:
SELECT UserId, IsPremium FROM Users WHERE UserId = 1001
Kết quả mong đợi: Cột IsPremium trả về giá trị FALSE.
Điều hướng series:
Mục lục: Series: Triển khai Database NewSQL với Google Spanner và Ubuntu 24.04
« Phần 2: Triển khai Google Spanner Local (Dev/Emulator) trên Ubuntu
Phần 4: Tích hợp ứng dụng Go và Python với Google Spanner »