Vertical ও Horizontal Scaling: সার্ভার বড় করব, না বাড়াব
Vertical and Horizontal Scaling
এই পাঠের সূচিপত্র
এই পাঠে যা শিখবেন
- Vertical ও horizontal scaling বেছে নেওয়া
- App ও database bottleneck আলাদা করা
- Scale করার আগে state ও measurement পরীক্ষা
সমস্যা দিয়ে শুরু
Campaign-এর দিন PHP worker-এর queue বড় হচ্ছে। Team একটি বড় server কিনতে চায়; অন্যজন আরও তিনটি app instance চান। কিন্তু ধীরতার কারণ database-এ missing index হলে দুই পথেই database-এর ওপর বেশি চাপ আসতে পারে। Scaling decision-এর আগে bottleneck জানা দরকার।
সহজ করে বুঝি
Vertical scaling হলো একটি machine-এর CPU, RAM বা অন্য capacity বাড়ানো। Horizontal scaling হলো আরও instance যোগ করে কাজ ভাগ করা। Vertical approach operation সহজ রাখতে পারে, কিন্তু machine size-এর সীমা ও replacement-এর ঝুঁকি আছে। Horizontal approach redundancy ও independent capacity দিতে পারে, তবে load balancing ও shared state লাগে।
Scaling app tier-এর আর database write tier-এর সমস্যা এক নয়। App instance বাড়লে database connection, lock contention এবং query rate বাড়তে পারে। End-to-end path মাপতে হবে।
পরিচিত একটি উপমা
একটি দোকানে বড় counter ও দ্রুত cashier বসানো vertical scaling-এর মতো। আরও counter খুলে customer ভাগ করা horizontal scaling। কিন্তু সব counter যদি একটি মাত্র stock খাতা নিয়ে টানাটানি করে, তখন খাতাই bottleneck।
নকশাটি দেখুন
Diagram লোড হচ্ছে…
Diagram-এর text flow দেখুন
flowchart TD U[Users] --> L[Load Balancer] L --> A[Laravel A] L --> B[Laravel B] L --> C[Laravel C] A --> D[(Shared Database)] B --> D C --> D A --> R[(Shared Session Store)] B --> R C --> R
প্রথমে baseline latency, errors, CPU, memory ও DB wait মাপুন। এরপর application stateless করুন। Instance যোগ করে সমান workload-এ আবার মাপুন। Expected improvement না এলে shared dependency, load-balancing policy বা resource limit পরীক্ষা করুন।
PHP ও Laravel-এ প্রয়োগ
একাধিক app instance থেকে Scheduler চালালে একই command একাধিকবার শুরু হতে পারে। Laravel-এর onOneServer scheduler election shared supported cache-এর ওপর নির্ভর করে। নিচে routes/console.php-এর example; default cache সব instance-এ একই supported central store হতে হবে। Command-টি নিজেও retry-safe করুন।
use Illuminate\Support\Facades\Schedule;
Schedule::command('reports:daily')
->dailyAt('02:00')
->onOneServer()
->withoutOverlapping(30);সুবিধা, সীমাবদ্ধতা ও trade-off
একটি বড় instance ছোট team-এর জন্য সহজ ও সাশ্রয়ী হতে পারে। Horizontal setup rolling deployment ও fault isolation দেয়, কিন্তু configuration consistency, shared storage, coordination ও observability-এর খরচ আছে। বেশি instance সব workload-এ linear speedup দেয় না।
সাধারণ ভুল
- App instance বাড়িয়ে unbounded DB connection খোলা।
- Upload local disk-এ রেখেই round-robin routing চালু করা।
- Shared scheduler lock-কে job exactly-once guarantee ভাবা।
- Load test ছাড়াই autoscaling threshold ঠিক করা।
আরও একটু গভীরে
Autoscaling-এর lag আছে। নতুন instance boot, warm-up ও health check শেষ করতে সময় লাগে। Sudden spike-এর জন্য headroom, queue limit ও load shedding দরকার হতে পারে। CPU-only signal I/O-bound PHP workload-এর saturation পুরোপুরি ধরতে নাও পারে।
মনে রাখুন
- Bottleneck মেপে scale করুন।
- Application state ও shared dependency আগে audit করুন।
- Horizontal scaling coordination-এর নতুন দায়িত্ব আনে।
নিজে চেষ্টা করুন
একটি Laravel app-এর CPU ৩০%, কিন্তু p99 latency বেশি এবং database lock wait বাড়ছে। আরও app instance যোগের আগে কোন তিনটি জিনিস পরীক্ষা করবেন?
নিজের বোঝা যাচাই করুন
1. Horizontal scaling কী?
একই দায়িত্বের আরও instance যোগ করে workload ভাগ করা।
2. বেশি instance মানেই দ্রুত query?
না। Shared database bottleneck হলে query আরও প্রতিযোগিতায় পড়তে পারে।
3. onOneServer কী চায়?
সব scheduler instance-এর জন্য একই supported central cache store এবং consistent configuration।
4. Scheduler lock কি external side effect একবারই করে?
না। Process crash বা retry-এর জন্য business operation-ও idempotent হওয়া দরকার।
5. Autoscaling instant নয় কেন?
Instance startup, application warm-up, readiness এবং routing update-এর সময় লাগে।
আরও পড়ুন
এই পাঠের কুইজ
এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।
এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।
জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।
অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।