Load Balancer: L4 ও L7-এ traffic ভাগ করা
Load Balancers: L4 and L7
এই পাঠের সূচিপত্র
এই পাঠে যা শিখবেন
- Layer 4 ও Layer 7 routing আলাদা করা
- TLS termination ও upstream boundary
- Laravel-এর trusted proxy configuration
সমস্যা দিয়ে শুরু
দুটি Laravel server চলছে, কিন্তু public DNS শুধু প্রথমটির address জানায়। সেটি বন্ধ হলে দ্বিতীয়টি idle থেকেও user request পায় না। Load balancer একটি front door দিয়ে healthy backend-এ request বা connection পাঠায়। Backend বাড়ানোর সঙ্গে routing, failure detection ও client identity-এর প্রশ্নও আসে।
সহজ করে বুঝি
L4 balancer transport connection-এর তথ্য, যেমন IP ও port অনুযায়ী destination বেছে নেয়। HTTP path বোঝার সাধারণ দরকার নেই। L7 balancer HTTP decode করে host, path, headers বা cookies অনুযায়ী route করতে পারে। TLS edge-এ terminate করলে balancer request পড়তে পারে; passthrough হলে encrypted payload backend পর্যন্ত যায়। Balancer নিজেও redundancy, capacity ও configuration management দাবি করে। একটি বাক্স আঁকলে সেটি আর single point of failure নয় এমন ধরে নেওয়া ভুল।
পরিচিত একটি উপমা
বড় হাসপাতালের gate security রোগীকে একটি ভবনে পাঠায়—এটি coarse routing। Reception রোগের বিভাগ শুনে নির্দিষ্ট counter-এ পাঠায়—এটি application-aware routing। তবে reception কাজ করছে মানেই ডাক্তার প্রস্তুত, এমন নয়; health check আলাদা করে জানতে হয়।
নকশাটি দেখুন
Diagram লোড হচ্ছে…
Diagram-এর text flow দেখুন
flowchart TD C[HTTPS Client] --> L[Layer 7 TLS Balancer] L -->|HTTP private network| A[Laravel A] L -->|HTTP private network| B[Laravel B] A --> D[(Shared Database)] B --> D
Client TLS session balancer-এ শেষ হচ্ছে। Private upstream arrow-এ HTTP দেখানো, কিন্তু network requirement হলে এখানে HTTPS-ও রাখা যায়। দুই application একই durable database ব্যবহার করছে। তাই app redundancy database outage সামলায় না। Proxy original scheme ও client IP forwarding header-এ দিতে পারে; app সেগুলো শুধু trusted proxy থেকে গ্রহণ করবে।
PHP ও Laravel-এ প্রয়োগ
bootstrap/app.php-এর minimal configuration নিচে; বিদ্যমান routing, exception ও middleware options রেখে এতে trustProxies অংশটি যুক্ত করুন। 10.20.0.10 একটি উদাহরণ private proxy address; deployment-এর প্রকৃত controlled IP/range দিন। Proxy-কে inbound forwarded headers পরিষ্কার করে নিজস্ব মান বসাতে হবে। এই configuration balancer তৈরি করে না।
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Http\Request;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(web: __DIR__.'/../routes/web.php')
->withMiddleware(function (Middleware $middleware): void {
$middleware->trustProxies(
at: ['10.20.0.10'],
headers: Request::HEADER_X_FORWARDED_FOR
| Request::HEADER_X_FORWARDED_HOST
| Request::HEADER_X_FORWARDED_PORT
| Request::HEADER_X_FORWARDED_PROTO,
);
})->create();সুবিধা, সীমাবদ্ধতা ও trade-off
L4 routing protocol-neutral এবং TLS passthrough-এ useful। L7 routing route-specific limits, canary ও observability সহজ করে, কিন্তু certificate handling ও HTTP parsing complexity বাড়ায়। Internal TLS ব্যবহার security বাড়াতে পারে, operational certificate কাজও বাড়ে। Requirement, compliance ও trust boundary বিচার করে decision লিখুন। Backend app-এ request buffering থাকলে user latency balancer metric-এর সঙ্গে নাও মেলতে পারে।
সাধারণ ভুল
- সব internet client-এর forwarded IP trust করা।
- Balancer যোগ করে database capacity না দেখা।
- Health check ছাড়া dead backend-এ traffic পাঠানো।
আরও একটু গভীরে
Trusted proxy configuration ভুল হলে secure URL generation, redirect এবং rate limit identity ভুল হতে পারে। Direct backend access বন্ধ করে public traffic balancer দিয়ে আসা নিশ্চিত করা একটি কার্যকর boundary। HTTP request smuggling-এর মতো parser disagreement এড়াতে proxy/runtime upgrade ও consistent limits দরকার। Retry policy balancer-এ রাখলে non-idempotent request double execute হতে পারে; কোথায় retry হবে তা স্পষ্ট লিখুন।
মনে রাখুন
L4 connection বোঝে, L7 application message বোঝে। TLS কোথায় শেষ এবং forwarded identity কোথায় trust হবে তা design-এ দেখান। App replica শুধু app-এর failure domain বদলায়।
নিজে চেষ্টা করুন
Staging-এ একটি backend বন্ধ করে health detection ও error window মাপুন। Direct request-এ forged X-Forwarded-For পাঠিয়ে app যেন trust না করে যাচাই করুন। Public internet-এ open debug endpoint রাখবেন না।
নিজের বোঝা যাচাই করুন
1. L7 কেন path route করতে পারে?
এটি HTTP request parse করে। TLS encrypted থাকলে inspection-এর জন্য termination বা উপযুক্ত TLS boundary দরকার।
2. L4 কি HTTP-only?
না। Transport endpoint ভিত্তিক হওয়ায় অন্যান্য TCP workload-ও route করতে পারে; নির্দিষ্ট implementation-এর protocol support দেখুন।
3. Client IP কেন হারায়?
Backend connection balancer থেকে আসে। Original identity forwarded metadata-তে থাকতে পারে, তবে untrusted caller সেই metadata forge করতে পারে।
4. দুটি app হলেই highly available?
না। Balancer, database, network ও deployment-এর shared failures বিবেচনা করতে হবে। Independent failure domains ও tested failover দরকার।
5. Balancer request retry করবে?
শুধু safe policy-তে। Response হারানো POST backend-এ সফল হয়ে থাকতে পারে; blindly retry করলে duplicate business effect হয়।
আরও পড়ুন
এই পাঠের কুইজ
এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।
এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।
জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।
অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।