Giới thiệu về Thông tin chi tiết về truy vấn dành cho Cloud SQL

1. Trước khi bắt đầu

Thông tin chi tiết về truy vấn dành cho Cloud SQL giúp bạn phát hiện, chẩn đoán và ngăn chặn các vấn đề về hiệu suất truy vấn đối với cơ sở dữ liệu Cloud SQL. Tính năng này cung cấp khả năng tự phục vụ, giám sát trực quan và thông tin chẩn đoán vượt ngoài phạm vi phát hiện để giúp bạn xác định nguyên nhân gốc của vấn đề về hiệu suất.

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách thiết lập một Cloud SQL cho thực thể PostgreSQL, triển khai một ứng dụng Node.js để dùng thực thể Cloud SQL làm bộ nhớ phụ trợ, sau đó dùng tính năng Thông tin chi tiết về truy vấn để xem và giám sát truy vấn.

Điều kiện tiên quyết

  • Quen thuộc cơ bản với các công cụ và ngôn ngữ lập trình Node.js

Bạn sẽ thực hiện

  • Sử dụng Cloud SQL trong ứng dụng Node.js.
  • Bật Trình nhận xét SQL trong ứng dụng Node.js.
  • Sử dụng tính năng Thông tin chi tiết về truy vấn cho Cloud SQL để theo dõi và kiểm tra hiệu suất của truy vấn.

Bạn cần có

  • Một tài khoản Google Cloud trong đó bạn có quyền bật các API và tạo dịch vụ

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.)

Ghi nhớ mã dự án của dự án bạn đang sử dụng. Lớp này sẽ được đề cập sau trong lớp học lập trình này là PROJECT-ID.

  1. Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.

Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp và tìm hiểu thêm" , hướng dẫn này sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell.

kích hoạt lớp vỏ đám mây

Nếu trước đây chưa từng khởi động Cloud Shell, bạn sẽ được trình bày một màn hình trung gian (dưới màn hình đầu tiên) mô tả về ứng dụng này. Nếu trường hợp đó xảy ra, hãy nhấp vào Tiếp tục (và bạn sẽ không thấy thông báo đó nữa). Màn hình một lần đó sẽ có dạng như sau:

cửa sổ hộp thoại vỏ đám mây

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

thiết bị đầu cuối dạng vỏ đám mây

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đang sử dụng đúng dự án:

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án đã được đặt thành mã dự án.

Chạy lệnh sau để xác nhận rằng bạn đang sử dụng đúng dự án.

gcloud config list project

Nếu muốn sử dụng một dự án khác với dự án bạn đã chọn khi mở Cloud Shell, bạn có thể thiết lập một dự án mới bằng cách chạy:

gcloud config set project <PROJECT-ID>;

3. Thiết lập một Cloud SQL cho thực thể PostgreSQL khi bật tính năng Thông tin chi tiết về truy vấn

  1. Sau khi Cloud Shell ra mắt, bạn có thể sử dụng dòng lệnh để tạo một phiên bản Cloud SQL mới có tên là my-instance khi bật tính năng Thông tin chi tiết về truy vấn:
gcloud sql instances create my-instance --tier db-f1-micro --database-version=POSTGRES_12 --region=us-central --root-password=<PASSWORD> --insights-config-query-insights-enabled --insights-config-record-application-tags --insights-config-record-client-address

Dưới đây là nội dung giải thích ngắn gọn về cờ và ý nghĩa của cờ:

  • Cờ --tier db-f1-micro đang chỉ định một loại máy có tài nguyên tối thiểu, vì việc này dành cho mục đích phát triển và bạn không cần nhiều tài nguyên cho lớp học lập trình này. Bạn có thể tìm hiểu thêm về bậc tại đây.
  • Cờ --database-version=POSTGRES_12 tạo một thực thể là PostgreSQL phiên bản 12.
  • Cờ --region=us-central chỉ định khu vực nơi thực thể sẽ được tạo.
  • Cờ --root-password=<PASSWORD> cho phép bạn chỉ định mật khẩu cho người dùng postgres gốc. Hãy nhớ thay thế <Password> bằng mật khẩu bạn chọn.
  • Cờ --insights-config-query-insights-enabled bật Thông tin chi tiết về truy vấn trên phiên bản của bạn.
  • Cờ --insights-config-record-application-tags cho phép ghi lại các thẻ ứng dụng. Bạn sẽ tìm hiểu thêm về thẻ ứng dụng trong các phần sau.
  • Cờ --insights-config-record-client-address cho phép tính năng Thông tin chi tiết về truy vấn ghi lại địa chỉ IP của ứng dụng khách.

Bạn có thể được nhắc bật API sqladmin.googleapis.com cho dự án của mình. Nếu được nhắc, hãy chọn y để bật API này.

Quá trình tạo phiên bản sẽ mất vài phút. Sau khi thao tác này hoàn tất, thực thể của bạn sẽ sẵn sàng để sử dụng.

  1. Bây giờ, hãy tạo cơ sở dữ liệu mà bạn sẽ sử dụng cho ứng dụng mẫu:
gcloud sql databases create votesdb --instance my-instance

Bạn cũng có thể truy cập và định cấu hình phiên bản này thông qua Bảng điều khiển Cloud.

  1. Lấy tên kết nối thực thể máy ảo ở định dạng PROJECT-ID:ZONE-ID:INSTANCE-ID bằng cách chạy lệnh sau. Bạn sẽ sử dụng mã này sau khi định cấu hình ứng dụng Node.js.
gcloud sql instances describe my-instance | grep connectionName

4. Tạo một tài khoản dịch vụ để dùng với ứng dụng

Tài khoản dịch vụ được dùng để cấp quyền sử dụng các dịch vụ khác nhau trong dự án GCP của bạn. Đối với lớp học lập trình này, bạn cần có một mã để cấp quyền Proxy Cloud SQL nhằm kết nối với thực thể Cloud SQL.

Tạo tài khoản dịch vụ trong Console

  1. Truy cập vào trang tài khoản dịch vụ IAM rồi nhấp vào nút -PCvKR3aQ2zKaUcml8w9lW4JNlmYtN5-r2--mC6kMUp6HOXW8wT1wUvLoYEPU-aA-oGskT3XkAqfNwRAKkZkllwTe6ugdrUVFwaeKT0M9Y1RwHA8JPZeGmCWYBfr8d9TSycNMIRsLw ở đầu trang.
  2. Đặt tên và mã nhận dạng duy nhất cho tài khoản dịch vụ của bạn, rồi nhấp vào TẠO.
  3. Trên trang tiếp theo, hãy nhấp vào trình đơn thả xuống để chọn vai trò. Bộ lọc cho "Cloud SQL" rồi chọn vai trò Ứng dụng Cloud SQL. Nhấp vào TIẾP TỤC rồi nhấp vào XONG.
  4. Sau khi tạo tài khoản dịch vụ, hãy nhấp vào biểu tượng ba dấu chấm trong mục Thao tác cho tài khoản dịch vụ mới rồi chọn Quản lý khoá. Trên trang tiếp theo, hãy chọn THÊM KHOÁ rồi chọn Tạo khoá mới. JSON sẽ được chọn; giữ nguyên giá trị mặc định đó, rồi nhấp vào TẠO. Thao tác này sẽ tải tệp khoá riêng tư .json xuống. Nhấp vào ĐÓNG.
  5. Trong Cloud Shell, hãy nhấp vào biểu tượng ba dấu chấm của trình đơn Khác rồi chọn Tải tệp lên. Duyệt qua tệp .json mà bạn đã tải xuống máy cục bộ rồi chọn tệp đó. Thao tác này sẽ tải tệp .json lên thư mục gốc của bạn trong Cloud Shell.

5. Cài đặt và chạy Cloud SQL Proxy

Bạn sẽ dùng Proxy Cloud SQL để giao tiếp giữa ứng dụng và thực thể cơ sở dữ liệu.

  1. Tải proxy Cloud SQL xuống. Trong Cloud Shell, bạn có thể chạy:
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy
  1. Chạy proxy như sau sau khi thay thế <INSTANCE_CONNECTION_NAME> bằng tên kết nối thực thể mà bạn đã sao chép trên trang Tổng quan về phiên bản Cloud SQL.
./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432 &

Nếu thành công, bạn sẽ thấy một vài dòng đầu ra, kết thúc bằng thông báo Ready for new connections.

6. Sao chép và kiểm thử ứng dụng trên máy

  1. Sao chép kho lưu trữ cho ứng dụng mẫu và cài đặt các gói cần thiết để chạy ứng dụng.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples/

cd nodejs-docs-samples/cloud-sql/postgres/knex

npm install
  1. Thiết lập các biến môi trường sau:
export INSTANCE_CONNECTION_NAME='<PROJECT-ID>:<ZONE-ID>:<INSTANCE-ID>'
export DB_HOST='127.0.0.1:5432'
export DB_USER='postgres'
export DB_PASS='<PASSWORD>'
export DB_NAME='votesdb'
  1. Khởi động ứng dụng mẫu.
npm start
  1. Nhấp vào biểu tượng Xem trước trên webbiểu tượng xem trước trên web trong Cloud Shell, sau đó chọn Xem trước trên cổng 8080.

Xem trước mục trong trình đơn cổng 8080

Bạn sẽ thấy ứng dụng bỏ phiếu Tab và Không gian hiển thị dưới đây trong trình duyệt của mình:

Ảnh chụp màn hình ứng dụng bỏ phiếu Không gian và thẻ

  1. Nhấp vào các nút để thực hiện một số phiếu bầu và lưu một số dữ liệu vào cơ sở dữ liệu.

7. Thêm trang để xem tất cả phiếu bầu

Vì đơn đăng ký mẫu này rất đơn giản, bạn sẽ thêm một trang bổ sung hiển thị tất cả phiếu bầu. Lý do chính cho việc này là để bạn có thêm dữ liệu để xem xét khi sử dụng Thông tin chi tiết về truy vấn sau này.

  1. Nhập Ctrl+c vào Cloud Shell để dừng ứng dụng mẫu.
  2. Trong Cloud Shell, hãy nhấp vào nút Nút Mở Trình chỉnh sửa để chạy Trình chỉnh sửa Cloud Shell.
  3. Trong trình khám phá tệp, hãy tìm nodejs-docs-samples/cloud-sql/postgres/knex/server.js rồi nhấp vào tệp đó để tải tệp server.js trong trình chỉnh sửa.

Thêm mã sau đây sau vị trí định nghĩa hàm getVotes:

/**
 * Retrieve all vote records from the database.
 *
 * @param {object} pool The Knex connection object.
 * @returns {Promise}
 */
const getAllVotes = async pool => {
  return await pool
    .select('candidate', 'time_cast')
    .from('votes')
    .orderBy('time_cast', 'desc');
};
  1. Thêm mã sau cho tuyến '/getAllVotes' ở bên dưới, nơi xác định các tuyến khác:
app.get('/getAllVotes', async (req, res) => {
  pool = pool || createPool();
  try {
    // Query all votes from the database.
    const votes = await getAllVotes(pool);

    res.render('allvotes.pug', {
      votes: votes,
    });
  } catch (err) {
    console.error(err);
    res
      .status(500)
      .send('Unable to load page; see logs for more details.')
      .end();
  }
});
  1. Tạo một tệp mới trong thư mục nodejs-docs-samples/cloud-sql/postgres/knex/views có tên là allvotes.pug. Dán mã sau:
doctype html
html(lang="en")
  head
    title Tabs VS Spaces

    link(rel="stylesheet", href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css")
    link(rel="stylesheet", href="https://fonts.googleapis.com/icon?family=Material+Icons")
    script(src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js")
  body

    nav(class="red lighten-1")
      div(class="nav-wrapper")
        a(href="#" class="brand-logo center") Tabs VS Spaces

    div(class="section")

      h4(class="header center") Recent Votes
      ul(class="container collection center")
        each vote in votes
          li(class="collection-item avatar")
            if vote.candidate.trim() === 'TABS'
              i(class="material-icons circle green") keyboard_tab
            else
              i(class="material-icons circle blue") space_bar
            span(class="title") A vote for <b>#{vote.candidate}</b>
            p was cast at #{vote.time_cast}.
  1. Nhấp vào nút Nút Mở cửa sổ dòng lệnh để quay lại Cloud Shell và chạy:
npm start
  1. Mở ứng dụng từ Bản xem trước trên web để đảm bảo ứng dụng đang hoạt động. Thêm /getAllVotes vào URL trong trình duyệt để xem trang mới bạn đã thêm.

8. Bật Trình nhận xét SQL trong ứng dụng

Bây giờ, bạn sẽ cài đặt và bật Trình chú thích SQL, một thư viện nguồn mở cho phép ORM tăng cường câu lệnh SQL có nhận xét trước khi thực thi. SQLcommenter hỗ trợ một số ORM và khung, bao gồm cả khung và khung mà ứng dụng mẫu sử dụng: Knex.js. Truy vấn Insights sử dụng thông tin trong các nhận xét này để cung cấp chế độ xem tập trung vào ứng dụng về hiệu suất của cơ sở dữ liệu và xác định mã xử lý ứng dụng nào đang gây ra sự cố. Chi phí hiệu suất dự kiến sẽ nhỏ. Xem tài liệu Thông tin chi tiết về truy vấn.

  1. Nhập Ctrl+c vào Cloud Shell để dừng ứng dụng mẫu.
  2. Chạy lệnh sau để cài đặt các gói mà SQLcommenter cần:
  npm install @google-cloud/sqlcommenter-knex @opencensus/nodejs @opencensus/propagation-tracecontext @opentelemetry/api @opentelemetry/core --save
  1. Trong Cloud Shell, hãy nhấp vào nút Nút Mở Trình chỉnh sửa để chạy Trình chỉnh sửa Cloud Shell.
  2. Trong trình khám phá tệp, hãy tìm nodejs-docs-samples/cloud-sql/postgres/knex/server.js rồi nhấp vào tệp đó để tải tệp server.js trong trình chỉnh sửa.
  3. Tìm mã này trong tệp:
const process = require('process');

Bên dưới thẻ đó, hãy thêm mã sau:

const {wrapMainKnexAsMiddleware} = require('@google-cloud/sqlcommenter-knex');
  1. Tìm mã này trong tệp:
// Set Content-Type for all responses for these routes.
app.use((req, res, next) => {
  res.set('Content-Type', 'text/html');
  next();
});

Bên dưới thẻ đó, hãy thêm mã sau:

app.use(wrapMainKnexAsMiddleware(Knex, {
    traceparent: true,
    tracestate: true,
    route: true,
    db_driver: true
}));

Sau khi hoàn tất thao tác này, mã của bạn sẽ có dạng như sau:

...
// Require process, so we can mock environment variables.
const process = require('process');

const {wrapMainKnexAsMiddleware} = require('@google-cloud/sqlcommenter-knex');
const express = require('express');
const Knex = require('knex');
const fs = require('fs');

const app = express();
app.set('view engine', 'pug');
app.enable('trust proxy');

// Automatically parse request body as form data.
app.use(express.urlencoded({extended: false}));
// This middleware is available in Express v4.16.0 onwards
app.use(express.json());

// Set Content-Type for all responses for these routes.
app.use((req, res, next) => {
  res.set('Content-Type', 'text/html');
  next();
});

app.use(wrapMainKnexAsMiddleware(Knex, {
    traceparent: true,
    tracestate: true,
    route: true,
    db_driver: true
}));
...
  1. Nhấp vào nút Nút Mở cửa sổ dòng lệnh để quay lại Cloud Shell và chạy:
npm start
  1. Trong ứng dụng Thẻ và Không gian, hãy nhấp vào các nút để bỏ thêm vài phiếu bầu nhằm thêm dữ liệu khác vào cơ sở dữ liệu.

9. Sử dụng Thông tin chi tiết để xem hiệu suất truy vấn và theo dõi toàn diện

Trang tổng quan Thông tin chi tiết về truy vấn giúp bạn khắc phục sự cố cho các truy vấn Cloud SQL để tìm các vấn đề về hiệu suất. Để truy cập vào Thông tin chi tiết, hãy chọn Thông tin chi tiết về truy vấn trong bảng điều hướng bên trái cho phiên bản Cloud SQL.

Tải cơ sở dữ liệu – biểu đồ tất cả truy vấn

Trang tổng quan Thông tin chi tiết về truy vấn ở cấp cao nhất hiển thị biểu đồ Tải cơ sở dữ liệu – tất cả truy vấn.

Biểu đồ Tất cả cụm từ tìm kiếm

Biểu đồ này chứa thông tin về Dung lượng CPU, thời gian chờ CPU và CPU, thời gian chờ IO và thời gian chờ khoá. Bạn có thể tìm hiểu thêm về ý nghĩa của các chỉ số này, nơi lưu trữ chỉ số và xem một số ví dụ về hình thức của biểu đồ đối với các truy vấn có vấn đề trong tài liệu này. Trong trường hợp ứng dụng mẫu này, tải truy vấn cơ sở dữ liệu thấp, do đó không có bất kỳ mức tăng đột biến nào trên biểu đồ.

Những cụm từ tìm kiếm nào gây ra tải nhiều nhất?

Bên dưới biểu đồ, bạn sẽ tìm thấy bảng TÌM KIẾM chứa các truy vấn đã chuẩn hóa trong khoảng thời gian bạn đã chọn. Các truy vấn trong bảng được sắp xếp theo tổng thời gian thực thi.

Bảng Cụm từ tìm kiếm hàng đầu

Bạn có thể nhấp vào từng truy vấn để xem thông tin chi tiết về truy vấn, chẳng hạn như tải cơ sở dữ liệu cho truy vấn cụ thể này, độ trễ truy vấn, mẫu kế hoạch truy vấn và những người dùng hàng đầu. Nếu ứng dụng được tạo bằng ORM, như trong trường hợp ứng dụng mẫu, thì bạn có thể không biết phần nào của ứng dụng chịu trách nhiệm cho truy vấn nào. Phần Thẻ hàng đầu có thể giúp bạn xác định điều đó.

Tải truy vấn bắt nguồn từ đâu trong ứng dụng?

Chuyển từ bảng TÌM KIẾM sang bảng TAGS để xem danh sách các truy vấn được gắn thẻ theo logic nghiệp vụ, mang lại cho bạn chế độ xem tập trung hơn vào ứng dụng.

Bảng Thẻ hàng đầu

Trong bảng TAGS, bạn có thể thấy hoạt động tải cơ sở dữ liệu được chia nhỏ theo tuyến đường đã tạo ra tải. Trong ảnh chụp màn hình ở trên, bạn có thể thấy rằng tuyến '/getAllVotes' có thời gian thực thi trung bình cao hơn và trung bình có nhiều hàng được trả về hơn. Mặc dù thời gian thực thi mà chúng ta thấy trong bảng không gặp vấn đề trong trường hợp này, nhưng hãy nhấp vào hàng cho '/getAllVotes' để xem dữ liệu kỹ hơn.

Tại sao các truy vấn lại chạy chậm?

Nhấp vào dấu chấm trong biểu đồ Mẫu kế hoạch truy vấn để xem kế hoạch truy vấn.

Kế hoạch truy vấn mẫu

Kế hoạch truy vấn cho thấy cách PostgreSQL thực thi một truy vấn trong các bản trình bày, giúp bạn dễ dàng xác định xem có thao tác nào làm chậm tiến trình hay không.

Mã xử lý ứng dụng nào đang góp phần làm chậm tốc độ?

Thông tin chi tiết về truy vấn cũng cung cấp hình ảnh theo ngữ cảnh của hoạt động theo dõi toàn diện, có thể hữu ích để điều tra thêm về phần nào của ứng dụng đang tạo truy vấn chậm.

Nhấp vào thẻ KẾT THÚC ĐẾN KẾT THÚC để xem dấu vết theo ngữ cảnh.

Theo dõi từ đầu đến cuối

10. Dọn dẹp và tìm hiểu thêm

Bạn đã tìm hiểu cách sử dụng tính năng Thông tin chi tiết về truy vấn để theo dõi và kiểm tra hiệu suất của truy vấn bằng ứng dụng Node.js và cơ sở dữ liệu Cloud SQL PostgreSQL!

Dọn dẹp

Nếu không muốn tiếp tục chạy thực thể Cloud SQL, bạn có thể xoá ngay.

gcloud sql instances delete my-instance

Tìm hiểu thêm