কম্পিউট ইঞ্জিন সহ Google ক্লাউডে একটি ওয়েব অ্যাপ হোস্ট এবং স্কেল করুন

১. ভূমিকা

গুগল ক্লাউডে ওয়েবসাইট ডেপ্লয় করার অনেক উপায় আছে এবং প্রতিটি সলিউশনই ভিন্ন ভিন্ন ফিচার, সক্ষমতা ও নিয়ন্ত্রণের মাত্রা প্রদান করে। কম্পিউট ইঞ্জিন একটি ওয়েবসাইট চালানোর জন্য ব্যবহৃত ইনফ্রাস্ট্রাকচারের উপর গভীর নিয়ন্ত্রণ প্রদান করে, কিন্তু গুগল কুবারনেটিস ইঞ্জিন, অ্যাপ ইঞ্জিন বা অন্যান্য সলিউশনের তুলনায় এর জন্য কিছুটা বেশি অপারেশনাল ম্যানেজমেন্টের প্রয়োজন হয়। কম্পিউট ইঞ্জিনের মাধ্যমে আপনি ইনফ্রাস্ট্রাকচারের বিভিন্ন দিক, যেমন—ভার্চুয়াল মেশিন, লোড ব্যালেন্সার এবং আরও অনেক কিছুর উপর সূক্ষ্ম নিয়ন্ত্রণ রাখতে পারেন। আজ আমরা একটি নমুনা অ্যাপ—ফ্যান্সি স্টোরের ই-কমার্স ওয়েবসাইট—ডেপ্লয় করব, যা দেখাবে কীভাবে কম্পিউট ইঞ্জিন ব্যবহার করে একটি ওয়েবসাইট সহজে ডেপ্লয় ও স্কেল করা যায়।

আপনি যা শিখবেন

এই কোডল্যাবের শেষে, আপনার ওয়েবসাইটের জন্য অটো-হিলিং, লোড ব্যালান্সিং, অটো-স্কেলিং এবং রোলিং আপডেট প্রদানের উদ্দেশ্যে ম্যানেজড ইনস্ট্যান্স গ্রুপের অধীনে ইনস্ট্যান্স থাকবে।

পূর্বশর্ত

২. পরিবেশ সেটআপ

স্ব-গতিতে পরিবেশ সেটআপ

  1. ক্লাউড কনসোলে সাইন ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে কোনো Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে ব্যবহৃত হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এই কোডল্যাবে এটিকে পরবর্তীতে PROJECT_ID হিসাবে উল্লেখ করা হবে।

  1. এরপরে, গুগল ক্লাউড রিসোর্স ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে।

এই কোডল্যাবটি চালাতে খুব বেশি খরচ হওয়ার কথা নয়, এমনকি আদৌ কোনো খরচ নাও হতে পারে। "পরিষ্কার-পরিচ্ছন্নতা" (Cleaning up) বিভাগে দেওয়া নির্দেশাবলী অবশ্যই অনুসরণ করবেন, যেখানে রিসোর্স বন্ধ করার পরামর্শ দেওয়া হয়েছে, যাতে এই টিউটোরিয়ালের বাইরে আপনার কোনো বিল না আসে। গুগল ক্লাউডের নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

কম্পিউট ইঞ্জিন এপিআই সক্রিয় করুন

এরপরে, আপনাকে Compute Engine API সক্রিয় করতে হবে। একটি API সক্রিয় করার জন্য আপনাকে এর পরিষেবার শর্তাবলী এবং বিলিংয়ের দায়িত্ব গ্রহণ করতে হবে।

ক্লাউড শেলে, কম্পিউট ইঞ্জিন এপিআই সক্রিয় করতে নিম্নলিখিতটি চালান:

gcloud services enable compute.googleapis.com

ক্লাউড শেল

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আপনি ক্লাউড শেল ব্যবহার করবেন, যা ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।

এই ডেবিয়ান-ভিত্তিক ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এর মানে হলো, এই কোডল্যাবের জন্য আপনার শুধু একটি ব্রাউজার প্রয়োজন হবে (হ্যাঁ, এটি ক্রোমবুকেও কাজ করে)।

  1. ক্লাউড কনসোল থেকে ক্লাউড শেল সক্রিয় করতে, কেবল 'Activate Cloud Shell'-এ ক্লিক করুন। a8460e837e9f5fda.png (পরিবেশের জন্য ব্যবস্থা করতে এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত)।

b532b2f19ab85dda.png

Screen Shot 2017-06-14 at 10.13.43 PM.png

ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি দেখতে পাবেন যে আপনাকে ইতিমধ্যেই প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার PROJECT_ID তে সেট করা আছে।

gcloud auth list

কমান্ড আউটপুট

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি কোনো কারণে প্রজেক্টটি সেট করা না থাকে, তাহলে নিম্নলিখিত কমান্ডটি দিন:

gcloud config set project <PROJECT_ID>

আপনার PROJECT_ID খুঁজছেন? সেটআপের ধাপগুলিতে আপনি কোন আইডি ব্যবহার করেছিলেন তা দেখে নিন অথবা ক্লাউড কনসোল ড্যাশবোর্ডে এটি খুঁজে দেখুন:

2485e00c1223af09.png

ক্লাউড শেল ডিফল্টরূপে কিছু এনভায়রনমেন্ট ভেরিয়েবলও সেট করে, যা ভবিষ্যতে কমান্ড চালানোর সময় কাজে লাগতে পারে।

echo $GOOGLE_CLOUD_PROJECT

কমান্ড আউটপুট

<PROJECT_ID>
  1. অবশেষে, ডিফল্ট জোন এবং প্রজেক্ট কনফিগারেশন সেট করুন।
gcloud config set compute/zone us-central1-f

আপনি বিভিন্ন ধরনের জোন বেছে নিতে পারেন। আরও তথ্যের জন্য, অঞ্চল ও জোন দেখুন।

ক্লাউড স্টোরেজ বাকেট তৈরি করুন

আমরা আমাদের বিল্ড করা কোড এবং স্টার্টআপ স্ক্রিপ্টগুলো রাখার জন্য একটি ক্লাউড স্টোরেজ বাকেট ব্যবহার করব। ক্লাউড শেলে, একটি নতুন ক্লাউড স্টোরেজ বাকেট তৈরি করতে নিম্নলিখিত কমান্ডটি চালান:

gsutil mb gs://fancy-store-$DEVSHELL_PROJECT_ID

৩. সোর্স রিপোজিটরি ক্লোন করুন

আপনার ওয়েবসাইটের ভিত্তি হিসেবে আপনি ফ্যান্সি স্টোরের মনোলিথ-টু-মাইক্রোসার্ভিসেস রিপোজিটরি-ভিত্তিক বিদ্যমান ইকমার্স ওয়েবসাইটটি ব্যবহার করবেন। আপনি আপনার রিপোজিটরি থেকে সোর্স কোড ক্লোন করবেন, যাতে আপনি কম্পিউট ইঞ্জিনে ডেপ্লয় করার দিকগুলোর উপর মনোযোগ দিতে পারেন। পরবর্তীতে, কম্পিউট ইঞ্জিনে আপডেটের সরলতা দেখানোর জন্য আপনি কোডে একটি ছোট আপডেট করবেন।

আপনি নিম্নলিখিত লিঙ্কের মাধ্যমে কোড রিপোজিটরিটি স্বয়ংক্রিয়ভাবে প্রজেক্টে ক্লোন করতে পারেন, সেইসাথে ক্লাউড শেল এবং বিল্ট-ইন কোড এডিটরও খুলতে পারেন: ক্লাউড শেলে খুলুন

বিকল্পভাবে, আপনি ক্লাউড শেলের ভিতরে নিচের কমান্ডগুলো ব্যবহার করে রিপোজিটরিটি ম্যানুয়ালি ক্লোন করতে পারেন:

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices

ক্লাউড শেল কমান্ড প্রম্পটে, অ্যাপটিকে স্থানীয়ভাবে চালানোর জন্য কোডের প্রাথমিক বিল্ডটি রান করুন। স্ক্রিপ্টটি রান হতে কয়েক মিনিট সময় লাগতে পারে।

./setup.sh

যথাযথভাবে খোঁজখবর নিন এবং আপনার অ্যাপটি পরীক্ষা করুন। আপনার ওয়েব সার্ভার চালু করতে নিম্নলিখিত কমান্ডটি চালান:

cd microservices
npm start

আউটপুট:

Products microservice listening on port 8082!
Frontend microservice listening on port 8080!
Orders microservice listening on port 8081!

ওয়েব প্রিভিউ আইকনে ক্লিক করে "পোর্ট ৮০৮০-তে প্রিভিউ" নির্বাচন করে আপনার অ্যাপটি প্রিভিউ করুন।

6634c06dd0b9172c.png

এতে একটি নতুন উইন্ডো খুলবে যেখানে আপনি ফ্যান্সি স্টোরের ফ্রন্টএন্ডের কার্যক্রম দেখতে পাবেন!

abf2ca314bf80d03.png

ওয়েবসাইটটি দেখার পর আপনি এই উইন্ডোটি বন্ধ করতে পারেন। ওয়েব সার্ভার প্রসেসটি বন্ধ করতে, টার্মিনাল উইন্ডোতে Control+C (ম্যাকিনটোশে Command+C ) চাপুন।

৪. কম্পিউট ইঞ্জিন ইনস্ট্যান্স তৈরি করুন

এখন যেহেতু আপনার কার্যকরী ডেভেলপার এনভায়রনমেন্ট তৈরি হয়ে গেছে, আপনি কয়েকটি Compute Engine ইনস্ট্যান্স ডেপ্লয় করতে পারেন! নিম্নলিখিত ধাপগুলোতে, আপনি যা করবেন:

  1. ইনস্ট্যান্সগুলো কনফিগার করার জন্য একটি স্টার্টআপ স্ক্রিপ্ট তৈরি করুন।
  2. সোর্স কোড ক্লোন করে ক্লাউড স্টোরেজে আপলোড করুন।
  3. ব্যাকএন্ড মাইক্রোসার্ভিসগুলো হোস্ট করার জন্য একটি Compute Engine ইনস্ট্যান্স স্থাপন করুন।
  4. ব্যাকএন্ড মাইক্রোসার্ভিসেস ইনস্ট্যান্সটি ব্যবহার করার জন্য ফ্রন্টএন্ড কোডটি পুনর্বিন্যাস করুন।
  5. ফ্রন্টএন্ড মাইক্রোসার্ভিসটি হোস্ট করার জন্য একটি Compute Engine ইনস্ট্যান্স স্থাপন করুন।
  6. যোগাযোগের অনুমতি দেওয়ার জন্য নেটওয়ার্কটি কনফিগার করুন।

স্টার্টআপ স্ক্রিপ্ট তৈরি করুন

প্রতিবার চালু হওয়ার সময় ইনস্ট্যান্সটিকে কী করতে হবে, তা নির্দেশ দেওয়ার জন্য একটি স্টার্টআপ স্ক্রিপ্ট ব্যবহার করা হবে। এভাবে ইনস্ট্যান্সগুলো স্বয়ংক্রিয়ভাবে কনফিগার হয়ে যায়।

কোড এডিটর খোলার জন্য ক্লাউড শেল রিবনে থাকা পেন্সিল আইকনটিতে ক্লিক করুন।

monolith-to-microservices ফোল্ডারে যান। File > New File- এ ক্লিক করুন এবং startup-script.sh নামে একটি ফাইল তৈরি করুন।

439553c934139b82.png

নতুন ফাইলটিতে নিচের কোডটি পেস্ট করুন, যার কিছু অংশ পেস্ট করার পর আপনাকে সম্পাদনা করতে হবে:

#!/bin/bash

# Install logging monitor. The monitor will automatically pick up logs sent to
# syslog.
curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
service google-fluentd restart &

# Install dependencies from apt
apt-get update
apt-get install -yq ca-certificates git build-essential supervisor psmisc

# Install nodejs
mkdir /opt/nodejs
curl https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.gz | tar xvzf - -C /opt/nodejs --strip-components=1
ln -s /opt/nodejs/bin/node /usr/bin/node
ln -s /opt/nodejs/bin/npm /usr/bin/npm

# Get the application source code from the Google Cloud Storage bucket.
mkdir /fancy-store
gsutil -m cp -r gs://fancy-store-[DEVSHELL_PROJECT_ID]/monolith-to-microservices/microservices/* /fancy-store/

# Install app dependencies.
cd /fancy-store/
npm install

# Create a nodeapp user. The application will run as this user.
useradd -m -d /home/nodeapp nodeapp
chown -R nodeapp:nodeapp /opt/app

# Configure supervisor to run the node app.
cat >/etc/supervisor/conf.d/node-app.conf << EOF
[program:nodeapp]
directory=/fancy-store
command=npm start
autostart=true
autorestart=true
user=nodeapp
environment=HOME="/home/nodeapp",USER="nodeapp",NODE_ENV="production"
stdout_logfile=syslog
stderr_logfile=syslog
EOF

supervisorctl reread
supervisorctl update

এখন, কোড এডিটরে, [DEVSHELL_PROJECT_ID] লেখাটি খুঁজুন এবং এটিকে নিম্নলিখিত কমান্ডের আউটপুট দিয়ে প্রতিস্থাপন করুন:

echo $DEVSHELL_PROJECT_ID

উদাহরণ আউটপুট:

my-gce-codelab-253520

startup-script.sh ফাইলের কোড লাইনটি এখন নিচের মতো হওয়া উচিত:

gs://fancy-store-my-gce-codelab-253520/monolith-to-microservices/microservices/* /fancy-store/

স্টার্টআপ স্ক্রিপ্টটি নিম্নলিখিত কাজগুলো সম্পাদন করে:

  • লগিং এজেন্ট ইনস্টল করা, যা স্বয়ংক্রিয়ভাবে সিসলগ (syslog) থেকে লগ সংগ্রহ করে।
  • Node.js এবং Supervisor ইনস্টল করা, যা অ্যাপটিকে ডেমন হিসেবে চালায়।
  • ক্লাউড স্টোরেজ বাকেট থেকে অ্যাপটির সোর্স কোড ক্লোন করা এবং ডিপেন্ডেন্সিগুলো ইনস্টল করা।
  • সুপারভাইজারের কনফিগারেশন, যা অ্যাপটি চালায়, তা নিশ্চিত করে যে অ্যাপটি অপ্রত্যাশিতভাবে বন্ধ হয়ে গেলে বা কোনো অ্যাডমিন বা প্রসেস দ্বারা বন্ধ করা হলে তা পুনরায় চালু হবে, এবং লগিং এজেন্টের সংগ্রহের জন্য অ্যাপটির stdout ও stderr সিস্টেম লগে পাঠাবে।

এখন তৈরি করা startup-script.sh ফাইলটি আপনার পূর্বে তৈরি করা ক্লাউড স্টোরেজ বাকেটে কপি করুন:

gsutil cp ~/monolith-to-microservices/startup-script.sh gs://fancy-store-$DEVSHELL_PROJECT_ID

এটি এখন https://storage.googleapis.com/[BUCKET_NAME]/startup-script.sh -এ পাওয়া যাচ্ছে। [BUCKET_NAME] হলো ক্লাউড স্টোরেজ বাকেটের নাম। ডিফল্টরূপে, এটি শুধুমাত্র অনুমোদিত ব্যবহারকারী এবং সার্ভিস অ্যাকাউন্টগুলোই দেখতে পাবে, তাই এটি কোনো ওয়েব ব্রাউজারের মাধ্যমে অ্যাক্সেস করা যাবে না। Compute Engine ইনস্ট্যান্সগুলো তাদের সার্ভিস অ্যাকাউন্টের মাধ্যমে স্বয়ংক্রিয়ভাবে এটি অ্যাক্সেস করতে পারবে।

কোডটি ক্লাউড স্টোরেজ বাকেটে কপি করুন

যখন ইনস্ট্যান্সগুলো চালু হয়, তখন সেগুলো ক্লাউড স্টোরেজ বাকেট থেকে কোড নিয়ে আসে, যাতে আপনি কোডের '.env' ফাইলে কিছু কনফিগারেশন ভেরিয়েবল সংরক্ষণ করতে পারেন।

ক্লোন করা কোডটি ক্লাউড স্টোরেজ বাকেটে কপি করুন:

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

ব্যাকএন্ড ইনস্ট্যান্স স্থাপন করুন

আপনি সর্বপ্রথম যে ইনস্ট্যান্সটি ডেপ্লয় করবেন, সেটি হবে ব্যাকএন্ড ইনস্ট্যান্স, যেখানে অর্ডার এবং প্রোডাক্ট মাইক্রোসার্ভিসগুলো থাকবে।

আপনার পূর্বে তৈরি করা স্টার্টআপ স্ক্রিপ্ট ব্যবহার করার জন্য কনফিগার করা এবং ব্যাকএন্ড ইনস্ট্যান্স হিসেবে ট্যাগ করা একটি f1-micro ইনস্ট্যান্স তৈরি করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান, যাতে আপনি পরবর্তীতে এতে নির্দিষ্ট ফায়ারওয়াল নিয়ম প্রয়োগ করতে পারেন:

gcloud compute instances create backend \
    --machine-type=f1-micro \
    --image=debian-9-stretch-v20190905 \
    --image-project=debian-cloud \
    --tags=backend \
    --metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh

ব্যাকএন্ডের সাথে সংযোগ কনফিগার করুন

অ্যাপের ফ্রন্টএন্ড ডেপ্লয় করার আগে, আপনার ডেপ্লয় করা ব্যাকএন্ডকে নির্দেশ করার জন্য কনফিগারেশন আপডেট করতে হবে।

ব্যাকএন্ডের এক্সটার্নাল আইপি অ্যাড্রেসটি সংগ্রহ করুন, যা ব্যাকএন্ড ইনস্ট্যান্সের EXTERNAL_IP ট্যাবের অধীনে নিম্নলিখিত কমান্ডের মাধ্যমে দেখা যাবে:

gcloud compute instances list

উদাহরণ আউটপুট:

NAME     ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
backend  us-central1-a  f1-micro                   10.128.0.2   34.68.223.88  RUNNING

ক্লাউড শেলের কোড এডিটরে, monolith-to-microservices > react-app ফোল্ডারটিতে যান। কোড এডিটর মেনু থেকে, .env ফাইলটি দেখার জন্য View > Toggle Hidden Files নির্বাচন করুন।

e7314ceda643e16.png

ব্যাকএন্ডের এক্সটার্নাল আইপি অ্যাড্রেস নির্দেশ করার জন্য .env ফাইলটি সম্পাদনা করুন। নিচে [BACKEND_ADDRESS] হলো ব্যাকএন্ড ইনস্ট্যান্সের এক্সটার্নাল আইপি অ্যাড্রেস, যা gcloud টুলের পূর্ববর্তী কমান্ড থেকে নির্ধারিত হয়েছে।

REACT_APP_ORDERS_URL=http://[BACKEND_ADDRESS]:8081/api/orders
REACT_APP_PRODUCTS_URL=http://[BACKEND_ADDRESS]:8082/api/products

ফাইলটি সংরক্ষণ করুন।

react-app রি-বিল্ড করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন, যা ফ্রন্টএন্ড কোড আপডেট করবে:

cd ~/monolith-to-microservices/react-app
npm install && npm run-script build

অ্যাপ কোডটি ক্লাউড স্টোরেজ বাকেটে কপি করুন:

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

ফ্রন্টএন্ড ইনস্ট্যান্স স্থাপন করুন

কোডটি কনফিগার করা হয়ে গেলে, আপনি ফ্রন্টএন্ড ইনস্ট্যান্সটি ডিপ্লয় করতে পারেন। ফ্রন্টএন্ড ইনস্ট্যান্সটি ডিপ্লয় করতে আগের কমান্ডের মতোই একটি কমান্ড চালান, তবে ফায়ারওয়ালের সুবিধার জন্য এই ইনস্ট্যান্সটিকে "ফ্রন্টএন্ড" হিসেবে ট্যাগ করা হয়েছে।

gcloud compute instances create frontend \
    --machine-type=f1-micro \
    --image=debian-9-stretch-v20190905 \
    --image-project=debian-cloud \
    --tags=frontend \
    --metadata=startup-script-url=https://storage.googleapis.com/fancy-store-$DEVSHELL_PROJECT_ID/startup-script.sh 

নেটওয়ার্ক কনফিগার করুন

ফ্রন্টএন্ডের জন্য পোর্ট ৮০৮০ এবং ব্যাকএন্ডের জন্য পোর্ট ৮০৮১ ও ৮০৮২-তে অ্যাক্সেসের অনুমতি দিতে ফায়ারওয়াল নিয়ম তৈরি করুন। ফায়ারওয়াল কমান্ডগুলো অ্যাপের জন্য ইনস্ট্যান্স তৈরির সময় নির্ধারিত ট্যাগগুলো ব্যবহার করে।

gcloud compute firewall-rules create fw-fe \
    --allow tcp:8080 \
    --target-tags=frontend
gcloud compute firewall-rules create fw-be \
    --allow tcp:8081-8082 \
    --target-tags=backend

ওয়েবসাইটটি এখন কার্যকর হওয়া উচিত। ফ্রন্টএন্ডের এক্সটার্নাল আইপি অ্যাড্রেসটি নির্ণয় করুন। ফ্রন্টএন্ড ইনস্ট্যান্সের EXTERNAL_IP খুঁজে বের করে অ্যাড্রেসটি নির্ণয় করা যাবে:

gcloud compute instances list

উদাহরণ আউটপুট:

NAME      ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP      STATUS
backend   us-central1-a  f1-micro                   10.128.0.2   104.198.235.171  RUNNING
frontend  us-central1-a  f1-micro                   10.128.0.3   34.69.141.9      RUNNING

ইনস্ট্যান্সটি চালু ও কনফিগার হতে কয়েক মিনিট সময় লাগতে পারে। অ্যাপটির প্রস্তুতি নিরীক্ষণ করতে নিম্নলিখিতটি সম্পাদন করুন:

watch -n 5 curl http://[EXTERNAL_IP]:8080 

নিচের মতো আউটপুট দেখতে পেলেই ওয়েবসাইটটি প্রস্তুত হয়ে যাবে। ওয়াচ কমান্ডটি বাতিল করতে কমান্ড প্রম্পটে Control+C (ম্যাকিনটোশে Command+C ) চাপুন।

80dc8721dc08d7e4.png

ওয়েবসাইটটি অ্যাক্সেস করতে একটি নতুন ওয়েব ব্রাউজার ট্যাব খুলে http://[FRONTEND_ADDRESS]:8080-এ ব্রাউজ করুন, যেখানে [FRONTEND_ADDRESS] হলো উপরে নির্ধারিত EXTERNAL_IP।

প্রোডাক্টস এবং অর্ডারস পেজগুলোতে যাওয়ার চেষ্টা করুন, সেটাও কাজ করার কথা।

a11460a1fffb07d8.png

৫. পরিচালিত ইনস্ট্যান্স গ্রুপ তৈরি করুন

আপনার অ্যাপ্লিকেশনকে স্কেল করার সুযোগ দিতে, ম্যানেজড ইনস্ট্যান্স গ্রুপ তৈরি করা হবে এবং এগুলো ফ্রন্টএন্ডব্যাকএন্ড ইনস্ট্যান্সগুলোকে ইনস্ট্যান্স টেমপ্লেট হিসেবে ব্যবহার করবে।

একটি ম্যানেজড ইনস্ট্যান্স গ্রুপে একই ধরনের ইনস্ট্যান্স থাকে, যেগুলোকে আপনি একটি একক জোনে একটি একক সত্তা হিসেবে পরিচালনা করতে পারেন। ম্যানেজড ইনস্ট্যান্স গ্রুপগুলো আপনার ইনস্ট্যান্সগুলোকে সক্রিয়ভাবে উপলব্ধ, অর্থাৎ RUNNING অবস্থায় রেখে আপনার অ্যাপগুলোর উচ্চ প্রাপ্যতা (high availability) বজায় রাখে। আপনি আপনার ফ্রন্টএন্ড এবং ব্যাকএন্ড ইনস্ট্যান্সগুলোর জন্য অটো-হিলিং, লোড ব্যালান্সিং, অটো-স্কেলিং এবং রোলিং আপডেট প্রদানের জন্য ম্যানেজড ইনস্ট্যান্স গ্রুপ ব্যবহার করবেন।

সোর্স ইনস্ট্যান্স থেকে ইনস্ট্যান্স টেমপ্লেট তৈরি করুন

একটি ম্যানেজড ইনস্ট্যান্স গ্রুপ তৈরি করার আগে, আপনাকে একটি ইনস্ট্যান্স টেমপ্লেট তৈরি করতে হবে যা গ্রুপটির ভিত্তি হিসেবে কাজ করবে। ইনস্ট্যান্স টেমপ্লেট আপনাকে নতুন ভার্চুয়াল মেশিন (VM) ইনস্ট্যান্স তৈরির সময় ব্যবহারের জন্য মেশিনের ধরন, বুট ডিস্ক ইমেজ বা কন্টেইনার ইমেজ, নেটওয়ার্ক এবং অন্যান্য ইনস্ট্যান্স প্রোপার্টি নির্ধারণ করার সুযোগ দেয়। আপনি একটি ম্যানেজড ইনস্ট্যান্স গ্রুপের মধ্যে ইনস্ট্যান্স তৈরি করতে অথবা এমনকি স্বতন্ত্র ইনস্ট্যান্স তৈরি করতেও ইনস্ট্যান্স টেমপ্লেট ব্যবহার করতে পারেন।

ইনস্ট্যান্স টেমপ্লেট তৈরি করতে, আপনার তৈরি করা বিদ্যমান ইনস্ট্যান্সগুলো ব্যবহার করুন।

প্রথমে আপনাকে উভয় ইনস্ট্যান্স বন্ধ করতে হবে।

gcloud compute instances stop frontend
gcloud compute instances stop backend

এখন, সোর্স ইনস্ট্যান্সগুলো থেকে ইনস্ট্যান্স টেমপ্লেটটি তৈরি করুন।

gcloud compute instance-templates create fancy-fe \
    --source-instance=frontend
gcloud compute instance-templates create fancy-be \
    --source-instance=backend

ইনস্ট্যান্স টেমপ্লেটগুলো তৈরি করা হয়েছে কিনা তা নিশ্চিত করুন:

gcloud compute instance-templates list

উদাহরণ আউটপুট:

NAME      MACHINE_TYPE  PREEMPTIBLE  CREATION_TIMESTAMP
fancy-be  f1-micro                   2019-09-12T07:52:57.544-07:00
fancy-fe  f1-micro                   2019-09-12T07:52:48.238-07:00

পরিচালিত ইনস্ট্যান্স গ্রুপ তৈরি করুন

আপনি দুটি ম্যানেজড ইনস্ট্যান্স গ্রুপ তৈরি করবেন, একটি ফ্রন্টএন্ডের জন্য এবং অন্যটি ব্যাকএন্ডের জন্য। এই ম্যানেজড ইনস্ট্যান্স গ্রুপগুলো পূর্বে তৈরি করা ইনস্ট্যান্স টেমপ্লেটগুলো ব্যবহার করবে এবং শুরুতে প্রতিটি গ্রুপে দুটি করে ইনস্ট্যান্সের জন্য কনফিগার করা থাকবে। নির্দিষ্ট করা 'বেস-ইনস্ট্যান্স-নেম'-এর সাথে এলোমেলো অক্ষর যুক্ত করে ইনস্ট্যান্সগুলোর নামকরণ স্বয়ংক্রিয়ভাবে করা হবে।

gcloud compute instance-groups managed create fancy-fe-mig \
    --base-instance-name fancy-fe \
    --size 2 \
    --template fancy-fe
gcloud compute instance-groups managed create fancy-be-mig \
    --base-instance-name fancy-be \
    --size 2 \
    --template fancy-be

আপনার অ্যাপ্লিকেশনের জন্য, ফ্রন্টএন্ড মাইক্রোসার্ভিসটি ৮০৮০ পোর্টে চলে, এবং ব্যাকএন্ড মাইক্রোসার্ভিসগুলো অর্ডারের জন্য ৮০৮১ পোর্টে ও প্রোডাক্টের জন্য ৮০৮২ পোর্টে চলে। যেহেতু এগুলো নন-স্ট্যান্ডার্ড পোর্ট, তাই এগুলোকে শনাক্ত করার জন্য আপনাকে নেমড পোর্ট নির্দিষ্ট করতে হবে। নেমড পোর্ট হলো key:value পেয়ার মেটাডেটা, যা সার্ভিসের নাম এবং এটি যে পোর্টে চলছে তা নির্দেশ করে। নেমড পোর্ট একটি ইনস্ট্যান্স গ্রুপে অ্যাসাইন করা যেতে পারে, যা নির্দেশ করে যে সার্ভিসটি গ্রুপের সমস্ত ইনস্ট্যান্সে উপলব্ধ। এই তথ্যটি লোড ব্যালেন্সার ব্যবহার করে, যা আপনি পরে কনফিগার করবেন।

gcloud compute instance-groups set-named-ports fancy-fe-mig \ 
    --named-ports frontend:8080
gcloud compute instance-groups set-named-ports fancy-be-mig \
    --named-ports orders:8081,products:8082

স্বয়ংক্রিয় নিরাময় কনফিগার করুন

অ্যাপটির প্রাপ্যতা উন্নত করতে এবং এটি সাড়া দিচ্ছে কিনা তা যাচাই করতে, আপনি ম্যানেজড ইনস্ট্যান্স গ্রুপগুলির জন্য একটি অটো-হিলিং পলিসি কনফিগার করতে পারেন।

একটি অটো-হিলিং পলিসি কোনো অ্যাপ প্রত্যাশিতভাবে সাড়া দিচ্ছে কিনা তা যাচাই করার জন্য একটি অ্যাপ-ভিত্তিক হেলথ চেকের উপর নির্ভর করে। কোনো ইনস্ট্যান্স কেবল RUNNING অবস্থায় আছে কিনা, যা তার ডিফল্ট আচরণ, তা যাচাই করার চেয়ে অ্যাপটি সাড়া দিচ্ছে কিনা তা পরীক্ষা করা আরও সুনির্দিষ্ট।

এমন একটি হেলথ চেক তৈরি করুন যা ফ্রন্টএন্ড এবং ব্যাকএন্ডের জন্য পরপর তিনবার আনহেলদি (অস্বাস্থ্যকর) হিসেবে চিহ্নিত হলে ইনস্ট্যান্সটিকে মেরামত করবে:

gcloud compute health-checks create http fancy-fe-hc \
    --port 8080 \
    --check-interval 30s \
    --healthy-threshold 1 \
    --timeout 10s \
    --unhealthy-threshold 3
gcloud compute health-checks create http fancy-be-hc \
    --port 8081 \
    --request-path=/api/orders \
    --check-interval 30s \
    --healthy-threshold 1 \
    --timeout 10s \
    --unhealthy-threshold 3

হেলথ চেক প্রোবগুলোকে ৮০৮০ এবং ৮০৮১ পোর্টে মাইক্রোসার্ভিসগুলোর সাথে সংযোগ করার অনুমতি দিতে একটি ফায়ারওয়াল নিয়ম তৈরি করুন:

gcloud compute firewall-rules create allow-health-check \
    --allow tcp:8080-8081 \
    --source-ranges 130.211.0.0/22,35.191.0.0/16 \
    --network default

তাদের নিজ নিজ পরিষেবাগুলিতে স্বাস্থ্য পরীক্ষাগুলি প্রয়োগ করুন:

gcloud compute instance-groups managed update fancy-fe-mig \
    --health-check fancy-fe-hc \
    --initial-delay 300
gcloud compute instance-groups managed update fancy-be-mig \
    --health-check fancy-be-hc \
    --initial-delay 300

কোডল্যাবটি চালিয়ে যান, যাতে অটো-হিলিং গ্রুপের ইনস্ট্যান্সগুলোকে মনিটর করার জন্য কিছুটা সময় পায়। পরবর্তীতে, অটো-হিলিং পরীক্ষা করার জন্য আপনি একটি ফেইলর সিমুলেট করবেন।

৬. লোড ব্যালেন্সার তৈরি করুন

আমাদের পরিচালিত ইনস্ট্যান্স গ্রুপগুলোর পরিপূরক হিসেবে, আপনি ফ্রন্টএন্ড ও ব্যাকএন্ড মাইক্রোসার্ভিসগুলোতে ট্র্যাফিক পৌঁছে দিতে HTTP(S) লোড ব্যালান্সিং ব্যবহার করবেন এবং পাথিং নিয়মের ওপর ভিত্তি করে সঠিক ব্যাকএন্ড সার্ভিসগুলোতে ট্র্যাফিক পাঠাতে ম্যাপিং ব্যবহার করবেন। এর ফলে সমস্ত সার্ভিসের জন্য একটি একক, লোড-ব্যালান্সড আইপি অ্যাড্রেস উন্মুক্ত হবে।

গুগল ক্লাউডে উপলব্ধ লোড ব্যালান্সিং বিকল্পগুলো সম্পর্কে আরও তথ্যের জন্য, লোড ব্যালান্সিং-এর ওভারভিউ দেখুন।

HTTP(S) লোড ব্যালেন্সিং তৈরি করুন

গুগল ক্লাউড বিভিন্ন ধরণের লোড ব্যালান্সিং সুবিধা দিলেও, আপনি আপনার ট্র্যাফিকের জন্য HTTP(S) লোড ব্যালান্সিং ব্যবহার করবেন। HTTP(S) লোড ব্যালান্সিং-এর গঠন নিম্নরূপ:

  1. একটি ফরওয়ার্ডিং রুল আগত অনুরোধগুলোকে একটি নির্দিষ্ট HTTP প্রক্সিতে প্রেরণ করে।
  2. টার্গেট HTTP প্রক্সি প্রতিটি অনুরোধকে একটি URL ম্যাপের সাথে মিলিয়ে যাচাই করে, যাতে অনুরোধটির জন্য উপযুক্ত ব্যাকএন্ড পরিষেবা নির্ধারণ করা যায়।
  3. ব্যাকএন্ড সার্ভিসটি তার সাথে সংযুক্ত ব্যাকএন্ডগুলোর পরিবেশন ক্ষমতা, জোন এবং ইনস্ট্যান্সের অবস্থার উপর ভিত্তি করে প্রতিটি অনুরোধকে উপযুক্ত ব্যাকএন্ডে প্রেরণ করে। প্রতিটি ব্যাকএন্ড ইনস্ট্যান্সের অবস্থা একটি HTTP হেলথ চেকের মাধ্যমে যাচাই করা হয়। যদি ব্যাকএন্ড সার্ভিসটি HTTPS বা HTTP/2 হেলথ চেক ব্যবহার করার জন্য কনফিগার করা থাকে, তাহলে অনুরোধটি ব্যাকএন্ড ইনস্ট্যান্সে যাওয়ার পথে এনক্রিপ্ট করা হবে।
  4. লোড ব্যালেন্সার এবং ইনস্ট্যান্সের মধ্যে সেশনগুলি HTTP, HTTPS, বা HTTP/2 প্রোটোকল ব্যবহার করতে পারে। যদি আপনি HTTPS বা HTTP/2 ব্যবহার করেন, তাহলে ব্যাকএন্ড সার্ভিসের প্রতিটি ইনস্ট্যান্সে অবশ্যই একটি SSL সার্টিফিকেট থাকতে হবে।

এমন হেলথ চেক তৈরি করুন যা নির্ধারণ করতে ব্যবহৃত হবে যে প্রতিটি সার্ভিসের জন্য কোন ইনস্ট্যান্সগুলো ট্র্যাফিক পরিচালনা করতে সক্ষম।

gcloud compute http-health-checks create fancy-fe-frontend-hc \
  --request-path / \
  --port 8080
gcloud compute http-health-checks create fancy-be-orders-hc \
  --request-path /api/orders \
  --port 8081
gcloud compute http-health-checks create fancy-be-products-hc \
  --request-path /api/products \
  --port 8082

এমন ব্যাকএন্ড সার্ভিস তৈরি করুন যা লোড-ব্যালেন্সড ট্র্যাফিকের লক্ষ্যবস্তু হবে। এই ব্যাকএন্ড সার্ভিসগুলো আপনার তৈরি করা হেলথ চেক এবং নেমড পোর্টগুলো ব্যবহার করবে।

gcloud compute backend-services create fancy-fe-frontend \
  --http-health-checks fancy-fe-frontend-hc \
  --port-name frontend \
  --global
gcloud compute backend-services create fancy-be-orders \
  --http-health-checks fancy-be-orders-hc \
  --port-name orders \
  --global
gcloud compute backend-services create fancy-be-products \
  --http-health-checks fancy-be-products-hc \
  --port-name products \
  --global

ব্যাকএন্ড সার্ভিসগুলো যোগ করুন।

gcloud compute backend-services add-backend fancy-fe-frontend \
  --instance-group fancy-fe-mig \
  --instance-group-zone us-central1-f \
  --global
gcloud compute backend-services add-backend fancy-be-orders \
  --instance-group fancy-be-mig \
  --instance-group-zone us-central1-f \
  --global
gcloud compute backend-services add-backend fancy-be-products \
  --instance-group fancy-be-mig \
  --instance-group-zone us-central1-f \
  --global

একটি ইউআরএল ম্যাপ তৈরি করুন। ইউআরএল ম্যাপটি নির্ধারণ করে যে কোন ইউআরএল কোন ব্যাকএন্ড সার্ভিসে নির্দেশিত হবে।

gcloud compute url-maps create fancy-map \
  --default-service fancy-fe-frontend

/api/orders এবং /api/products পাথগুলোকে তাদের নিজ নিজ সার্ভিসে রাউট করার অনুমতি দিতে একটি পাথ ম্যাচিং টুল তৈরি করুন।

gcloud compute url-maps add-path-matcher fancy-map \
   --default-service fancy-fe-frontend \
   --path-matcher-name orders \
   --path-rules "/api/orders=fancy-be-orders,/api/products=fancy-be-products"

তৈরি করা ইউআরএল ম্যাপের সাথে সংযুক্ত প্রক্সিটি তৈরি করুন।

gcloud compute target-http-proxies create fancy-proxy \
  --url-map fancy-map

একটি গ্লোবাল ফরওয়ার্ডিং রুল তৈরি করুন যা একটি পাবলিক আইপি অ্যাড্রেস এবং পোর্টকে প্রক্সির সাথে সংযুক্ত করে।

gcloud compute forwarding-rules create fancy-http-rule \
  --global \
  --target-http-proxy fancy-proxy \
  --ports 80

কনফিগারেশন আপডেট করুন

এখন যেহেতু আপনার একটি নতুন স্ট্যাটিক আইপি অ্যাড্রেস আছে, তাই আপনাকে ফ্রন্টএন্ডের কোডটি আপডেট করতে হবে যাতে এটি পূর্বে ব্যবহৃত ব্যাকএন্ড ইনস্ট্যান্সকে নির্দেশকারী ক্ষণস্থায়ী অ্যাড্রেসটির পরিবর্তে নতুন অ্যাড্রেসটিকে নির্দেশ করে।

ক্লাউড শেলে, react-app ফোল্ডারে যান, যেখানে কনফিগারেশন ধারণকারী .env ফাইলটি রয়েছে।

cd ~/monolith-to-microservices/react-app/

লোড ব্যালান্সারের আইপি অ্যাড্রেসটি খুঁজুন:

gcloud compute forwarding-rules list --global

উদাহরণ আউটপুট:

NAME                    REGION  IP_ADDRESS     IP_PROTOCOL  TARGET
fancy-http-rule          34.102.237.51  TCP          fancy-proxy

আপনার পছন্দের টেক্সট এডিটর (যেমন GNU nano) দিয়ে .env ফাইলটি সম্পাদনা করে লোড ব্যালান্সারের পাবলিক আইপি অ্যাড্রেসটি নির্দেশ করুন। [LB_IP] হলো ব্যাকএন্ড ইনস্ট্যান্সের এক্সটার্নাল আইপি অ্যাড্রেস।

REACT_APP_ORDERS_URL=http://[LB_IP]/api/orders
REACT_APP_PRODUCTS_URL=http://[LB_IP]/api/products

react-app-টি রি-বিল্ড করুন, যা ফ্রন্টএন্ড কোড আপডেট করবে।

cd ~/monolith-to-microservices/react-app
npm install && npm run-script build

অ্যাপ্লিকেশন কোডটি GCS বাকেটে কপি করুন।

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

ফ্রন্টএন্ড ইনস্ট্যান্সগুলি আপডেট করুন

এখন আপনি চান যে ম্যানেজড ইনস্ট্যান্স গ্রুপের ফ্রন্টএন্ড ইনস্ট্যান্সগুলো নতুন কোডটি পুল করুক। আপনার ইনস্ট্যান্সগুলো স্টার্টআপের সময় কোডটি পুল করে, তাই আপনি একটি রোলিং রিস্টার্ট কমান্ড জারি করতে পারেন।

gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \
    --max-unavailable 100%

ওয়েবসাইটটি পরীক্ষা করুন

ইনস্ট্যান্সগুলোকে প্রসেস হওয়ার জন্য সময় দিতে , রোলিং-অ্যাকশন রিস্টার্ট কমান্ডটি দেওয়ার পর প্রায় ৩০ সেকেন্ড অপেক্ষা করুন। এরপর, তালিকায় ইনস্ট্যান্সগুলো না আসা পর্যন্ত ম্যানেজড ইনস্ট্যান্স গ্রুপের স্ট্যাটাস চেক করতে থাকুন।

watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig

তালিকায় আইটেমগুলো প্রদর্শিত হওয়ার পর, Control+C (Macintosh-এ Command+C ) চেপে watch কমান্ড থেকে বেরিয়ে আসুন।

পরিষেবাটি স্বাস্থ্যকর হিসেবে তালিকাভুক্ত আছে কিনা তা নিশ্চিত করুন।

watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global

উদাহরণ আউটপুট:

---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
  healthStatus:
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
    ipAddress: 10.128.0.7
    port: 8080
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
    ipAddress: 10.128.0.11
    port: 8080
  kind: compute#backendServiceGroupHealth

তালিকায় আইটেমগুলো দেখা গেলে, Control+C (Macintosh-এ Command+C ) চেপে watch কমান্ড থেকে বেরিয়ে আসুন।

এরপর অ্যাপ্লিকেশনটি http://[LB_IP] এর মাধ্যমে অ্যাক্সেস করা যাবে, যেখানে [LB_IP] হলো লোড ব্যালান্সারের জন্য নির্দিষ্ট করা IP_ADDRESS, যা নিম্নলিখিত কমান্ডের মাধ্যমে খুঁজে পাওয়া যাবে:

gcloud compute forwarding-rules list --global

৭. কম্পিউট ইঞ্জিনের স্কেলিং

এখন পর্যন্ত, আপনি দুটি করে ইনস্ট্যান্স সহ দুটি ম্যানেজড ইনস্ট্যান্স গ্রুপ তৈরি করেছেন। কনফিগারেশনটি সম্পূর্ণ কার্যকরী, কিন্তু লোড নির্বিশেষে এটি একটি স্থির কনফিগারেশন। এখন, আপনি প্রতিটি ম্যানেজড ইনস্ট্যান্স গ্রুপকে স্বয়ংক্রিয়ভাবে স্কেল করার জন্য ইউটিলাইজেশনের উপর ভিত্তি করে একটি অটোস্কেলিং পলিসি তৈরি করবেন।

ব্যবহারের ভিত্তিতে স্বয়ংক্রিয়ভাবে আকার পরিবর্তন করুন

অটোস্কেলিং পলিসি তৈরি করতে, ক্লাউড শেলে নিম্নলিখিত কমান্ডগুলো চালান। এগুলো ম্যানেজড ইনস্ট্যান্স গ্রুপগুলোতে একটি অটোস্কেলার তৈরি করবে, যা লোড ব্যালান্সারের ইউটিলাইজেশন ৬০% এর বেশি হলে স্বয়ংক্রিয়ভাবে ইনস্ট্যান্স যুক্ত করবে এবং ৬০% এর কম হলে ইনস্ট্যান্স সরিয়ে দেবে।

gcloud compute instance-groups managed set-autoscaling \
  fancy-fe-mig \
  --max-num-replicas 5 \
  --target-load-balancing-utilization 0.60
gcloud compute instance-groups managed set-autoscaling \
  fancy-be-mig \
  --max-num-replicas 5 \
  --target-load-balancing-utilization 0.60

কন্টেন্ট-ডেলিভারি নেটওয়ার্ক সক্রিয় করুন

স্কেলিং-এ সাহায্য করতে পারে এমন আরেকটি বৈশিষ্ট্য হলো ক্লাউড সিডিএন (Cloud CDN)—একটি কন্টেন্ট-ডেলিভারি নেটওয়ার্ক পরিষেবা—সক্ষম করা, যা ফ্রন্টএন্ড সার্ভিসের জন্য ক্যাশিং সরবরাহ করে। এটি করার জন্য, আপনি আপনার ফ্রন্টএন্ড সার্ভিসে নিম্নলিখিত কমান্ডটি চালাতে পারেন:

gcloud compute backend-services update fancy-fe-frontend \
    --enable-cdn --global

এখন, যখন কোনো ব্যবহারকারী লোড ব্যালেন্সার থেকে কন্টেন্টের জন্য অনুরোধ করেন, তখন সেই অনুরোধটি একটি গুগল ফ্রন্টএন্ডে পৌঁছায়, যেটি প্রথমে ব্যবহারকারীর অনুরোধের প্রতিক্রিয়া খোঁজার জন্য ক্লাউড সিডিএন ক্যাশে দেখে। যদি ফ্রন্টএন্ডটি কোনো ক্যাশ করা প্রতিক্রিয়া খুঁজে পায়, তবে এটি সেই ক্যাশ করা প্রতিক্রিয়াটি ব্যবহারকারীর কাছে পাঠিয়ে দেয়। একে ক্যাশ হিট বলা হয়।

অন্যথায়, যদি ফ্রন্টএন্ড অনুরোধটির জন্য কোনো ক্যাশ করা প্রতিক্রিয়া খুঁজে না পায়, তবে এটি সরাসরি ব্যাকএন্ডে একটি অনুরোধ পাঠায়। যদি সেই অনুরোধের প্রতিক্রিয়াটি ক্যাশেযোগ্য হয়, তবে ফ্রন্টএন্ড প্রতিক্রিয়াটি ক্লাউড সিডিএন ক্যাশে সংরক্ষণ করে, যাতে পরবর্তী অনুরোধগুলির জন্য ক্যাশেটি ব্যবহার করা যায়।

৮. ওয়েবসাইট আপডেট করুন

ইনস্ট্যান্স টেমপ্লেট আপডেট করা হচ্ছে

বিদ্যমান ইনস্ট্যান্স টেমপ্লেটগুলো সম্পাদনাযোগ্য নয়। তবে, যেহেতু আপনার ইনস্ট্যান্সগুলো স্টেটলেস এবং সমস্ত কনফিগারেশন স্টার্টআপ স্ক্রিপ্টের মাধ্যমে করা হয়, তাই আপনাকে কেবল তখনই ইনস্ট্যান্স টেমপ্লেট পরিবর্তন করতে হবে, যদি আপনি টেমপ্লেট সেটিংস কোর ইমেজটিই পরিবর্তন করতে চান। এখন, আপনি একটি বৃহত্তর মেশিন টাইপ ব্যবহার করার জন্য একটি সাধারণ পরিবর্তন করবেন এবং সেটি পুশ আউট করবেন।

ফ্রন্টএন্ড ইনস্ট্যান্সটি আপডেট করুন, যা ইনস্ট্যান্স টেমপ্লেটের ভিত্তি হিসেবে কাজ করে। আপডেটের সময়, আপনি ইনস্ট্যান্স টেমপ্লেটের ইমেজের আপডেট করা সংস্করণে একটি ফাইল রাখবেন, তারপর ইনস্ট্যান্স টেমপ্লেটটি আপডেট করবেন, নতুন টেমপ্লেটটি রোল আউট করবেন এবং নিশ্চিত করবেন যে ফাইলটি ম্যানেজড ইনস্ট্যান্স গ্রুপের ইনস্ট্যান্সগুলোতে বিদ্যমান আছে।

আপনি আপনার ইনস্ট্যান্স টেমপ্লেটের মেশিন টাইপটি f1-micro স্ট্যান্ডার্ড মেশিন টাইপ থেকে পরিবর্তন করে ৪ vCPU এবং ৩৮৪০ MiB RAM সহ একটি কাস্টম মেশিন টাইপে রূপান্তর করবেন।

ক্লাউড শেলে, ফ্রন্টএন্ড ইনস্ট্যান্সের মেশিন টাইপ পরিবর্তন করতে নিম্নলিখিত কমান্ডটি চালান:

gcloud compute instances set-machine-type frontend --machine-type custom-4-3840

নতুন ইনস্ট্যান্স টেমপ্লেট তৈরি করুন:

gcloud compute instance-templates create fancy-fe-new \
    --source-instance=frontend \
    --source-instance-zone=us-central1-a

ম্যানেজড ইনস্ট্যান্স গ্রুপে আপডেট করা ইনস্ট্যান্স টেমপ্লেটটি প্রয়োগ করুন:

gcloud compute instance-groups managed rolling-action start-update fancy-fe-mig \
    --version template=fancy-fe-new

আপডেটের অবস্থা পর্যবেক্ষণ করুন:

watch -n 2 gcloud compute instance-groups managed list-instances fancy-fe-mig

একবার আপনার RUNNING স্ট্যাটাসে একাধিক ইনস্ট্যান্স থাকলে, ACTION-কে None- এ সেট করুন এবং INSTANCE_TEMPLATE-কে নতুন টেমপ্লেটের নাম ( fancy-fe-new ) হিসেবে সেট করে, পরবর্তী কমান্ডে ব্যবহারের জন্য তালিকাভুক্ত মেশিনগুলোর মধ্যে একটির নাম কপি করুন।

ওয়াচ প্রসেসটি বন্ধ করতে Control+S (Macintosh-এ Command+S ) চাপুন।

ভার্চুয়াল মেশিনটি নতুন মেশিন টাইপ (custom-4-3840) ব্যবহার করছে কিনা তা দেখতে নিম্নলিখিতটি চালান, যেখানে [VM_NAME] হলো নতুন তৈরি করা ইনস্ট্যান্স:

gcloud compute instances describe [VM_NAME] | grep machineType

প্রত্যাশিত উদাহরণ আউটপুট:

machineType: https://www.googleapis.com/compute/v1/projects/project-name/zones/us-central1-f/machineTypes/custom-4-3840

ওয়েবসাইটে পরিবর্তন করুন

আপনার মার্কেটিং টিম আপনাকে আপনার সাইটের হোমপেজ পরিবর্তন করতে বলেছে। তারা মনে করে, আপনার কোম্পানি কী এবং আপনারা আসলে কী বিক্রি করেন, সে সম্পর্কে হোমপেজটি আরও তথ্যবহুল হওয়া উচিত। এই অংশে, মার্কেটিং টিমকে খুশি করার জন্য আপনি হোমপেজে কিছু টেক্সট যোগ করবেন! মনে হচ্ছে আপনার একজন ডেভেলপার ইতিমধ্যেই index.js.new নামে ফাইলটি তৈরি করে ফেলেছেন। আপনি ফাইলটি index.js-এ কপি করতে পারেন এবং আপনার পরিবর্তনগুলো সেখানে প্রতিফলিত হবে। যথাযথ পরিবর্তনগুলো করার জন্য নিচের নির্দেশাবলী অনুসরণ করুন।

নিম্নলিখিত কমান্ডগুলো চালান, আপডেট করা ফাইলটি সঠিক ফাইলের নামে কপি করুন এবং তারপর পরিবর্তনগুলো যাচাই করার জন্য এর বিষয়বস্তু প্রিন্ট করুন:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

ফলস্বরূপ কোডটি দেখতে এইরকম হবে:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

আপনি React কম্পোনেন্টগুলো আপডেট করেছেন, কিন্তু স্ট্যাটিক ফাইলগুলো তৈরি করার জন্য আপনাকে React অ্যাপটি বিল্ড করতে হবে। React অ্যাপটি বিল্ড করতে নিম্নলিখিত কমান্ডটি চালান এবং এটি monolith পাবলিক ডিরেক্টরিতে কপি করুন:

cd ~/monolith-to-microservices/react-app
npm install && npm run-script build

এরপর, কোডটি আপনার ক্লাউড স্টোরেজ বাকেটে আবার পুশ করুন।

cd ~
rm -rf monolith-to-microservices/*/node_modules
gsutil -m cp -r monolith-to-microservices gs://fancy-store-$DEVSHELL_PROJECT_ID/

রোলিং আপডেটের মাধ্যমে পরিবর্তনগুলো প্রয়োগ করুন।

আপডেটটি পেতে আপনি এখন সমস্ত ইনস্ট্যান্সকে জোর করে রিস্টার্ট করতে পারেন।

gcloud compute instance-groups managed rolling-action restart fancy-fe-mig \
    --max-unavailable=100%

রোলিং-অ্যাকশন রিস্টার্ট কমান্ডটি দেওয়ার পর প্রায় ৩০ সেকেন্ড অপেক্ষা করুন, যাতে ইনস্ট্যান্সগুলো প্রসেস হওয়ার জন্য সময় পায়, এবং তারপর তালিকায় ইনস্ট্যান্সগুলো না আসা পর্যন্ত ম্যানেজড ইনস্ট্যান্স গ্রুপের স্ট্যাটাস চেক করতে থাকুন।

watch -n 5 gcloud compute instance-groups list-instances fancy-fe-mig

তালিকায় আইটেমগুলো দেখা গেলে, Control+S (Macintosh-এ Command+S ) চেপে ওয়াচ কমান্ড থেকে বেরিয়ে আসুন।

সার্ভিসটি স্বাস্থ্যকর হিসেবে তালিকাভুক্ত আছে কিনা তা নিশ্চিত করতে নিম্নলিখিতটি চালান:

watch -n 5 gcloud compute backend-services get-health fancy-fe-frontend --global

উদাহরণ আউটপুট:

---
backend: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instanceGroups/fancy-fe-mig
status:
  healthStatus:
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-x151
    ipAddress: 10.128.0.7
    port: 8080
  - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/my-gce-codelab/zones/us-central1-a/instances/fancy-fe-cgrt
    ipAddress: 10.128.0.11
    port: 8080
  kind: compute#backendServiceGroupHealth

তালিকায় আইটেমগুলো প্রদর্শিত হওয়ার পর, Control+S (Macintosh-এ Command+S ) চেপে watch কমান্ড থেকে বেরিয়ে আসুন।

কন্টেন্ট-ডেলিভারি নেটওয়ার্কের মধ্যে ক্যাশ করা কন্টেন্ট বাতিল করতে এবং নতুন কন্টেন্ট প্রদর্শিত হওয়া নিশ্চিত করতে, নিম্নলিখিত কমান্ডটি চালান:

gcloud compute url-maps invalidate-cdn-cache fancy-map \
    --path "/*"

http://[LB_IP] এর মাধ্যমে ওয়েবসাইটে যান, যেখানে [LB_IP] হলো লোড ব্যালান্সারের জন্য নির্দিষ্ট করা IP_ADDRESS, যা নিম্নলিখিত কমান্ডের মাধ্যমে খুঁজে পাওয়া যাবে:

gcloud compute forwarding-rules list --global

ওয়েবসাইটের নতুন পরিবর্তনগুলো এখন দেখা যাওয়ার কথা।

b081b8e885bf0723.png

ব্যর্থতা অনুকরণ করুন

হেলথ চেকটি কাজ করছে কিনা তা নিশ্চিত করতে, একটি ইনস্ট্যান্সে লগ ইন করুন এবং সার্ভিসগুলো বন্ধ করুন। ইনস্ট্যান্সের নাম খুঁজে পেতে, নিম্নলিখিত কমান্ডটি চালান:

gcloud compute instance-groups list-instances fancy-fe-mig

সেখান থেকে, ইনস্ট্যান্সগুলোর মধ্যে একটিতে সিকিউর শেল দিয়ে প্রবেশ করুন, যেখানে INSTANCE_NAME হলো তালিকা থেকে নেওয়া ইনস্ট্যান্সগুলোর মধ্যে একটি:

gcloud compute ssh [INSTANCE_NAME]

এই ক্ষেত্রে, অ্যাপটি বন্ধ করতে supervisorctl ব্যবহার করুন।

sudo supervisorctl stop nodeapp; sudo killall node

ইনস্ট্যান্সটি থেকে প্রস্থান করুন।

exit

মেরামত কার্যক্রম পর্যবেক্ষণ করুন।

watch -n 5 gcloud compute operations list \
--filter='operationType~compute.instances.repair.*'

নিম্নলিখিত উদাহরণ আউটপুটটি খুঁজুন:

NAME                                                  TYPE                                       TARGET                                 HTTP_STATUS  STATUS  TIMESTAMP
repair-1568314034627-5925f90ee238d-fe645bf0-7becce15  compute.instances.repair.recreateInstance  us-central1-a/instances/fancy-fe-1vqq  200          DONE    2019-09-12T11:47:14.627-07:00

মেরামতটি লক্ষ্য করার পর, ওয়াচ কমান্ড থেকে বের হতে Control+C (Macintosh-এ Command+S ) চাপুন। এই পর্যায়ে, ম্যানেজড ইনস্ট্যান্স গ্রুপটি ইনস্ট্যান্সটিকে মেরামত করার জন্য পুনরায় তৈরি করে।

৯. পরিষ্কার করুন

প্রস্তুত হয়ে গেলে, সম্পাদিত সমস্ত কার্যকলাপ পরিষ্কার করার সবচেয়ে সহজ উপায় হলো প্রজেক্টটি ডিলিট করে দেওয়া। প্রজেক্টটি ডিলিট করলে কোডল্যাবের সময় তৈরি হওয়া লোড ব্যালেন্সার, ইনস্ট্যান্স, টেমপ্লেট এবং আরও অনেক কিছু মুছে যায়, যাতে কোনো অপ্রত্যাশিত পুনরাবৃত্ত চার্জ তৈরি না হয়। ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান, যেখানে PROJECT_ID হলো সম্পূর্ণ প্রজেক্ট আইডি, শুধু প্রজেক্টের নাম নয়।

gcloud projects delete [PROJECT_ID]

অনুরোধ করা হলে 'Y' লিখে মুছে ফেলার বিষয়টি নিশ্চিত করুন।

১০. অভিনন্দন!

আপনি Compute Engine-এ আপনার ওয়েবসাইট ডেপ্লয়, স্কেল এবং আপডেট করেছেন। আপনি এখন Compute Engine, ম্যানেজড ইনস্ট্যান্স গ্রুপ, লোড ব্যালান্সিং এবং হেলথ চেক বিষয়ে অভিজ্ঞ!