Cân bằng tải mạng có trọng số cho mỗi phiên bản

1. Giới thiệu

Bạn có thể định cấu hình một trình cân bằng tải mạng để phân phối lưu lượng truy cập trên các phiên bản phụ trợ của trình cân bằng tải dựa trên trọng số do một quy trình kiểm tra tình trạng HTTP báo cáo bằng cách sử dụng tính năng cân bằng tải theo trọng số.

Tính năng cân bằng tải có trọng số yêu cầu bạn định cấu hình cả hai mục sau:

  • Bạn phải đặt chính sách cân bằng tải cục bộ (localityLbPolicy) của dịch vụ phụ trợ thành WEIGHTED_MAGLEV.
  • Bạn phải định cấu hình dịch vụ phụ trợ bằng một chế độ kiểm tra tình trạng HTTP/HTTP2/HTTPS. Phản hồi kiểm tra tình trạng HTTP phải chứa một trường tiêu đề phản hồi HTTP tuỳ chỉnh X-Load-Balancing-Endpoint-Weight để chỉ định trọng số bằng các giá trị nguyên từ 0 đến 1000 ở dạng thập phân cho từng phiên bản phụ trợ.

Nếu bạn sử dụng cùng một nhóm thực thể làm hệ thống phụ trợ cho nhiều trình cân bằng tải mạng dựa trên dịch vụ phụ trợ bằng cách sử dụng tính năng cân bằng tải theo trọng số, thì bạn nên sử dụng một đường dẫn yêu cầu duy nhất cho mỗi quy trình kiểm tra tình trạng của dịch vụ phụ trợ. Để biết thêm thông tin, hãy xem phần Tiêu chí thành công cho các chế độ kiểm tra tình trạng của HTTP, HTTPS và HTTP/2.

Hoạt động kiểm tra tình trạng HTTP phải trả về phản hồi HTTP 200 (OK) để các hoạt động kiểm tra tình trạng hoạt động và phiên bản phụ trợ được coi là hoạt động bình thường. Trong trường hợp tất cả các phiên bản phụ trợ đều vượt qua quy trình kiểm tra tình trạng và trả về X-Load-Balancing-Endpoint-Weight với trọng số bằng 0, bộ cân bằng tải sẽ phân phối các kết nối mới giữa các phụ trợ hoạt động bình thường, coi chúng có trọng số bằng nhau. Trình cân bằng tải cũng có thể phân phối các kết nối mới giữa các máy chủ phụ không hoạt động. Để biết thêm thông tin, hãy xem bài viết Phân phối lưu lượng truy cập.

Để xem ví dụ về tính năng cân bằng tải có trọng số, hãy xem phần Lựa chọn phụ trợ và theo dõi kết nối.

Bạn có thể sử dụng tính năng cân bằng tải theo trọng số trong các trường hợp sau:

  • Nếu một số kết nối xử lý nhiều dữ liệu hơn các kết nối khác hoặc một số kết nối tồn tại lâu hơn các kết nối khác, thì việc phân phối tải phụ trợ có thể không đồng đều. Bằng cách báo hiệu trọng số thấp hơn cho mỗi phiên bản, một phiên bản có tải cao có thể giảm số lượng kết nối mới, trong khi vẫn tiếp tục phục vụ các kết nối hiện có.
  • Nếu một phần phụ trợ bị quá tải và việc chỉ định thêm các kết nối có thể làm gián đoạn các kết nối hiện có, thì phần phụ trợ đó sẽ tự chỉ định trọng số bằng 0. Bằng cách báo hiệu trọng số bằng 0, một phiên bản phụ trợ sẽ ngừng phục vụ các kết nối mới, nhưng vẫn tiếp tục phục vụ các kết nối hiện có.
  • Nếu một phần phụ trợ đang ngắt kết nối hiện có trước khi bảo trì, thì phần phụ trợ đó sẽ tự gán trọng số bằng 0. Bằng cách báo hiệu trọng số bằng 0, phiên bản phụ trợ sẽ ngừng phục vụ các kết nối mới, nhưng vẫn tiếp tục phục vụ các kết nối hiện có.

Kiến thức bạn sẽ học được

  • Cách định cấu hình trình cân bằng tải mạng để phân phối lưu lượng truy cập trên các phiên bản phụ trợ của trình cân bằng tải dựa trên trọng số do chế độ kiểm tra tình trạng HTTP báo cáo bằng cách sử dụng tính năng cân bằng tải theo trọng số.

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị cho những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án là giá trị duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên miền của riêng mình để xem tên miền đó có sẵn hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ giữ nguyên trong suốt thời gian diễn ra dự án.
  • Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh phát sinh phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá toàn bộ dự án. 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.

Khởi động Cloud Shell

Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Cloud.

Trên Bảng điều khiển Google Cloud, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ ở trên cùng bên phải:

55efc1aaa7a4d3ad.png

Quá trình này chỉ mất vài phút để cung cấp và kết nối với môi trường. Khi quá trình này kết thúc, bạn sẽ thấy như sau:

7ffe5cbb04455448.png

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện mọi thao tác trong lớp học lập trình này trong trình duyệt. Bạn không cần cài đặt bất cứ thứ gì.

2. Bắt đầu định cấu hình

Lớp học lập trình yêu cầu một dự án duy nhất.

Trong hướng dẫn này, bạn sẽ tạo một nhóm thực thể có 3 thực thể máy ảo và chỉ định trọng số cho từng thực thể. Bạn tạo một quy trình kiểm tra tình trạng HTTP để báo cáo trọng số của phiên bản phụ trợ. Trình cân bằng tải mạng có trọng số được bật trên dịch vụ phụ trợ với chính sách trình cân bằng tải theo vị trí là WEIGHTED_MAGLEV.

Trước khi bắt đầu

gcloud services enable compute.googleapis.com

Lưu ý: Bạn không thể sử dụng bảng điều khiển Google Cloud để định cấu hình chính sách bộ cân bằng tải theo vị trí và chỉ định trọng số cho các phiên bản máy ảo. Thay vào đó, hãy sử dụng Google Cloud CLI.

Tạo mạng VPC, mạng con và quy tắc tường lửa

Tạo một mạng VPC, mạng con và các quy tắc tường lửa cho phép lưu lượng vào để cho phép các kết nối đến các VM phụ trợ của trình cân bằng tải.

  1. Tạo một mạng VPC và mạng con. a. Để tạo mạng VPC, hãy chạy lệnh gcloud compute networks create :
gcloud compute networks create NETWORK_NAME --subnet-mode custom

b. Trong ví dụ này, dải địa chỉ IPv4 chính của mạng con là 10.10.0.0/24.

Để tạo mạng con, hãy chạy lệnh gcloud compute networks subnets create :

gcloud compute networks subnets create SUBNET_NAME \
  --network=NETWORK_NAME \
  --range=10.10.0.0/24 \
  --region=us-central1

Thay thế nội dung sau:

  • NETWORK_NAME: tên của mạng VPC cần tạo.
  • SUBNET_NAME: tên của mạng con cần tạo.
  1. Tạo một quy tắc tường lửa cho phép lưu lượng vào để cho phép các gói được gửi đến cổng TCP đích 80 và 443 được chuyển đến các VM phụ trợ. Trong ví dụ này, quy tắc tường lửa cho phép kết nối từ mọi địa chỉ IP nguồn. Quy tắc tường lửa áp dụng cho các máy ảo có thẻ mạng network-lb-tag. Để tạo quy tắc tường lửa, hãy chạy lệnh gcloud compute firewall-rules create:
gcloud compute firewall-rules create FIREWALL_RULE_NAME \
   --direction=INGRESS \
   --priority=1000 \
   --network=NETWORK_NAME \
   --action=ALLOW \
   --rules=tcp:80,tcp:443 \
   --source-ranges=0.0.0.0/0 \
   --target-tags=network-lb-tag

Thay thế FIREWALL_RULE_NAME bằng tên của quy tắc tường lửa cần tạo.

Tạo phiên bản máy ảo và chỉ định trọng số

Tạo 3 phiên bản máy ảo và chỉ định trọng số:

  1. Định cấu hình 3 phiên bản máy ảo phụ trợ để trả về trọng số trong tiêu đề X-Load-Balancing-Endpoint-Weight bằng các phản hồi HTTP. Trong hướng dẫn này, bạn sẽ định cấu hình một phiên bản phụ trợ để báo cáo trọng số bằng 0, phiên bản phụ trợ thứ hai để báo cáo trọng số bằng 100 và phiên bản phụ trợ thứ ba để báo cáo trọng số bằng 900. Để tạo các phiên bản, hãy chạy lệnh gcloud compute instances create:
gcloud compute instances create instance-0 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=0,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  vm_hostname="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/name)"
  echo "Page served from: $vm_hostname" | \
  tee /var/www/html/index.html
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-100 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=SUBNET_NAME \
  --metadata=load-balancing-weight=100,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  vm_hostname="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/name)"
  echo "Page served from: $vm_hostname" | \
  tee /var/www/html/index.html
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-900 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=900,startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    lb_weight="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
    echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
    tee /etc/apache2/conf-enabled/headers.conf
    systemctl restart apache2'

Tạo một nhóm phiên bản

Trong hướng dẫn này, bạn sẽ cung cấp hướng dẫn để tạo một nhóm phiên bản không được quản lý chứa cả 3 phiên bản VM(instance-0, instance-100, and instance-900).

gcloud compute instance-groups unmanaged create
INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \
  --zone=us-central1-a \
  --instances=instance-0,instance-100,instance-900

Thay thế INSTANCE_GROUP bằng tên của nhóm phiên bản cần tạo.

Tạo một quy trình kiểm tra tình trạng HTTP

Trong hướng dẫn này, bạn sẽ cung cấp hướng dẫn để tạo một quy trình kiểm tra tình trạng HTTP nhằm đọc phản hồi HTTP chứa trọng số của VM phụ trợ."

gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

Thay thế HTTP_HEALTH_CHECK_NAME bằng tên của chế độ kiểm tra tình trạng HTTP cần tạo.

Tạo dịch vụ phụ trợ

Ví dụ sau đây cung cấp hướng dẫn tạo một dịch vụ phụ trợ bên ngoài theo khu vực được định cấu hình để sử dụng tính năng cân bằng tải theo trọng số.

  1. Tạo một dịch vụ phụ trợ bằng chế độ kiểm tra tình trạng HTTP và đặt chính sách cân bằng tải theo vị trí thành WEIGHTED_MAGLEV.
gcloud compute backend-services create BACKEND_SERVICE_NAME \
  --load-balancing-scheme=external \
  --protocol=tcp \
  --region=us-central1 \
  --health-checks=HTTP_HEALTH_CHECK_NAME \
  --health-checks-region=us-central1 \
  --locality-lb-policy=WEIGHTED_MAGLEV
  • Thay thế BACKEND_SERVICE_NAME bằng tên của dịch vụ phụ trợ cần tạo.
  1. Thêm nhóm phiên bản vào dịch vụ phụ trợ.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. Dành riêng một địa chỉ IP bên ngoài theo khu vực cho trình cân bằng tải.
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

Thay thế ADDRESS_NAME bằng tên của địa chỉ IP cần tạo. Sử dụng lệnh compute addresses describe để xem kết quả. Ghi lại địa chỉ IP bên ngoài tĩnh được đặt trước ("IP_ADDRESS'").

gcloud compute addresses describe ADDRESS_NAME
  1. Tạo một quy tắc chuyển tiếp bằng địa chỉ IP bên ngoài theo khu vực được dành riêng "IP_ADDRESS". Kết nối quy tắc chuyển tiếp với dịch vụ phụ trợ.
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • Thay thế nội dung sau: FORWARDING_RULE: tên của quy tắc chuyển tiếp cần tạo. IP_ADDRESS: địa chỉ IP cần chỉ định cho phiên bản. Sử dụng địa chỉ IP tĩnh bên ngoài đã đặt trước, chứ không phải tên địa chỉ.

Xác minh trọng số phụ trợ bằng API dịch vụ phụ trợ

Xác minh rằng trọng số phụ trợ được báo cáo đúng cách cho quy trình kiểm tra tình trạng HTTP.

gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

Kết quả đầu ra sẽ có dạng như sau:

backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name}
status:
  healthStatus:
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0
    ipAddress: 10.10.0.5
    port: 80
    weight: '0'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100
    ipAddress: 10.10.0.6
    port: 80
    weight: '100'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900
    ipAddress: 10.10.0.7
    port: 80
    weight: '900'
  kind: compute#backendServiceGroupHealth