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 trình cân bằng tải mạng để phân phối lưu lượng truy cập giữa các thực thể phụ trợ của trình cân bằng tải đó dựa trên các trọng số trong quy trình kiểm tra tình trạng HTTP bằng cách sử dụng tính năng cân bằng tải có trọng số.

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

  • Bạn phải đặt chính sách trình 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 tính năng 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 trường tiêu đề phản hồi HTTP tuỳ chỉnh X-Load-Balancing-Endpoint-Weight để chỉ định các trọng số có giá trị số nguyên từ 0 đến 1000 dưới dạng biểu diễn thập phân cho từng phiên bản phụ trợ.

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

Quy trình kiểm tra tình trạng HTTP sẽ trả về phản hồi HTTP 200 (OK) để các yêu cầu kiểm tra tình trạng đạt và phiên bản phụ trợ được coi là có hoạt động tốt. Trong trường hợp tất cả thực thể phụ trợ vượt qua quy trình kiểm tra tình trạng và trả về X-Load-Balancing-Endpoint-Weight có trọng số bằng 0, trình cân bằng tải sẽ phân phối các kết nối mới giữa các phần phụ trợ lành mạnh, xử lý 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 phần phụ trợ không ổn định. Để biết thêm thông tin, hãy xem bài viết Phân bổ lưu lượng truy cập.

Để biết ví dụ về cân bằng tải có trọng số, hãy xem bài viết Lựa chọn phầ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 có 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 hoạt động lâu hơn các kết nối khác, việc phân phối tải phụ trợ có thể không đồng đều. Bằng cách ra tín hiệu trọng số thấp hơn cho mỗi phiên bản, phiên bản có tải cao có thể giảm tỷ lệ kết nối mới, trong khi vẫn tiếp tục phân phối 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 nhiều kết nối có thể phá vỡ các kết nối hiện có, thì các 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, một thực thể phụ trợ sẽ ngừng phân phối 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 loại bỏ các kết nối hiện có trước khi bảo trì, thì phần phụ trợ đó sẽ chỉ định trọng số bằng 0 cho chính nó. Bằng cách báo hiệu trọng số bằng 0, thực thể phụ trợ sẽ ngừng phân phối 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 giữa các thực thể phụ trợ của trình cân bằng tải dựa trên các trọng số trong quy trình kiểm tra tình trạng HTTP bằng cách sử dụng tính năng cân bằng tải có trọng số.

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

  1. Đăng nhập vào Google 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

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

55efc1aaa7a4d3ad.pngS

Sẽ chỉ mất một chút thời gian để cấp phép và kết nối với môi trường. Sau khi hoàn tất, bạn sẽ thấy như sau:

7ffe5cbb04455448.pngS

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Phiên bản này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên 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. Bạn có thể thực hiện mọi công việ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 gì cả.

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

Lớp học lập trình này chỉ 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 sẽ tạo một quy trình kiểm tra tình trạng HTTP để báo cáo trọng số của thực thể phụ trợ. Trình cân bằng tải mạng có trọng số được bật trong dịch vụ phụ trợ với chính sách về trình cân bằng tải cục bộ 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 trình cân bằng tải cho địa phương và chỉ định trọng số cho các thực thể 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 về tường lửa

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

  1. Tạo 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ế đoạn mã sau:

  • NETWORK_NAME: tên của mạng VPC cần tạo.
  • SUBNET_NAME: tên của mạng phụ cần tạo.
  1. Tạo quy tắc cho phép tường lửa vào để cho phép các gói được gửi tới cổng TCP 80 và 443 đích được phân phối đến các máy ảo 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 để tạo.

Tạo thực thể máy ảo và chỉ định trọng số

Tạo 3 thực thể máy ảo và chỉ định trọng số:

  1. Định cấu hình 3 thực thể máy ảo phụ trợ để trả về trọng số trong tiêu đề X-Load-Balancing-Endpoint-Weight với 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, một phiên bản phụ trợ thứ hai để báo cáo trọng số là 100 và một phiên bản phụ trợ thứ ba để báo cáo trọng số là 900. Để tạo các thực thể, 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 thực thể

Trong hướng dẫn này, bạn sẽ hướng dẫn cách tạo một nhóm thực thể không được quản lý chứa cả 3 thực thể máy ảo(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 thực thể cần tạo.

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

Trong hướng dẫn này, bạn sẽ được hướng dẫn cách tạo quy trình kiểm tra tình trạng HTTP để đọc phản hồi HTTP chứa trọng số của máy ảo 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 yêu cầu 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 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 có trọng số.

  1. Tạo một dịch vụ phụ trợ có tính năng kiểm tra tình trạng HTTP và đặt chính sách trình cân bằng tải tại địa phương 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 thực thể 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. Đặt trước đị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 dành riêng ("IP_ADDRESS').

gcloud compute addresses describe ADDRESS_NAME
  1. Tạo quy tắc chuyển tiếp bằng cách sử dụng địa chỉ IP bên ngoài theo khu vự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 để gán cho thực thể. Sử dụng địa chỉ IP tĩnh dành riêng cho bên ngoài, chứ không phải tên địa chỉ.

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

Xác minh rằng các trọng số phụ trợ được báo cáo chính xác 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