हर इंस्टेंस पर वेटेड नेटवर्क लोड बैलेंसिंग

1. परिचय

नेटवर्क लोड बैलेंसर को कॉन्फ़िगर करके, लोड बैलेंसर के बैकएंड इंस्टेंस में ट्रैफ़िक को डिस्ट्रिब्यूट किया जा सकता है. इसके लिए, वज़न के हिसाब से लोड बैलेंसिंग का इस्तेमाल किया जाता है. साथ ही, एचटीटीपी हेल्थ चेक के ज़रिए रिपोर्ट किए गए वज़न के आधार पर, ट्रैफ़िक को डिस्ट्रिब्यूट किया जाता है.

वज़न के हिसाब से लोड बैलेंसिंग के लिए, आपको ये दोनों कॉन्फ़िगर करने होंगे:

  • आपको बैकएंड सेवा की, इलाके के हिसाब से लोड बैलेंसर की नीति (localityLbPolicy) को WEIGHTED_MAGLEV पर सेट करना होगा.
  • आपको बैकएंड सेवा को, एचटीटीपी/एचटीटीपी2/एचटीटीपीएस हेल्थ चेक के साथ कॉन्फ़िगर करना होगा. एचटीटीपी हेल्थ चेक के रिस्पॉन्स में, X-Load-Balancing-Endpoint-Weight नाम का कस्टम एचटीटीपी रिस्पॉन्स हेडर फ़ील्ड शामिल होना चाहिए. इससे हर बैकएंड इंस्टेंस के लिए, 0 से 1000 तक की पूर्णांक वैल्यू के साथ वज़न तय किया जा सकता है. इसके लिए, डेसिमल फ़ॉर्मैट का इस्तेमाल किया जाता है.

अगर वज़न के हिसाब से लोड बैलेंसिंग का इस्तेमाल करके, एक ही इंस्टेंस ग्रुप को कई बैकएंड सेवा पर आधारित नेटवर्क लोड बैलेंसर के लिए बैकएंड के तौर पर इस्तेमाल किया जाता है, तो बैकएंड सेवा के हर हेल्थ चेक के लिए, अनुरोध-पाथ का यूनीक होना ज़रूरी है. ज़्यादा जानकारी के लिए, एचटीटीपी, एचटीटीपीएस, और एचटीटीपी/2 हेल्थ चेक के लिए सफलता के मानदंड देखें.

हेल्थ-चेक पास होने और बैकएंड इंस्टेंस को सही तरीके से काम करने वाला मानने के लिए, एचटीटीपी हेल्थ चेक को एचटीटीपी 200 (OK) रिस्पॉन्स दिखाना चाहिए. अगर सभी बैकएंड इंस्टेंस, अपने हेल्थ चेक पास कर लेते हैं और X-Load-Balancing-Endpoint-Weight को शून्य वज़न के साथ दिखाते हैं, तो लोड बैलेंसर, नए कनेक्शन को सही तरीके से काम करने वाले बैकएंड में डिस्ट्रिब्यूट करता है. इसके लिए, वह सभी को एक जैसा वज़न देता है. लोड बैलेंसर, नए कनेक्शन को सही तरीके से काम न करने वाले बैकएंड में भी डिस्ट्रिब्यूट कर सकता है. ज़्यादा जानकारी के लिए, ट्रैफ़िक डिस्ट्रिब्यूशन देखें.

वज़न के हिसाब से लोड बैलेंसिंग के उदाहरण देखने के लिए, बैकएंड चुनना और कनेक्शन ट्रैकिंग देखें.

वज़न के हिसाब से लोड बैलेंसिंग का इस्तेमाल इन स्थितियों में किया जा सकता है:

  • अगर कुछ कनेक्शन, दूसरों की तुलना में ज़्यादा डेटा प्रोसेस करते हैं या कुछ कनेक्शन, दूसरों की तुलना में ज़्यादा समय तक चालू रहते हैं, तो बैकएंड लोड डिस्ट्रिब्यूशन में अंतर आ सकता है. हर इंस्टेंस के लिए कम वज़न का सिग्नल देकर, ज़्यादा लोड वाला इंस्टेंस, नए कनेक्शन के अपने हिस्से को कम कर सकता है. हालांकि, वह मौजूदा कनेक्शन को सेवा देता रहता है.
  • अगर कोई बैकएंड ओवरलोड हो जाता है और ज़्यादा कनेक्शन असाइन करने से मौजूदा कनेक्शन टूट सकते हैं, तो ऐसे बैकएंड खुद को शून्य वज़न असाइन करते हैं. शून्य वज़न का सिग्नल देकर, बैकएंड इंस्टेंस नए कनेक्शन को सेवा देना बंद कर देता है. हालांकि, वह मौजूदा कनेक्शन को सेवा देता रहता है.
  • अगर कोई बैकएंड, रखरखाव से पहले मौजूदा कनेक्शन को बंद कर रहा है, तो वह खुद को शून्य वज़न असाइन करता है. शून्य वज़न का सिग्नल देकर, बैकएंड इंस्टेंस नए कनेक्शन को सेवा देना बंद कर देता है. हालांकि, वह मौजूदा कनेक्शन को सेवा देता रहता है.

आपको क्या सीखने को मिलेगा

  • वज़न के हिसाब से लोड बैलेंसिंग का इस्तेमाल करके, लोड बैलेंसर के बैकएंड इंस्टेंस में ट्रैफ़िक को डिस्ट्रिब्यूट करने के लिए, नेटवर्क लोड बैलेंसर को कॉन्फ़िगर करने का तरीका. इसके लिए, एचटीटीपी हेल्थ चेक के ज़रिए रिपोर्ट किए गए वज़न के आधार पर, ट्रैफ़िक को डिस्ट्रिब्यूट किया जाता है.

अपनी रफ़्तार से सीखने के लिए एनवायरमेंट सेट अप करना

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में शामिल लोगों के लिए डिसप्ले नेम होता है. यह एक कैरेक्टर स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. इसे बदला नहीं जा सकता. इसका मतलब है कि इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, यूनीक स्ट्रिंग अपने-आप जनरेट करता है. आम तौर पर, आपको इस बारे में चिंता करने की ज़रूरत नहीं होती कि यह क्या है. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. इसे आम तौर पर PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो कोई दूसरा रैंडम आईडी जनरेट किया जा सकता है. इसके अलावा, अपना आईडी इस्तेमाल करके देखा जा सकता है कि यह उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट के खत्म होने तक बना रहेगा.
  • आपकी जानकारी के लिए बता दें कि एक तीसरी वैल्यू भी होती है, जो प्रोजेक्ट नंबर है. इसका इस्तेमाल कुछ एपीआई करते हैं. इन तीनों वैल्यू के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
  1. इसके बाद, Cloud के रिसॉर्स/एपीआई का इस्तेमाल करने के लिए, आपको Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, रिसॉर्स बंद किए जा सकते हैं. इसके लिए, बनाए गए रिसॉर्स मिटाएं या पूरा प्रोजेक्ट मिटा दें. Google Cloud के नए उपयोगकर्ताओं को, 300 डॉलर का क्रेडिट मिलता है. इससे वे मुफ़्त में आज़माने के लिए प्रोग्राम का फ़ायदा उठा सकते हैं.

Cloud Shell लॉन्च करना

Google Cloud को लैपटॉप से रिमोट ऐक्सेस किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जाएगा. यह Cloud में चलने वाला कमांड लाइन एनवायरमेंट है.

Google Cloud Console में, सबसे ऊपर दाएं टूलबार पर मौजूद Cloud Shell आइकॉन पर क्लिक करें:

55efc1aaa7a4d3ad.png

एनवायरमेंट को प्रोविज़न करने और उससे कनेक्ट होने में कुछ सेकंड लगेंगे. जब यह प्रोसेस पूरी हो जाएगी, तो आपको ऐसा दिखेगा:

7ffe5cbb04455448.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल लोड होते हैं. इसमें 5 जीबी की परसिस्टेंट होम डायरेक्ट्री मिलती है. यह Google Cloud पर चलती है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में, सारा काम ब्राउज़र में किया जा सकता है. आपको कुछ भी इंस्टॉल करने की ज़रूरत नहीं है.

2. कॉन्फ़िगरेशन शुरू करना

कोडलैब के लिए, सिर्फ़ एक प्रोजेक्ट की ज़रूरत होती है.

इस ट्यूटोरियल में, तीन वीएम इंस्टेंस वाला एक इंस्टेंस ग्रुप बनाया जाता है. साथ ही, हर इंस्टेंस के लिए वज़न असाइन किया जाता है. बैकएंड इंस्टेंस के वज़न की रिपोर्ट करने के लिए, एचटीटीपी हेल्थ चेक बनाया जाता है. वज़न के हिसाब से नेटवर्क लोड बैलेंसर, बैकएंड सेवा पर चालू होता है. साथ ही, इलाके के हिसाब से लोड बैलेंसर की नीति, WEIGHTED_MAGLEV के तौर पर सेट होती है.

शुरू करने से पहले

gcloud services enable compute.googleapis.com

ध्यान दें: इलाके के हिसाब से लोड बैलेंसर की नीति को कॉन्फ़िगर करने और वीएम इंस्टेंस को वज़न असाइन करने के लिए, Google Cloud Console का इस्तेमाल नहीं किया जा सकता. इसके बजाय, Google Cloud CLI का इस्तेमाल करें.

वीपीएन नेटवर्क, सबनेट, और फ़ायरवॉल के नियम बनाना

अपने लोड बैलेंसर के बैकएंड वीएम से कनेक्शन की अनुमति देने के लिए, वीपीसी नेटवर्क, सबनेट, और इन्ग्रेस डेटा ट्रैफ़िक को अनुमति देने वाले फ़ायरवॉल के नियम बनाएं.

  1. वीपीएन नेटवर्क और सबनेट बनाएं. a. वीपीएन नेटवर्क बनाने के लिए, gcloud compute networks create कमांड: चलाएं
gcloud compute networks create NETWORK_NAME --subnet-mode custom

b. इस उदाहरण में, सबनेट की प्राइमरी आईपीवी4 पता रेंज 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: वह वीपीसी नेटवर्क जिसका नाम बनाना है.
  • SUBNET_NAME: वह सबनेटवर्क जिसका नाम बनाना है.
  1. इन्ग्रेस डेटा ट्रैफ़िक को अनुमति देने वाला फ़ायरवॉल नियम बनाएं, ताकि डेस्टिनेशन टीसीपी पोर्ट 80 और 443 पर भेजे गए पैकेट, बैकएंड वीएम तक पहुंचाए जा सकें. इस उदाहरण में, फ़ायरवॉल नियम, किसी भी सोर्स आईपी पते से कनेक्शन की अनुमति देता है. फ़ायरवॉल नियम, 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 हेडर में वज़न दिखाएं. इस ट्यूटोरियल के लिए, एक बैकएंड इंस्टेंस को शून्य वज़न, दूसरे बैकएंड इंस्टेंस को 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
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 की जगह, वह इंस्टेंस ग्रुप डालें जिसका नाम बनाना है.

एचटीटीपी हेल्थ चेक बनाना

इस ट्यूटोरियल में, एचटीटीपी हेल्थ चेक बनाने के निर्देश दिए गए हैं. इससे, बैकएंड वीएम के वज़न वाला एचटीटीपी रिस्पॉन्स पढ़ा जा सकता है."

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

HTTP_HEALTH_CHECK_NAME की जगह, वह एचटीटीपी हेल्थ चेक डालें जिसका नाम बनाना है.

बैकएंड सेवा बनाना

यहां दिए गए उदाहरण में, इलाके के हिसाब से बाहरी बैकएंड सेवा बनाने के निर्देश दिए गए हैं. इसे वज़न के हिसाब से लोड बैलेंसिंग का इस्तेमाल करने के लिए कॉन्फ़िगर किया गया है.

  1. एचटीटीपी हेल्थ चेक के साथ बैकएंड सेवा बनाएं और इलाके के हिसाब से लोड बैलेंसर की नीति को 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. इंस्टेंस ग्रुप को बैकएंड सेवा में जोड़ें.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. लोड बैलेंसर के लिए, इलाके के हिसाब से बाहरी आईपी पता रिज़र्व करें.
  • एक या उससे ज़्यादा आईपी पते रिज़र्व करने के लिए, gcloud compute addresses create कमांड चलाएं:
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

ADDRESS_NAME की जगह, वह आईपी पता डालें जिसका नाम बनाना है. नतीजा देखने के लिए, compute addresses describe कमांड का इस्तेमाल करें. रिज़र्व किए गए स्टैटिक बाहरी आईपी पते (‘IP_ADDRESS') को नोट करें.

gcloud compute addresses describe ADDRESS_NAME
  1. रिज़र्व किए गए इलाके के हिसाब से बाहरी आईपी पते ‘IP_ADDRESS' का इस्तेमाल करके, फ़ॉरवर्डिंग नियम बनाएं. फ़ॉरवर्डिंग नियम को बैकएंड सेवा से कनेक्ट करें.
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • इनकी जगह ये डालें: FORWARDING_RULE: वह फ़ॉरवर्डिंग नियम जिसका नाम बनाना है. IP_ADDRESS: वह आईपी पता जो इंस्टेंस को असाइन करना है. रिज़र्व किए गए स्टैटिक बाहरी आईपी पते का इस्तेमाल करें, न कि पते के नाम का.

बैकएंड सेवा के एपीआई का इस्तेमाल करके, बैकएंड के वज़न की पुष्टि करना

पुष्टि करें कि एचटीटीपी हेल्थ चेक को, बैकएंड के वज़न की सही जानकारी मिल रही है.

  • किसी बैकएंड सेवा से, बैकएंड के वज़न (और हेल्थ स्टेटस) की जानकारी पाने के लिए, 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