موازنه بار شبکه با وزن هر نمونه

۱. مقدمه

شما می‌توانید یک متعادل‌کننده بار شبکه را طوری پیکربندی کنید که ترافیک را در سراسر نمونه‌های backend متعادل‌کننده بار بر اساس وزن‌های گزارش‌شده توسط بررسی سلامت HTTP با استفاده از متعادل‌کننده بار وزن‌دار، توزیع کند.

متعادل‌سازی بار وزنی مستلزم پیکربندی هر دو مورد زیر است:

  • شما باید سیاست متعادل‌کننده بار محلی (localityLbPolicy) سرویس backend را روی WEIGHTED_MAGLEV تنظیم کنید.
  • شما باید سرویس backend را با بررسی سلامت HTTP/HTTP2/HTTPS پیکربندی کنید. پاسخ‌های بررسی سلامت HTTP باید حاوی یک فیلد هدر پاسخ HTTP سفارشی X-Load-Balancing-Endpoint-Weight باشند تا وزن‌ها را با مقادیر صحیح از 0 تا 1000 در نمایش اعشاری برای هر نمونه backend مشخص کنند.

اگر از یک گروه نمونه یکسان به عنوان backend برای چندین متعادل‌کننده بار شبکه مبتنی بر سرویس backend با استفاده از تعادل بار وزنی استفاده می‌کنید، توصیه می‌شود از یک مسیر درخواست منحصر به فرد برای هر بررسی سلامت سرویس backend استفاده کنید. برای اطلاعات بیشتر، به معیارهای موفقیت برای بررسی‌های سلامت HTTP، HTTPS و HTTP/2 مراجعه کنید.

بررسی سلامت HTTP باید یک پاسخ HTTP 200 (OK) برگرداند تا بررسی‌های سلامت با موفقیت انجام شوند و نمونه backend به عنوان سالم در نظر گرفته شود. در شرایطی که همه نمونه‌های backend بررسی‌های سلامت خود را با موفقیت پشت سر بگذارند و X-Load-Balancing-Endpoint-Weight را با وزن صفر برگردانند، متعادل‌کننده بار، اتصالات جدید را بین backendهای سالم توزیع می‌کند و با آنها با وزن برابر رفتار می‌کند. متعادل‌کننده بار همچنین می‌تواند اتصالات جدید را بین backendهای ناسالم توزیع کند. برای اطلاعات بیشتر، به توزیع ترافیک مراجعه کنید.

برای مثال‌هایی از متعادل‌سازی بار وزنی، به انتخاب Backend و ردیابی اتصال مراجعه کنید.

تعادل بار وزنی می‌تواند در سناریوهای زیر استفاده شود:

  • اگر برخی از اتصالات داده‌های بیشتری نسبت به سایرین پردازش کنند، یا برخی از اتصالات بیشتر از سایرین عمر کنند، توزیع بار backend ممکن است ناهموار شود. با سیگنال‌دهی وزن کمتر به ازای هر نمونه، یک نمونه با بار بالا می‌تواند سهم خود را از اتصالات جدید کاهش دهد، در حالی که به سرویس‌دهی به اتصالات موجود ادامه می‌دهد.
  • اگر یک backend بیش از حد بارگذاری شده باشد و اختصاص اتصالات بیشتر ممکن است اتصالات موجود را از بین ببرد، چنین backendهایی وزن صفر را به خود اختصاص می‌دهند. با علامت دادن وزن صفر، یک نمونه backend سرویس‌دهی به اتصالات جدید را متوقف می‌کند، اما به سرویس‌دهی به اتصالات موجود ادامه می‌دهد.
  • اگر یک backend قبل از تعمیر و نگهداری، اتصالات موجود را تخلیه کند، وزن صفر را به خود اختصاص می‌دهد. با علامت دادن وزن صفر، نمونه backend سرویس‌دهی به اتصالات جدید را متوقف می‌کند، اما به سرویس‌دهی به اتصالات موجود ادامه می‌دهد.

آنچه یاد خواهید گرفت

  • نحوه پیکربندی یک متعادل‌کننده بار شبکه برای توزیع ترافیک در نمونه‌های backend متعادل‌کننده بار بر اساس وزن‌های گزارش شده توسط بررسی سلامت HTTP با استفاده از متعادل‌کننده بار وزنی.

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (که معمولاً با عنوان PROJECT_ID شناخته می‌شود). اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی خواهد ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، می‌توانید منابعی را که ایجاد کرده‌اید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

از کنسول گوگل کلود ، روی آیکون Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

55efc1aaa7a4d3ad.png

آماده‌سازی و اتصال به محیط فقط چند لحظه طول می‌کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه‌ای که نیاز دارید، مجهز شده است. این ماشین مجازی یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و روی فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. تمام کارهای شما در این آزمایشگاه کد را می‌توان در یک مرورگر انجام داد. نیازی به نصب چیزی ندارید.

۲. شروع پیکربندی

Codelab به یک پروژه واحد نیاز دارد.

در این آموزش، شما یک گروه نمونه با سه نمونه ماشین مجازی ایجاد می‌کنید و برای هر نمونه وزن تعیین می‌کنید. شما یک بررسی سلامت HTTP برای گزارش وزن نمونه‌های backend ایجاد می‌کنید. متعادل‌کننده بار شبکه وزن‌دار در سرویس backend با سیاست متعادل‌کننده بار محلی به عنوان WEIGHTED_MAGLEV فعال می‌شود.

قبل از اینکه شروع کنی

gcloud services enable compute.googleapis.com

توجه: شما نمی‌توانید از کنسول Google Cloud برای پیکربندی سیاست متعادل‌کننده بار محلی و اختصاص وزن به نمونه‌های ماشین مجازی استفاده کنید. در عوض از رابط خط فرمان Google Cloud استفاده کنید.

ایجاد قوانین شبکه، زیرشبکه‌ها و فایروال VPC

یک شبکه، زیرشبکه و قوانین فایروال برای دسترسی VPC ایجاد کنید تا امکان اتصال به ماشین‌های مجازی backend متعادل‌کننده بار شما فراهم شود.

  1. یک شبکه و زیرشبکه VPC ایجاد کنید. الف) برای ایجاد شبکه VPC، دستور gcloud compute networks create اجرا کنید :
gcloud compute networks create NETWORK_NAME --subnet-mode custom

ب. در این مثال، محدوده آدرس IPv4 اصلی زیرشبکه 10.10.0.0/24 است.

برای ایجاد زیرشبکه، دستور gcloud compute networks subnets create اجرا کنید:

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

موارد زیر را جایگزین کنید:

  • NETWORK_NAME : نام شبکه VPC که قرار است ایجاد شود.
  • SUBNET_NAME : نام زیرشبکه‌ای که قرار است ایجاد شود.
  1. یک قانون فایروال با عنوان ingress allow ایجاد کنید تا بسته‌های ارسالی به پورت‌های TCP مقصد ۸۰ و ۴۴۳ به ماشین‌های مجازی backend تحویل داده شوند. در این مثال، قانون فایروال اجازه اتصال از هر آدرس IP منبع را می‌دهد. این قانون فایروال برای ماشین‌های مجازی با برچسب شبکه network-lb-tag اعمال می‌شود. برای ایجاد قانون فایروال، دستور 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

به جای FIREWALL_RULE_NAME نام قانون فایروالی که می‌خواهید ایجاد کنید را قرار دهید.

ایجاد نمونه‌های ماشین مجازی و اختصاص وزن به آنها

سه نمونه ماشین مجازی ایجاد کنید و به آنها وزن اختصاص دهید:

  1. سه نمونه ماشین مجازی بک‌اند را طوری پیکربندی کنید که وزن‌های موجود در هدر X-Load-Balancing-Endpoint-Weight را با پاسخ‌های HTTP برگردانند. برای این آموزش، یک نمونه بک‌اند را طوری پیکربندی می‌کنید که وزن صفر، نمونه بک‌اند دوم را طوری پیکربندی کنید که وزن ۱۰۰ و نمونه بک‌اند سوم را طوری پیکربندی کنید که وزن ۹۰۰ را گزارش دهد. برای ایجاد نمونه‌ها، دستور 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'

ایجاد یک گروه نمونه

در این آموزش، شما دستورالعمل‌هایی برای ایجاد یک گروه نمونه مدیریت نشده شامل هر سه نمونه ماشین مجازی ( 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

به جای INSTANCE_GROUP نام گروه نمونه‌ای که می‌خواهید ایجاد کنید را قرار دهید.

ایجاد یک بررسی سلامت HTTP

در این آموزش، شما دستورالعمل‌هایی برای ایجاد یک بررسی سلامت HTTP ارائه می‌دهید تا پاسخ HTTP حاوی وزن ماشین مجازی backend را بخواند.

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

به جای HTTP_HEALTH_CHECK_NAME ، نام HTTP health check مورد نظر خود را قرار دهید.

ایجاد یک سرویس بک‌اند

مثال زیر دستورالعمل‌هایی برای ایجاد یک سرویس backend خارجی منطقه‌ای پیکربندی شده برای استفاده از تعادل بار وزنی ارائه می‌دهد.

  1. یک سرویس backend با بررسی سلامت HTTP ایجاد کنید و سیاست متعادل‌کننده بار محلی را روی 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
  • به جای BACKEND_SERVICE_NAME نام سرویس بک‌اندی که می‌خواهید ایجاد کنید را قرار دهید.
  1. گروه نمونه را به سرویس backend اضافه کنید.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. یک آدرس IP خارجی منطقه‌ای برای متعادل‌کننده بار رزرو کنید.
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

به جای ADDRESS_NAME نام آدرس IP مورد نظر برای ایجاد را قرار دهید. برای مشاهده نتیجه از دستور compute addresses describe استفاده کنید. به آدرس IP خارجی استاتیک رزرو شده (' IP_ADDRESS' ) توجه کنید.

gcloud compute addresses describe ADDRESS_NAME
  1. با استفاده از آدرس IP خارجی منطقه‌ای رزرو شده 'IP_ADDRESS'، یک قانون ارسال ایجاد کنید. قانون ارسال را به سرویس backend متصل کنید.
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • موارد زیر را جایگزین کنید: FORWARDING_RULE : نام قانون ارسالی که باید ایجاد شود. IP_ADDRESS: آدرس IP که باید به نمونه اختصاص داده شود. از آدرس IP خارجی استاتیک رزرو شده استفاده کنید، نه نام آدرس.

تأیید وزن‌های بک‌اند با استفاده از API سرویس بک‌اند

تأیید کنید که وزن‌های backend به درستی به بررسی سلامت HTTP گزارش می‌شوند.

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

خروجی باید مانند زیر باشد:

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