۱. مقدمه
شما میتوانید یک متعادلکننده بار شبکه را طوری پیکربندی کنید که ترافیک را در سراسر نمونههای 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 با استفاده از متعادلکننده بار وزنی.
تنظیم محیط خودتنظیم
- وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .



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

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

این ماشین مجازی با تمام ابزارهای توسعهای که نیاز دارید، مجهز شده است. این ماشین مجازی یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه میدهد و روی فضای ابری گوگل اجرا میشود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود میبخشد. تمام کارهای شما در این آزمایشگاه کد را میتوان در یک مرورگر انجام داد. نیازی به نصب چیزی ندارید.
۲. شروع پیکربندی
Codelab به یک پروژه واحد نیاز دارد.
در این آموزش، شما یک گروه نمونه با سه نمونه ماشین مجازی ایجاد میکنید و برای هر نمونه وزن تعیین میکنید. شما یک بررسی سلامت HTTP برای گزارش وزن نمونههای backend ایجاد میکنید. متعادلکننده بار شبکه وزندار در سرویس backend با سیاست متعادلکننده بار محلی به عنوان WEIGHTED_MAGLEV فعال میشود.
قبل از اینکه شروع کنی
- مرور کلی متعادلسازی بار شبکه خارجی مبتنی بر سرویس Backend را مطالعه کنید.
- رابط خط فرمان گوگل کلود (Google Cloud CLI) را نصب کنید. برای مرور کامل این ابزار، به نمای کلی رابط خط فرمان gcloud مراجعه کنید. میتوانید دستورات مربوط به متعادلسازی بار را در مرجع API و رابط خط فرمان gcloud پیدا کنید. اگر قبلاً رابط خط فرمان گوگل کلود را اجرا نکردهاید، ابتدا دستور gcloud init را برای احراز هویت اجرا کنید.
- API محاسباتی را فعال کنید.
gcloud services enable compute.googleapis.com
توجه: شما نمیتوانید از کنسول Google Cloud برای پیکربندی سیاست متعادلکننده بار محلی و اختصاص وزن به نمونههای ماشین مجازی استفاده کنید. در عوض از رابط خط فرمان Google Cloud استفاده کنید.
ایجاد قوانین شبکه، زیرشبکهها و فایروال VPC
یک شبکه، زیرشبکه و قوانین فایروال برای دسترسی VPC ایجاد کنید تا امکان اتصال به ماشینهای مجازی backend متعادلکننده بار شما فراهم شود.
- یک شبکه و زیرشبکه 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: نام زیرشبکهای که قرار است ایجاد شود.
- یک قانون فایروال با عنوان 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 نام قانون فایروالی که میخواهید ایجاد کنید را قرار دهید.
ایجاد نمونههای ماشین مجازی و اختصاص وزن به آنها
سه نمونه ماشین مجازی ایجاد کنید و به آنها وزن اختصاص دهید:
- سه نمونه ماشین مجازی بکاند را طوری پیکربندی کنید که وزنهای موجود در هدر 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را اجرا کنید:
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 را بخواند.
- برای ایجاد بررسی سلامت HTTP، دستور
gcloud compute health-checks createاجرا کنید:
gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \ --region=us-central1
به جای HTTP_HEALTH_CHECK_NAME ، نام HTTP health check مورد نظر خود را قرار دهید.
ایجاد یک سرویس بکاند
مثال زیر دستورالعملهایی برای ایجاد یک سرویس backend خارجی منطقهای پیکربندی شده برای استفاده از تعادل بار وزنی ارائه میدهد.
- یک سرویس backend با بررسی سلامت HTTP ایجاد کنید و سیاست متعادلکننده بار محلی را روی WEIGHTED_MAGLEV تنظیم کنید.
- برای ایجاد سرویس backend، دستور
gcloud compute backend-services createاجرا کنید:
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نام سرویس بکاندی که میخواهید ایجاد کنید را قرار دهید.
- گروه نمونه را به سرویس backend اضافه کنید.
- برای افزودن گروه نمونه، دستور
gcloud compute backend-services add-backendاجرا کنید:
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group=INSTANCE_GROUP \ --instance-group-zone=us-central1-a \ --region=us-central1
- یک آدرس IP خارجی منطقهای برای متعادلکننده بار رزرو کنید.
- برای رزرو یک یا چند آدرس IP، دستور
gcloud compute addresses createاجرا کنید:
gcloud compute addresses create ADDRESS_NAME \ --region us-central1
به جای ADDRESS_NAME نام آدرس IP مورد نظر برای ایجاد را قرار دهید. برای مشاهده نتیجه از دستور compute addresses describe استفاده کنید. به آدرس IP خارجی استاتیک رزرو شده (' IP_ADDRESS' ) توجه کنید.
gcloud compute addresses describe ADDRESS_NAME
- با استفاده از آدرس IP خارجی منطقهای رزرو شده 'IP_ADDRESS'، یک قانون ارسال ایجاد کنید. قانون ارسال را به سرویس backend متصل کنید.
- برای ایجاد قانون ارسال، دستور
gcloud compute forwarding-rules createاجرا کنید:
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 گزارش میشوند.
- برای دریافت وزنهای backend (همراه با وضعیت سلامت) از یک سرویس backend، دستور
gcloud compute backend-services get-healthاجرا کنید:
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