1. مقدمة
يمكنك ضبط موازنة حمل الشبكة لتوزيع عدد الزيارات على مثيلات الخلفية الخاصة بجهاز موازنة الحمل استنادًا إلى الأوزان التي يتم الإبلاغ عنها من خلال التحقق من سلامة HTTP باستخدام موازنة الحمل المرجَّحة.
تتطلّب موازنة الحمل المرجَّحة ضبط ما يلي:
- يجب ضبط سياسة موازنة الحمل على مستوى المنطقة (localityLbPolicy) لخدمة الخلفية على WEIGHTED_MAGLEV.
- يجب ضبط خدمة الخلفية باستخدام عملية التحقق من الصحة عبر HTTP أو HTTP2 أو HTTPS. يجب أن تحتوي استجابات التحقق من الصحة عبر HTTP على حقل عنوان استجابة HTTP مخصّص X-Load-Balancing-Endpoint-Weight لتحديد الأوزان بقيم عددية صحيحة تتراوح بين 0 و1000 في التمثيل العشري لكل مثيل خلفي.
في حال استخدام مجموعة الأجهزة الافتراضية نفسها كخلفية للعديد من أجهزة موازنة الحمل المستندة إلى خدمة الخلفية باستخدام موازنة الحمل المرجّحة، يُنصح باستخدام مسار طلب فريد لكل عملية تحقق من الصحة لخدمة الخلفية. لمزيد من المعلومات، راجِع معايير النجاح لعمليات التحقّق من السلامة لبروتوكولات HTTP وHTTPS وHTTP/2.
يجب أن يعرض التحقق من الصحة HTTP استجابة HTTP 200 (OK) لاجتياز عمليات التحقق من الصحة واعتبار مثيل الخلفية سليمًا. في الحالات التي تجتاز فيها جميع مثيلات الخلفية عمليات التحقّق من الصحة وتعرض X-Load-Balancing-Endpoint-Weight بقيمة صفر، يوزّع جهاز موازنة الحمل الاتصالات الجديدة بين الخلفيات السليمة، ويعاملها بوزن متساوٍ. يمكن لموازن التحميل أيضًا توزيع الاتصالات الجديدة بين الخلفيات غير السليمة. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة توزيع الزيارات.
للاطّلاع على أمثلة على موازنة الحمل المرجَّحة، راجِع اختيار الخلفية وتتبُّع الاتصال.
يمكن استخدام موازنة الحمل المرجّحة في الحالات التالية:
- إذا كانت بعض عمليات الربط تعالج بيانات أكثر من غيرها، أو إذا كانت بعض عمليات الربط تدوم لفترة أطول من غيرها، قد يصبح توزيع الحمل على الخلفية غير متساوٍ. من خلال الإشارة إلى وزن أقل لكل مثيل، يمكن لمثيل ذي حمل مرتفع تقليل حصته من الاتصالات الجديدة، مع الاستمرار في تقديم الخدمة للاتصالات الحالية.
- إذا كان أحد الأنظمة الخلفية مثقلاً بالأحمال وقد يؤدي تخصيص المزيد من الاتصالات إلى قطع الاتصالات الحالية، فإنّ هذه الأنظمة الخلفية تخصّص وزنًا صفرًا لنفسها. من خلال الإشارة إلى عدم توفّر أي سعة، تتوقف إحدى آلات الخلفية الافتراضية عن تقديم الخدمة للاتصالات الجديدة، ولكنها تواصل تقديم الخدمة للاتصالات الحالية.
- إذا كان أحد الأنظمة الخلفية يستنزف الاتصالات الحالية قبل الصيانة، سيتم تعيين وزن صفر له. من خلال الإشارة إلى عدم توفّر سعة، تتوقف مثيل الخلفية عن تقديم الخدمة للاتصالات الجديدة، ولكنها تواصل تقديم الخدمة للاتصالات الحالية.
ما ستتعلمه
- كيفية ضبط موازنة حمل الشبكة لتوزيع عدد الزيارات على مثيلات الخلفية الخاصة بموازنة الحمل استنادًا إلى الأوزان التي يتم إعداد تقارير عنها من خلال فحص سلامة HTTP باستخدام موازنة الحمل المرجَّحة
إعداد البيئة بالسرعة التي تناسبك
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.



- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
- رقم تعريف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه
PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع. - للعلم، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس البرمجي الكثير من المال، إن لم تكلفك شيئًا على الإطلاق. لإيقاف الموارد كي لا يتم تحصيل رسوم منك بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بأكمله. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
بدء Cloud Shell
على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي حول الترميز Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.
من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات أعلى يسار الصفحة:

لن يستغرق توفير البيئة والاتصال بها سوى بضع لحظات. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا ثابتًا بسعة 5 غيغابايت، وتعمل على Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إكمال جميع المهام في هذا الدرس العملي ضمن المتصفّح. لست بحاجة إلى تثبيت أي تطبيق.
2. بدء عملية الإعداد
يتطلّب Codelab مشروعًا واحدًا.
في هذا البرنامج التعليمي، ستنشئ مجموعة أجهزة افتراضية تضم ثلاثة أجهزة افتراضية وتعيّن أوزانًا لكل جهاز. يمكنك إنشاء عملية تحقّق من الصحة عبر HTTP لإعداد تقارير عن أوزان مثيلات الخلفية. يتم تفعيل برنامج موازنة حمل الشبكة المرجَّح على خدمة الخلفية باستخدام سياسة موازنة الحمل المحلية كـ WEIGHTED_MAGLEV.
قبل البدء
- اطّلِع على نظرة عامة على موازنة حمل الشبكة الخارجية المستندة إلى خدمة الخلفية.
- ثبِّت Google Cloud CLI. للحصول على نظرة عامة كاملة على الأداة، راجِع نظرة عامة على gcloud CLI. يمكنك العثور على أوامر متعلّقة بموازنة التحميل في مرجع واجهة برمجة التطبيقات وgcloud CLI. إذا لم يسبق لك تشغيل Google Cloud CLI، شغِّل أولاً الأمر gcloud init للمصادقة.
- فعِّل واجهة برمجة التطبيقات Compute API.
gcloud services enable compute.googleapis.com
ملاحظة: لا يمكنك استخدام Google Cloud Console لضبط سياسة موازنة التحميل المحلية وتعيين أوزان لمثيلات الأجهزة الافتراضية. يمكنك استخدام واجهة سطر الأوامر (CLI) في Google Cloud بدلاً من ذلك.
إنشاء شبكة VPC والشبكات الفرعية وقواعد جدار الحماية
أنشئ شبكة VPC وشبكة فرعية وقواعد جدار الحماية التي تتيح الدخول للسماح بالاتصالات بالأجهزة الافتراضية الخلفية لجهاز موازنة الحمل.
- أنشئ شبكة 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: اسم الشبكة الفرعية التي سيتم إنشاؤها
- أنشئ قاعدة جدار حماية تتيح الدخول للسماح بتسليم الحِزم المُرسَلة إلى منافذ TCP الوجهة 80 و443 إلى الأجهزة الافتراضية للخادم الخلفي. في هذا المثال، تسمح قاعدة جدار الحماية بالاتصالات من أي عنوان 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. في هذا البرنامج التعليمي، يمكنك ضبط مثيل خلفي واحد للإبلاغ عن وزن يساوي صفرًا، ومثيل خلفي ثانٍ للإبلاغ عن وزن يساوي 100، ومثيل خلفي ثالث للإبلاغ عن وزن يساوي 900. لإنشاء المثيلات، شغِّل الأمر
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 التي تحتوي على وزن الجهاز الافتراضي (VM) للخادم الخلفي.
- لإنشاء عملية التحقّق من الصحة عبر HTTP، شغِّل الأمر
gcloud compute health-checks create:
gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \ --region=us-central1
استبدِل HTTP_HEALTH_CHECK_NAME باسم عملية التحقّق من صحة HTTP التي تريد إنشاءها.
إنشاء خدمة خلفية
يقدّم المثال التالي تعليمات لإنشاء خدمة خلفية خارجية إقليمية تم ضبطها لاستخدام موازنة الحمل المرجّحة.
- أنشئ خدمة الخلفية مع التحقق من السلامة HTTP واضبط سياسة موازنة الحمل المحلية على WEIGHTED_MAGLEV.
- لإنشاء خدمة الخلفية، شغِّل الأمر
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باسم خدمة الخلفية التي تريد إنشاءها.
- أضِف مجموعة الأجهزة الافتراضية إلى خدمة الخلفية.
- لإضافة مجموعة المثيلات، نفِّذ الأمر
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". اربط قاعدة إعادة التوجيه بالخدمة الخلفية.
- لإنشاء قاعدة إعادة التوجيه، شغِّل الأمر
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 خارجيًا ثابتًا محجوزًا، وليس اسم العنوان.
التحقّق من أوزان الخلفية باستخدام واجهة برمجة التطبيقات لخدمة الخلفية
تأكَّد من أنّه يتم إعداد تقارير عن أوزان الخلفية بشكلٍ سليم إلى عملية التحقّق من سلامة HTTP.
- للحصول على أوزان الخلفية (بالإضافة إلى حالات الصحة) من خدمة الخلفية، شغِّل الأمر
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