6.2
Load Balancing, Health Check আর TCP বনাম UDP
Load Balancer কী করে, health check, এমন Security Group যেটা শুধু LB-কেই ঢুকতে দেয়, আর transport layer-এর কথা একটু ঝালিয়ে নেওয়া।
24 মিনিট পড়া + Animation
টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।
এই লেসন শেষে তুমি যা পারবে
- load balancer আসলে কী করে, আর server-দের কাঁধ থেকে কোন কোন কাজ নামিয়ে নেয়, তা বুঝিয়ে বলতে পারবে: একটা DNS নাম, ভার ভাগ করা, health check, TLS offload, stickiness, কয়েকটা AZ জুড়ে চালু থাকা, আর public আর private traffic আলাদা রাখা।
- নিজে load balancer চালানোর চেয়ে managed Elastic Load Balancer কেন সাধারণত ভালো, আর এটা কোন কোন service-এর সাথে জোড়া লাগে, তা বলতে পারবে।
- চার ধরনের ELB (CLB, ALB, NLB, GWLB) layer আর protocol দেখে আলাদা করতে পারবে, আর কোনটা আগের প্রজন্মের তা জানবে।
- health check সাজাতে পারবে (protocol, port, path, interval, timeout, threshold, success code), ALB আর NLB-এর এখনকার default মাথায় রেখে, আর একটা গোলমাল ধরা পড়তে কত সময় লাগবে তা হিসাব করতে পারবে।
- target-এর health state পড়তে পারবে, fail-open কী তা বোঝাতে পারবে, আর “running কিন্তু unhealthy” instance-এর সমস্যা খুঁজে বের করতে পারবে।
- instance-গুলোকে এমনভাবে আটকাতে পারবে যাতে তারা শুধু load balancer-এর security group থেকেই traffic নেয়, ALB আর NLB দুটোতেই।
- client-কে কেন load balancer-এর DNS নামই ব্যবহার করতে হয়, আর TCP না UDP, এটা কীভাবে ঠিক করে দেয় কোন load balancer চলবে, তা ব্যাখ্যা করতে পারবে।
#load balancer আসলে কী
লেসন ৬.১-এর শেষে আমাদের application চলছিল কয়েকটা EC2 instance-এ, অন্তত দুটো Availability Zone জুড়ে। তাহলে একটা সোজা প্রশ্ন ওঠে: user-রা কোন address-এ connect করবে? একটা instance-এর IP দিলে সব traffic ওই একটার ঘাড়েই পড়বে, আর সেটাই হয়ে যাবে single point of failure। আবার IP-এর একটা তালিকা দিলে প্রতিটা client-কে নিজে একটা বেছে নিতে হবে, সেটা মরে গেলে টের পেতে হবে, তারপর আরেকটায় যেতে হবে।
এই সমস্যার সমাধানই load balancer। এটা একটা server (AWS-এ আসলে অনেকগুলো server-এর একটা দল, যেটা তুমি কখনো দেখো না), যেটা তোমার instance-দের সামনে বসে থাকে, প্রতিটা client connection নিজে নেয়, আর প্রতিটা request পেছনের কয়েকটা server-এর কোনো একটার কাছে পাঠিয়ে দেয়। পেছনের এই server-গুলোকে বলে target। client-রা কথা বলে শুধু load balancer-এর সাথেই।
#load balancer কেন লাগে
| কাজ | বাস্তবে এর মানে |
|---|---|
| ভার ভাগ করা | request-গুলো অনেক instance-এর মধ্যে ভাগ হয়, তাই instance যোগ করেই scale করা যায় (horizontal scaling, লেসন ৬.১)। |
| ঢোকার একটাই দরজা | client-রা একটাই DNS নাম ব্যবহার করে। তার পেছনে instance যোগ, বদল বা সরানো যায়, কাউকে জানাতে হয় না। |
| নষ্ট server সামলানো | কোনো instance মরে গেলে load balancer তাকে traffic পাঠানো বন্ধ করে দেয়। user কখনো মরা server-টা দেখে না। |
| Health check | প্রত্যেক target-কে বারবার পরীক্ষা করে, তাই request পাঠানোর আগেই জানে কে উত্তর দিতে পারবে। |
| TLS termination | HTTPS certificate নিজের কাছে রেখে traffic decrypt করে, instance-দের আর সেই কষ্ট করতে হয় না (বিস্তারিত লেসন ৬.৪-এ)। |
| Stickiness | চাইলে একটা cookie দিয়ে একজন user-কে একই instance-এ রাখে (লেসন ৬.৪)। |
| কয়েকটা AZ জুড়ে চালু থাকা | load balancer নিজেও তোমার চালু করা প্রতিটা AZ-এ চলে, আর সবগুলো AZ-এর target-এ traffic পাঠায়। |
| public আর private আলাদা | load balancer বসে public subnet-এ, internet-এর মুখোমুখি; instance-গুলো থাকে private subnet-এ, কোনো public IP ছাড়াই। |
সামনে একটা নাম, পেছনে চারটা server, দুটো AZ
User-রা শুধু load balancer-এর DNS নামটা চেনে। load balancer request-গুলো দুই AZ-এর healthy target-দের মধ্যে ভাগ করে দেয়, আর প্রত্যেককে বারবার পরীক্ষা করতে থাকে।
পরিস্থিতি
User-রা একটাই নাম লেখে, ধরো shop.example.com, যেটা load balancer-কে দেখায়। পেছনে কয়টা server আছে বা তাদের IP কী, সেটা কারও জানার দরকার নেই।
#managed load balancer কেন: Elastic Load Balancing
চাইলে তুমি একটা EC2 instance-এ HAProxy বা Nginx বসিয়ে নিজেই load balancer চালাতে পারো। কিন্তু তখন তার সব ঝামেলাও তোমার: এখন সেটাই তোমার single point of failure, তাই দুটো AZ-এ দুটো লাগবে, একটা থেকে আরেকটায় failover করার ব্যবস্থা লাগবে, patch দিতে হবে, traffic বাড়লে scale করতে হবে, certificate, log, monitoring সব তোমার।
Elastic Load Balancing (ELB) হলো এর managed রূপ:
- AWS নিশ্চয়তা দেয় যে এটা চলবে: তোমার বেছে নেওয়া AZ-গুলো জুড়ে চলে, নষ্ট node বদলে দেয়, আর traffic বদলালে নিজের ক্ষমতা নিজেই বাড়ায়-কমায়।
- upgrade, maintenance আর high availability সব AWS-এর দায়িত্ব। পুরো একটা server দেখাশোনার বদলে তুমি পাও অল্প কয়েকটা setting (listener, rule, target group, health check)।
- AWS-এর বাকি service-গুলোর সাথে জোড়া (পরের অংশে দেখবে)।
- খরচ: শুধু বিল দেখলে একটা instance-এ চালানো ছোট্ট নিজের proxy ELB-এর চেয়ে সস্তা মনে হতে পারে (us-east-1-এ একটা ALB শুরু হয় মাসে মোটামুটি $16 থেকে, ব্যবহার অনুযায়ী capacity-র খরচ এর বাইরে)। কিন্তু availability-র জন্য দ্বিতীয় instance যোগ করো আর এটা চালাতে যে ঘণ্টাগুলো যায় সেগুলো গোনো, তাহলে সব মিলিয়ে managed service-ই প্রায় সবসময় সস্তা পড়ে। পরীক্ষার প্রশ্নে “least operational overhead” দেখলে উত্তর ELB-এর দিকে।
#ELB-এর পরিবার
AWS চার ধরনের managed load balancer দেয়:
| ধরন | সাল | Layer | Protocol | কখন নেবে |
|---|---|---|---|---|
| Classic Load Balancer (CLB) | ২০০৯ | ৪ আর ৭ | HTTP, HTTPS, TCP, SSL (TCP-এর ওপর TLS) | নতুন কিছুর জন্য না। আগের প্রজন্ম। |
| Application Load Balancer (ALB) | ২০১৬ | ৭ (application) | HTTP, HTTPS, HTTP/2, WebSocket, gRPC | Web app আর API, path বা host name দেখে routing, microservice, Lambda target |
| Network Load Balancer (NLB) | ২০১৭ | ৪ (transport) | TCP, UDP, TLS (২০২৫-এর শেষ থেকে QUIC passthrough-ও) | চরম performance, খুব কম latency, UDP, static IP, HTTP ছাড়া অন্য protocol |
| Gateway Load Balancer (GWLB) | ২০২০ | ৩ (network) | IP packet, GENEVE-এ মোড়ানো | third-party firewall, IDS/IPS আর অন্য virtual appliance traffic-এর পথে বসানো |
আসল কথাটা হলো layer। ALB প্রতিটা HTTP request খুলে তার path, header আর host name পড়তে পারে। NLB কখনো ভেতরে তাকায় না: শুধু IP address আর port দেখে connection আর datagram পাঠিয়ে দেয়, এই জন্যই সে এত দ্রুত। GWLB পুরো IP packet একদল appliance-এর কাছে পাঠায়। প্রত্যেকটা নিয়ে গভীরে যাব লেসন ৬.৩-এ; আপাতত layer আর protocol মনে রাখো।
- Internet-facing না internal: GWLB ছাড়া সব ধরনই internet-facing (public DNS নাম, public IP-ওয়ালা node, public subnet-এ) বা internal (শুধু private IP, VPC আর তার সাথে জোড়া network-এর ভেতর থেকে পৌঁছানো যায়) হিসেবে বানানো যায়। চেনা three-tier design-এ দুটোই থাকে: web tier-এর জন্য internet-facing ALB, আর application tier-এর সামনে একটা internal ALB।
- AZ: ALB-কে অন্তত দুটো AZ-এর subnet-এ বসাতেই হয়। NLB একটা AZ-এও চলে, তবে production-এ দুই বা তার বেশি AZ-ই রাখা উচিত।
#ELB কাদের সাথে জোড়া লাগে
load balancer একা কাজ করে না; সে traffic নিয়ে অন্য service-কে দেয়, আর certificate, নাম আর সুরক্ষার জন্য আরও কয়েকটা service ব্যবহার করে।
| Service | ELB-এর সাথে কীভাবে কাজ করে |
|---|---|
| EC2 | instance হলো সবচেয়ে চেনা target। |
| EC2 Auto Scaling group | ASG নতুন instance-কে target group-এ register করে, scale-in-এর সময় deregister করে, আর load balancer-এর health check দেখে খারাপ instance বদলে দিতে পারে (লেসন ৬.৫)। |
| Amazon ECS | container-গুলো target হিসেবে register হয় (IP target), প্রতিটা task নিজের port-এ। |
| AWS Lambda | ALB একটা Lambda function-কে target হিসেবে ডাকতে পারে। |
| AWS Certificate Manager (ACM) | বিনামূল্যের public TLS certificate, HTTPS/TLS listener-এ লাগানো হয়, নিজে থেকেই renew হয় (লেসন ৬.৪)। |
| Amazon CloudWatch | request count, latency, 5xx error, healthy/unhealthy host-এর সংখ্যার মতো metric, আর সেগুলোর ওপর alarm। access log যায় S3-এ। |
| Amazon Route 53 | একটা alias record তোমার domain (shop.example.com, এমনকি zone apex example.com-ও) load balancer-এর DNS নামের দিকে দেখায় (chapter ৮)। |
| AWS WAF | ALB-এ লাগানো একটা web application firewall, যেটা SQL injection, cross-site scripting, খারাপ bot আর অতিরিক্ত request তোমার code-এ পৌঁছানোর আগেই ছেঁকে ফেলে। |
| AWS Global Accelerator | ALB বা NLB-এর সামনে দুটো static anycast IP, যেটা user-দের AWS-এর নিজের backbone দিয়ে নিয়ে আসে (chapter ১১)। |
#Health check
load balancer চোখ বন্ধ করে traffic পাঠায় না। সে প্রত্যেক target-কে বারবার জিজ্ঞেস করে “তুমি কি সামলাতে পারবে?”, আর যারা বারবার হ্যাঁ বলে, শুধু তাদেরকেই request দেয়। health check সাজানো হয় target group-এ, মানে listener যে target-গুলোর দলে traffic পাঠায় সেখানে (target group নিয়ে বিস্তারিত লেসন ৬.৩-এ)।
#কী পরীক্ষা করা হয়
health check হলো ছোট্ট একটা request, যেটা load balancer একটা নির্দিষ্ট সময় পরপর প্রত্যেক target-কে পাঠায়:
- Protocol: ALB-এর জন্য HTTP বা HTTPS (একটা HTTP
GET); NLB-এর জন্য TCP, HTTP বা HTTPS। TCP check শুধু প্রমাণ করে port-টা connection নিচ্ছে; HTTP check প্রমাণ করে application আসলেই উত্তর দিচ্ছে। - Port: default হলো traffic port, মানে target যে port-এ request পায় সেটাই। চাইলে অন্য port দিতে পারো, যেমন 8080-এর মতো আলাদা একটা admin port।
- Path: HTTP/HTTPS check-এর জন্য কোন URL চাওয়া হবে। default হলো
/, কিন্তু/health-এর মতো আলাদা একটা endpoint অনেক ভালো: হালকা, login লাগে না, আর app-এর যা যা সত্যিই লাগে (database connection, disk-এর জায়গা) সেগুলো দেখে নিতে পারে। - Success code: কোন কোন HTTP status code পেলে healthy ধরা হবে। বাকি যেকোনো code, বা timeout-এর মধ্যে কোনো উত্তর না আসা মানেই ফেল।
#সময় আর threshold
| Setting | ALB target group-এর default | NLB target group-এর default | সীমা |
|---|---|---|---|
| Protocol | HTTP | TCP | ALB: HTTP, HTTPS। NLB: TCP, HTTP, HTTPS |
| Port | Traffic port | Traffic port | 1–65535 |
| Path | / | / (শুধু HTTP/HTTPS check-এ) | |
| Interval | ৩০ সে (Lambda target-এ ৩৫ সে) | ৩০ সে | ৫–৩০০ সে |
| Timeout | ৫ সে (Lambda-য় ৩০ সে) | TCP আর HTTPS-এ ১০ সে, HTTP-তে ৬ সে | ২–১২০ সে |
| Healthy threshold | টানা ৫টা সফল | ৫ | ২–১০ |
| Unhealthy threshold | টানা ২টা ফেল | ২ | ২–১০ |
| Success code | 200 | 200–399 | ALB 200–499 (gRPC 0–99, default 12)। NLB 200–599 |
সবচেয়ে জরুরি দুটো হিসাব:
- Unhealthy threshold × interval ≈ নষ্ট একটা target কতক্ষণ ধরে traffic পেতে থাকে। ALB-এর default-এ ২ × ৩০ সে = মোটামুটি ৬০ সেকেন্ড (target error না দিয়ে যদি আটকে থাকে, তাহলে সাথে ৫ সেকেন্ডের timeout যোগ হবে)।
- Healthy threshold × interval ≈ ঠিক হওয়া target আবার traffic পেতে কতক্ষণ অপেক্ষা করে: ৫ × ৩০ সে = ১৫০ সেকেন্ড।
ফেরত আসা ইচ্ছে করেই বাদ পড়ার চেয়ে ধীর, যাতে যে server বারবার crash করে আবার চালু হয়, সে service-এ ঢোকা-বের হওয়ার দোলায় না থাকে। একটা ব্যতিক্রম: target প্রথমবার register হলে ALB-তে healthy হতে তাকে একটা check পাস করলেই চলে।
একটা target-এর জীবন: health state-গুলো
ALB-এর default: ৩০ সেকেন্ড পরপর check, ৫ সেকেন্ডে উত্তর না এলে ফেল, টানা ২ বার ফেল করলে unhealthy, টানা ৫ বার পাস করলে আবার healthy। target group-এর নিচের badge-এ console-এ যে state দেখতে, সেটাই দেখানো আছে।
পরিস্থিতি
নতুন একটা instance target group-এ register করা হলো, তুমি করলে বা Auto Scaling group করল। এখনই সে traffic পায় না।
Health check-এর সময় হিসাবের যন্ত্র
একটা preset বেছে নাও বা slider সরাও। একটা target-এর app একটা সফল check-এর ঠিক পরেই নষ্ট হয় (সবচেয়ে খারাপ অবস্থা), পরে ঠিক করা হয়।
app কীভাবে নষ্ট হয়
এই target-এ প্রতি সেকেন্ডে request
নষ্ট হওয়ার timeline (সবচেয়ে খারাপ অবস্থা)
unhealthy চিহ্ন পড়বে
≈ 35–65 সে
2 × 30 + 5
ঠিক হওয়ার পর আবার চালু হবে
≈ 2m–2m 30 সে
5 × 30
নষ্ট target-এ যাওয়া request
≈ 1,300
20 × 65
সংখ্যা কমালে নষ্ট হওয়া দ্রুত ধরা পড়ে, কিন্তু একবার ধীর উত্তর এলেই target বাদ-ফেরত হতে থাকে, check-ও বেশি যায়। healthy threshold বেশি রাখলে যে server বারবার ঠিক-নষ্ট হয়, সে বেশিক্ষণ বাইরে থাকে।
#হাতে-কলমে হিসাব: দ্রুত failover-এর জন্য টিউন করা
একটা checkout service-এ প্রতি instance প্রতি সেকেন্ডে ৫০টা request পায়। কোনো instance আটকে গেলে ALB তাকে বাদ দেওয়ার আগে কয়টা request ফেল করবে?
- Default-এ (interval ৩০ সে, timeout ৫ সে, unhealthy threshold ২): সবচেয়ে খারাপ অবস্থায় ২ × ৩০ + ৫ = ৬৫ সে, তাই প্রায় ৫০ × ৬৫ = ৩,২৫০টা request ফেল।
- interval ১০ সে, timeout ৫ সে, unhealthy threshold ২ করলে: সবচেয়ে খারাপ অবস্থায় ২ × ১০ + ৫ = ২৫ সে, তাই প্রায় ১,২৫০টা।
ঘনঘন check দিলে সমস্যা আগে ধরা পড়ে, কিন্তু target-এর ওপর একটু বেশি চাপ পড়ে, আর একবার ধীর উত্তর এলেই ভালো একটা instance বাদ পড়ার সম্ভাবনা বাড়ে। বেশিরভাগ টিম latency-র ব্যাপারে স্পর্শকাতর service-এ interval ১০–১৫ সেকেন্ডে নামায়, বাকি জায়গায় default রাখে। client-এরও উচিত idempotent request আবার চেষ্টা করা, কারণ ধরা পড়ার ওই সময়টুকুতে কিছু request সবসময়ই নষ্ট target-এ গিয়ে পড়ে।
#Target-এর health state
target group-এর Targets tab-এ (EC2 console → Load Balancing → Target Groups) প্রত্যেক target-এর state দেখা যায়:
| State | মানে | নতুন request পায়? |
|---|---|---|
initial | register হচ্ছে, বা প্রথম health check চলছে | না |
healthy | health check পাস করছে | হ্যাঁ |
unhealthy | check-এ ফেল করেছে (Target.Timeout, Target.ResponseCodeMismatch, Target.FailedHealthChecks-এর মতো reason code সহ) | না (group fail open না করলে) |
unused | register করা না, target group কোনো listener ব্যবহার করে না, target-এর AZ load balancer-এ চালু না, বা instance stop/terminate করা | না |
draining | deregister হচ্ছে; চলতি request-গুলো শেষ করতে দেওয়া হচ্ছে (deregistration delay, লেসন ৬.৪) | না |
unavailable | ALB: health check বন্ধ (শুধু Lambda target-এ সম্ভব)। NLB: health-এর অবস্থা জানা যায়নি | অবস্থা বুঝে |
NLB-তে আরেকটা আছে, unhealthy.draining: unhealthy একটা target কিছুক্ষণের জন্য তার পুরোনো connection-গুলো চালিয়ে যায়, কিন্তু নতুন কোনোটা পায় না।
#সব target unhealthy হলে: fail open
একটা target group-এর সব target যদি একসাথে unhealthy হয় (চালু থাকা প্রতিটা AZ-এ), load balancer fail open করে: তবুও সবাইকে request পাঠায়, যেন সবাই healthy। যুক্তিটা হলো, কাউকে traffic না পাঠানো মানে নিশ্চিত outage, অথচ নষ্ট হয়ে থাকতে পারে health check নিজেই (/health path-এর নাম বদলে গেছে, check-এর ভেতরে থাকা কোনো dependency বন্ধ, কোনো security group বদলেছে)। target group খালি থাকলেও NLB fail open করে।
তাই “সব target unhealthy কিন্তু user-রা তবুও সেবা পাচ্ছে” কোনো bug না; এটা fail-open, আর এটা জোরালো ইঙ্গিত যে app না, health check-এর setting-ই ভুল। NLB-তে যখন শুধু একটা AZ-এ কোনো healthy target থাকে না, তখন ওই AZ-এর load balancer IP DNS থেকে সরিয়ে দেওয়া হয়, যাতে client-রা আর সেখানে না যায়।
#“running কিন্তু unhealthy”: সমস্যা খোঁজা
| লক্ষণ / reason code | সম্ভাব্য কারণ | সমাধান |
|---|---|---|
সব target-এ Target.Timeout, অথচ instance-এর ভেতর থেকে পরীক্ষা করলে app চলে | instance-এর security group load balancer-এর security group থেকে health check port খোলেনি (বা কোনো NACL আটকাচ্ছে) | load balancer-এর SG থেকে traffic port আর health check port দুটোই খুলে দাও |
একটা target-এ Target.Timeout, বাকিরা healthy | ওই instance-এ app crash করেছে বা আটকে আছে | restart করো বা বদলে দাও; ELB health check-এ ফেল করা instance ASG-কে দিয়ে বদলাও |
Target.ResponseCodeMismatch, code 404 | ভুল path: check এমন URL চাইছে যেটা app দেয় না | path ঠিক করো (/health) বা endpoint-টা বানাও |
Target.ResponseCodeMismatch, code 301/302 | path redirect করছে (HTTPS-এ বা login page-এ); ALB-এর default শুধু 200 মানে | login ছাড়া খোলে আর 200 দেয় এমন path-এ check দাও, বা success code বাড়াও (যেমন 200–399) |
| নতুন instance unhealthy হয়, আর ASG বারবার বদলাতে থাকে | ধীরে চালু হওয়া: app-এর গরম হতে কয়েক মিনিট লাগে, এর মধ্যে check-এ ফেল করে | ASG-এর health check grace period বাড়াও, app সত্যিই তৈরি হলে তবেই /health যেন 200 দেয়, আর চাইলে ALB-এর slow start mode দিয়ে traffic আস্তে আস্তে বাড়াও |
Target.NotInUse | target-এর AZ load balancer-এ চালু না, বা কোনো listener rule এই target group-এ পাঠায় না | AZ চালু করো (সেখানে একটা subnet যোগ করো) বা listener rule ঠিক করো |
Target.InvalidState-সহ unused | instance stop করা | চালু করো, বা ASG-কে বদলাতে দাও |
নিজেকে যাচাই করোপ্রশ্ন
একটা ALB target group-এ শুধু interval বদলে ১০ সেকেন্ড করা হয়েছে, বাকি সব default। একটা target হঠাৎ প্রতিটা health check-এ সাথে সাথে HTTP 503 দিতে শুরু করল। সবচেয়ে খারাপ অবস্থায় মোটামুটি কতক্ষণ পর ALB তাকে নতুন request পাঠানো বন্ধ করবে?
#Security group: শুধু load balancer-কেই বিশ্বাস করো
সবচেয়ে নিরাপদ design-এ internet থেকে কোনো instance-এ পৌঁছানোর পথ load balancer ছাড়া আর একটাও থাকে না। এটা বানাতে লাগে দুটো security group (লেসন ৩.৫):
| Security group | কার গায়ে লাগানো | Inbound rule | Source |
|---|---|---|---|
sg-alb | load balancer | TCP 443 (আর HTTPS-এ redirect করার জন্য 80) | 0.0.0.0/0 (IPv6-এর জন্য ::/0), বা internal app হলে আরও ছোট একটা range |
sg-app | instance-গুলো | TCP 80 (traffic port), আর health check port আলাদা হলে সেটাও | sg-alb (একটা security group reference, কোনো IP range না) |
IP range না দিয়ে security group reference কেন?
- load balancer scale করার সময় আর node বদলানোর সময় তার node-গুলোর IP address বদলে যায়। যে rule-এ
sg-albলেখা, সেটা ওই group লাগানো যেকোনো interface-এর সাথে মেলে, IP যাই হোক। - instance-এ
0.0.0.0/0rule থাকলে কেউ instance-এর address পেয়ে গেলেই (ভুল করে রাখা একটা public IP, বা peering করা কোনো network) load balancer, তার TLS, WAF rule আর log, সব এড়িয়ে সরাসরি ঢুকে যেতে পারে। - VPC CIDR দিলে
0.0.0.0/0-এর চেয়ে ভালো, কিন্তু তবুও VPC-র বাকি সব machine ঢুকতে পারে।
যে instance শুধু load balancer-কেই বিশ্বাস করে
load balancer-এর security group (sg-alb) internet-এর জন্য খোলা। instance-দের security group (sg-app) port 80 খোলে শুধু sg-alb থেকে, কোনো IP range থেকে না।
পরিস্থিতি
Security group rule (inbound)
| Group | Port | Source |
|---|---|---|
| sg-alb | 443, 80 | 0.0.0.0/0 |
| sg-app | 80 | sg-alb |
একজন user load balancer-এ HTTPS পাঠাল। sg-alb-এ 0.0.0.0/0 থেকে 443 খোলা, তাই ঢুকতে দিল।
#Network Load Balancer আর security group
বহু বছর NLB-এর কোনো security group-ই ছিল না। সে client-এর IP সোজা target পর্যন্ত পৌঁছে দিত, তাই instance-এর security group-এ খুলতে হতো client-দের IP range (প্রায়ই 0.0.0.0/0), সাথে health check-এর জন্য NLB-এর নিজের private IP। “শুধু NLB হয়ে এসো” বলার কোনো উপায় ছিল না।
আগস্ট ২০২৩ থেকে NLB-এ security group লাগানো যায়, আর একই chaining চলে: NLB-এর group client ছাঁকে, আর target-রা NLB-এর group-কে reference করে। যা মনে রাখতে হবে:
- security group লাগাতে হবে NLB বানানোর সময়েই। security group ছাড়া বানানো NLB-তে পরে আর কখনো লাগানো যায় না; নতুন NLB বানাতে হবে। অন্তত একটা থাকলে পরে যত খুশি বদলাতে পারো।
- Health check NLB-এর outbound rule মানে, inbound rule না। খেয়াল রাখো outbound rule যেন target-এর health check port আটকে না দেয়।
- target-দের NLB-এর group থেকে traffic port আর health check port দুটোই খুলতে হবে, client IP preservation চালু থাকলেও।
- interface VPC endpoint দিয়ে আসা traffic-এ NLB-এর inbound rule খাটবে কিনা, সেটা তুমি ঠিক করতে পারো।
- GWLB-এর কোনো security group নেই; সেখানে ছাঁকার কাজ appliance-দের।
#IP না, DNS নাম দিয়ে পৌঁছাও
প্রতিটা load balancer একটা DNS নাম পায়, যেমন my-alb-1234567890.us-east-1.elb.amazonaws.com। এই নামের পেছনে থাকে load balancer-এর node-গুলো, চালু থাকা প্রতিটা AZ-এ অন্তত একটা করে। ALB-তে (আর CLB-তে) AWS যখন load balancer বড়-ছোট করে আর node বদলায়, তখন নামের পেছনের IP address বদলে যায়; record-গুলোর TTL মাত্র ৬০ সেকেন্ড, যাতে client-রা তাড়াতাড়ি নতুন IP ধরতে পারে।
তাই:
- সবসময় DNS নাম দিয়ে connect করো, একবার দেখে নেওয়া কোনো IP দিয়ে কখনো না।
- নিজের domain-কে এর দিকে দেখাও একটা Route 53 alias record দিয়ে (subdomain-এর জন্য CNAME-ও চলে, কিন্তু zone apex-এ না)। alias record নিয়ে chapter ৮-এ।
- কোনো customer যদি নিজের firewall-এর allow list-এ বসানোর জন্য fixed IP চায়, তাহলে উত্তর প্রতি AZ-এ একটা Elastic IP-ওয়ালা NLB, বা ALB-এর সামনে Global Accelerator। দুটো নিয়েই লেসন ৬.৩-এ।
#TCP বনাম UDP: একটু ঝালিয়ে নেওয়া
কোন load balancer নেবে, সেটা ঠিক করতে আগে জানতে হবে তোমার traffic কী ধরনের। internet-এর প্রায় সব data দুটো transport protocol-এর কোনো একটায় চলে। System Design course-এর TCP, UDP আর TLS লেসনে এগুলো গভীরভাবে আছে; এই chapter-এর জন্য যতটুকু লাগে, তা এখানে।
| TCP (Transmission Control Protocol) | UDP (User Datagram Protocol) | |
|---|---|---|
| Connection | আগে SYN, SYN-ACK, ACK দিয়ে তৈরি: data-র আগে একটা round trip | নেই; প্রথম datagram-এই data থাকে |
| নির্ভরযোগ্যতা | প্রতিটা byte-এর স্বীকৃতি; হারানো segment আবার পাঠানো হয় | নেই; হারানো datagram চলেই গেল (app চাইলে আবার চেষ্টা করে) |
| ক্রম | ঠিক ক্রমে পৌঁছায়; app কখনো ফাঁক দেখে না | datagram উল্টোপাল্টা ক্রমে আসতে পারে, বা আসতেই না পারে |
| Flow আর congestion control | আছে, প্রাপক বা network হাঁপিয়ে উঠলে গতি কমায় | নেই; application ঠিক করে |
| Header | ২০ byte বা তার বেশি | ৮ byte |
| অনুভূতিটা কেমন | নির্ভুল, কিন্তু হারানো জিনিস উদ্ধার করতে থেমে যেতে পারে | দ্রুত আর একটানা, মাঝে মাঝে একটু ফাঁক |
| সাধারণ ব্যবহার | Web (HTTP/1.1, HTTP/2), API, database, file transfer (FTP, SFTP), email (SMTP), SSH | DNS lookup, VoIP আর video call, live multiplayer game-এর state, live streaming, QUIC/HTTP/3 |
ব্যবহারগুলো এভাবে ভাগ হলো কেন:
- Web browsing: একটা ছবি না এলে বিরক্ত লাগে, কিন্তু code-এর একটা লাইন হারালে পুরো page ভেঙে যায়, তাই web চলে TCP-তে (HTTP/3 ব্যতিক্রম, নিচে দেখো)।
- Database: ব্যাংকের টাকা পাঠানোয় একটা byte-ও হারানো চলবে না। TCP।
- File transfer আর email: ফাইল বা email-এর মাঝখান থেকে একটা শব্দ উধাও হয়ে যাওয়া মেনে নেওয়া যায় না। TCP।
- Live video call (Zoom, Meet): এক-দুটো frame হারালে ছবিটা এক মুহূর্ত আটকায়, তুমি পাত্তাও দাও না। কিন্তু হারানো frame আবার আনতে গিয়ে যদি call কয়েক সেকেন্ড জমে থাকে, যেমনটা TCP করত, সেটা অনেক বেশি বিরক্তিকর। UDP।
- VoIP: শব্দে ছোট্ট একটু ফাঁক থাকলে সমস্যা নেই; কিন্তু দেরি হলে কথা বলাই অসম্ভব। UDP।
- Online multiplayer game: খেলোয়াড়ের অবস্থান কয়েক millisecond-এর মধ্যে পৌঁছাতে হয়; পুরোনো অবস্থান এমনিতেই কোনো কাজের না। UDP।
- DNS: ছোট্ট একটা প্রশ্ন আর ছোট্ট একটা উত্তর; handshake করলে সময় দ্বিগুণ লাগত। port 53-এ UDP (বড় উত্তর আর zone transfer-এ TCP)।
TCP: দায়িত্বশীল courier। UDP: দায়সারা postman।
TCP আগে connection বানায়, প্রতিটা byte-এ নম্বর দেয়, আর হারানো জিনিস আবার পাঠায়। UDP শুধু datagram ছুড়ে দেয়, পেছন ফিরে দেখে না।
পরিস্থিতি
কোনো data পাঠানোর আগে client জিজ্ঞেস করে: “কথা বলা যাবে? আমার byte শুরু 100 থেকে।” courier আগে প্রাপককে ফোন করে নিচ্ছে, ঠিক সেরকম।
#load balancer-এর এতে কী আসে যায়
- ALB শুধু HTTP আর HTTPS বোঝে (যেগুলো TCP-র ওপর চলে)। তার কোনো UDP listener নেই, তাই game-এর UDP traffic, VoIP বা DNS সে বইতে পারে না।
- NLB কাজ করে layer 4-এ: সে TCP, UDP আর TLS listener সমর্থন করে (একই port-এ TCP_UDP-ও)। payload খোলে না; শুধু IP আর port দেখে, তাই খুব কম latency-তে প্রতি সেকেন্ডে লক্ষ লক্ষ request সামলাতে পারে। নভেম্বর ২০২৫ থেকে সে QUIC traffic-ও পার করে দিতে পারে, connection ID দেখে একটা session-কে একই target-এ রাখে, phone network বদলালেও (এটা নতুন feature; এখনকার পরীক্ষার প্রশ্ন TCP আর UDP-তেই বেশি জোর দেয়)।
- UDP target-দের health check হয় TCP, HTTP বা HTTPS দিয়ে, কারণ যেকোনো UDP service-কে “বেঁচে আছ?” জিজ্ঞেস করার সাধারণ কোনো উপায় নেই। ছোট্ট একটা check endpoint চালাও, যেটা জানাবে UDP service ঠিকঠাক চলছে কিনা।
HTTP, UDP আর বদলে যাওয়া IP
ALB HTTP বোঝে, path পড়তে পারে। NLB ভেতরের content না পড়েই port দেখে TCP আর UDP পাঠিয়ে দেয়। দুটোতেই পৌঁছাতে হয় DNS নাম দিয়ে।
পরিস্থিতি
client পাঠাল GET /api/orders। ALB connection নিজের কাছে শেষ করে, HTTP request নিজেই পড়ে।
#system design-এ load balancer কীভাবে ব্যবহার হয়
- প্রতিটা web tier: দুই-তিনটা AZ-এর public subnet-এ একটা internet-facing ALB, private subnet-এ instance বা container, আর instance-দের security group ALB-এর group-কে reference করে। AWS-এর প্রায় প্রতিটা architecture diagram-এর এটাই মূল কাঠামো।
- ভেতরের tier: web tier আর application tier-এর মাঝে একটা internal load balancer, যাতে প্রতিটা tier আলাদাভাবে scale করে আর আলাদাভাবে নষ্ট হয়।
- Load balancer + Auto Scaling group: ASG instance যোগ করে আর সরায়; load balancer তাদের register করে আর নষ্টগুলোকে বাদ দেয়; ASG ELB health check দেখে যে instance চলছে কিন্তু কাজ করছে না, তাকে বদলে দেয় (লেসন ৬.৫)।
- Deployment: কয়েকটা target deregister করো, update করো, আবার register করো; health check নিশ্চিত করে শুধু চলনসই version-ই traffic পায়। blue/green deployment-এ দুটো target group-এর মধ্যে traffic সরানো হয়।
- HTTP ছাড়া অন্য service: game server, message broker, VoIP gateway আর database বসে NLB-এর পেছনে।
- load balancer যেটা ঠিক করে না: application যদি session data memory-তে রাখে, তাহলে request ভাগ করলেই login আর cart ভেঙে যায়। stickiness একটা চটজলদি জোড়াতালি (লেসন ৬.৪); session-কে instance-এর বাইরে রাখাই আসল সমাধান (chapter ৯)।
#নিজে করে দেখো
# 1. Two security groups: the ALB open to the internet, the instances open only to the ALB
SG_ALB=$(aws ec2 create-security-group --group-name sg-alb --description "ALB" \
--vpc-id $VPC --query GroupId --output text)
aws ec2 authorize-security-group-ingress --group-id $SG_ALB --protocol tcp --port 443 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id $SG_ALB --protocol tcp --port 80 --cidr 0.0.0.0/0
SG_APP=$(aws ec2 create-security-group --group-name sg-app --description "web instances" \
--vpc-id $VPC --query GroupId --output text)
aws ec2 authorize-security-group-ingress --group-id $SG_APP --protocol tcp --port 80 \
--source-group $SG_ALB # a security group reference, not a CIDR
# 2. A target group with an explicit health check
TG=$(aws elbv2 create-target-group --name web-tg --protocol HTTP --port 80 --vpc-id $VPC \
--health-check-protocol HTTP --health-check-path /health \
--health-check-interval-seconds 10 --health-check-timeout-seconds 5 \
--healthy-threshold-count 3 --unhealthy-threshold-count 2 \
--matcher HttpCode=200 \
--query "TargetGroups[0].TargetGroupArn" --output text)
# 3. An internet-facing ALB in public subnets of two AZs, and a listener
ALB=$(aws elbv2 create-load-balancer --name web-alb --type application --scheme internet-facing \
--subnets $PUB_A $PUB_B --security-groups $SG_ALB \
--query "LoadBalancers[0].LoadBalancerArn" --output text)
aws elbv2 create-listener --load-balancer-arn $ALB --protocol HTTP --port 80 \
--default-actions Type=forward,TargetGroupArn=$TG
# 4. Register two instances (launched in private subnets with sg-app) and watch their health
aws elbv2 register-targets --target-group-arn $TG --targets Id=$I1 Id=$I2
aws elbv2 describe-target-health --target-group-arn $TG \
--query "TargetHealthDescriptions[].[Target.Id,TargetHealth.State,TargetHealth.Reason]" --output table
# 5. Use the DNS name (never the IPs behind it)
DNS=$(aws elbv2 describe-load-balancers --load-balancer-arns $ALB \
--query "LoadBalancers[0].DNSName" --output text)
dig +short $DNS # the IPs here can change over time
curl -s http://$DNS/ # repeat: responses come from different instances
# 6. Break one target and watch it go unhealthy (on that instance)
sudo systemctl stop httpd # about 2 × 10 s later describe-target-health shows unhealthy
sudo systemctl start httpd # about 3 × 10 s later it is healthy again
# 7. An NLB with a security group (must be chosen at creation) and a UDP listener
NLB=$(aws elbv2 create-load-balancer --name game-nlb --type network --scheme internet-facing \
--subnets $PUB_A $PUB_B --security-groups $SG_NLB \
--query "LoadBalancers[0].LoadBalancerArn" --output text)
aws elbv2 create-target-group --name game-udp --protocol UDP --port 7777 --vpc-id $VPC \
--health-check-protocol TCP --health-check-port 8080 # UDP targets get a TCP/HTTP check
#সারসংক্ষেপ
মূল কথাগুলো
- load balancer client-দের দেয় একটা DNS নাম, request ভাগ করে অনেক target-এর মধ্যে, তাদের health check করে, TLS খোলে, চাইলে user-কে sticky রাখে, কয়েকটা AZ জুড়ে চলে, আর instance-দের private রাখে।
- ELB managed: AWS চালায়, scale করে, patch দেয়, চালু রাখে। নিজের proxy fleet-এর চেয়ে knob কম, খাটুনি অনেক কম। EC2, ASG, ECS, Lambda, ACM, CloudWatch, Route 53, WAF আর Global Accelerator-এর সাথে জোড়া লাগে।
- ধরন: CLB (আগের প্রজন্ম, সরে যাও), ALB (layer 7, HTTP/HTTPS/gRPC/WebSocket), NLB (layer 4, TCP/UDP/TLS, static IP, চরম performance), GWLB (layer 3, পথের মাঝে appliance)।
- WAF লাগে ALB-তে (আর CloudFront, API Gateway, AppSync, Cognito, App Runner, Verified Access, Amplify-তে), CLB বা NLB-তে না।
- Health check: protocol, port, path, success code। Default: interval ৩০ সে, unhealthy threshold ২, healthy threshold ৫; timeout ৫ সে (ALB) বা ১০ সে / ৬ সে (NLB TCP-HTTPS / HTTP); success code 200 (ALB) বা 200–399 (NLB)।
- ধরা পড়ার সময় ≈ unhealthy threshold × interval (default-এ ≈ ৬০ সে); ফেরত আসার সময় ≈ healthy threshold × interval (≈ ১৫০ সে)।
- State: initial, healthy, unhealthy, unused, draining, unavailable (NLB-তে unhealthy.draining-ও)। সব target unhealthy হলে load balancer fail open করে।
- “running কিন্তু unhealthy” → app crash, security group check-এর port আটকাচ্ছে, ভুল path বা redirect, বা app ধীরে চালু হচ্ছে।
- instance app-এর port খোলে শুধু load balancer-এর security group থেকে। ২০২৩ থেকে NLB-তে security group চলে, কিন্তু শুধু বানানোর সময় লাগালে।
- DNS নাম ব্যবহার করো: ALB-এর IP বদলায়। fixed IP লাগলে → Elastic IP-ওয়ালা NLB বা Global Accelerator।
- TCP = handshake, নির্ভরযোগ্য, ঠিক ক্রমে (web, database, ফাইল, email)। UDP = handshake নেই, গ্যারান্টি নেই, দ্রুত (DNS, VoIP, game, live media)। ALB UDP পারে না; NLB পারে।
আগে নিজে উত্তর দাও, তারপর ব্যাখ্যাটা পড়ো। ঠিক হলেও পড়ো, কারণ ভুল Option-গুলো কেন ভুল, সেটাও ওখানে আছে।
নিজেকে যাচাই করোপ্রশ্ন
একদল EC2 instance-এর সামনে বসানো load balancer-এর মূল কাজ কী?
নিজেকে যাচাই করোপ্রশ্ন
default health check setting দিয়ে একটা ALB target group বানানো হলো। সে কোন মানগুলো ব্যবহার করবে?
নিজেকে যাচাই করোপ্রশ্ন
কোন ধরনের load balancer UDP listener সমর্থন করে?
নিজেকে যাচাই করোপ্রশ্ন
এগুলোর মধ্যে কোন দুটো Application Load Balancer target group-এর আসল target health state?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একটা কোম্পানি একদল third-party firewall appliance traffic-এর পথে বসাতে চায়, যাতে VPC-তে ঢোকা সব traffic application-এ পৌঁছানোর আগে পরীক্ষা হয়। কোন load balancer মানাবে?
নিজেকে যাচাই করোপ্রশ্ন
Classic Load Balancer-এর এখনকার অবস্থা কী?
নিজেকে যাচাই করোপ্রশ্ন
কোন protocol data পাঠানোর আগে three-way handshake দিয়ে connection খোলে?
নিজেকে যাচাই করোপ্রশ্ন
সাধারণ DNS query কোন transport আর port ব্যবহার করে?
নিজেকে যাচাই করোপ্রশ্ন
ALB-এর পেছনের প্রতিটা instance healthy না unhealthy, সেটা কোথায় দেখবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা NLB target group-এর সব health check setting default রেখে বানানো হলো। NLB তার target-দের কীভাবে পরীক্ষা করবে?
নিজেকে যাচাই করোপ্রশ্ন
নিজের EC2 instance-এ HAProxy চালানোর বদলে Elastic Load Balancing নিলে লাভ-ক্ষতিটা সবচেয়ে ভালোভাবে কোন কথাটা বলে?
নিজেকে যাচাই করোপ্রশ্ন
একটা web application-এ load balancer কোন দুটো সুবিধা আনে?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একটা EC2 instance running দেখাচ্ছে, 2/2 status check পাস, কিন্তু Application Load Balancer তাকে কোনো traffic পাঠাচ্ছে না। সবচেয়ে সম্ভাব্য ব্যাখ্যা কী?
নিজেকে যাচাই করোপ্রশ্ন
security audit বলছে, ALB-এর পেছনের web instance-গুলো HTTP নেবে শুধু ALB থেকে, আর কোথাও থেকে না। solutions architect কী করবে?
নিজেকে যাচাই করোপ্রশ্ন
ALB-এর পেছনের সব target unhealthy, reason Target.Timeout, অথচ প্রতিটা instance-এ curl http://localhost/health চালালে 200 আসে। কোন দুটো সম্ভাব্য কারণ?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একটা target group-এ interval ১০ সেকেন্ড, timeout ৫ সেকেন্ড আর unhealthy threshold ৩। একটা সফল check-এর ঠিক পরেই একটা instance পুরোপুরি জমে গেল। সবচেয়ে খারাপ অবস্থায় মোটামুটি কতক্ষণ পর সে unhealthy চিহ্নিত হবে?
নিজেকে যাচাই করোপ্রশ্ন
ঠিক করা একটা instance আবার health check পাস করতে শুরু করল। তার target group-এ ALB-এর default। মোটামুটি কতক্ষণ পর সে আবার request পাবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা update-এর পর ALB-এর পেছনের সব target unhealthy, Target.ResponseCodeMismatch, code 302। application এখন login না করা visitor-দের /login-এ redirect করে। সবচেয়ে ভালো সমাধান কী?
নিজেকে যাচাই করোপ্রশ্ন
ALB-এর পেছনের একটা Auto Scaling group-এ নতুন instance-দের cache গরম হতে প্রায় চার মিনিট লাগে। ASG ELB health check ব্যবহার করে, আর নতুন instance healthy হওয়ার আগেই বারবার terminate করে দেয়। কী বদলাতে হবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা deployment application-এর health endpoint /health থেকে বদলে /status করে দিল। target group এখনো /health পরীক্ষা করছে। এখন সব target unhealthy, অথচ user-রা বলছে site একদম ঠিকঠাক চলছে। কেন?
নিজেকে যাচাই করোপ্রশ্ন
একটা game কোম্পানি Network Load Balancer-এর পেছনে TCP-ভিত্তিক একটা API চালায়, আর এখন AWS WAF দিয়ে SQL injection আর খারাপ bot থেকে সুরক্ষা যোগ করতে হবে। solutions architect কী করবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা AWS WAF web ACL কোন দুটো resource-এর সাথে জোড়া যায়?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
এক বছর আগে একটা NLB কোনো security group ছাড়া বানানো হয়েছিল। security টিম এখন চায় target-রা শুধু NLB-এর security group reference করে NLB থেকেই traffic নিক। কী করতে হবে?
নিজেকে যাচাই করোপ্রশ্ন
Network Load Balancer-এর security group নিয়ে কোন দুটো কথা সত্যি?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একটা কোম্পানি real-time multiplayer game চালু করছে। client-রা সেকেন্ডে অনেকবার খেলোয়াড়ের অবস্থান UDP datagram হিসেবে পাঠায়, আর backend-কে কয়েকটা AZ-এর instance জুড়ে scale করতে হবে। কোন load balancer ব্যবহার করবে?
নিজেকে যাচাই করোপ্রশ্ন
কোন দুটো কাজ TCP-র চেয়ে UDP-তে বেশি মানায়?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একজন partner একটা ALB-এর DNS নাম resolve করে যে IP পেয়েছিল, সেটা হার্ডকোড করে রেখেছে। এক সপ্তাহ পর তার request ফেল করতে শুরু করল, যদিও ALB healthy। কী হয়েছে, আর ঠিক সমাধান কী?
নিজেকে যাচাই করোপ্রশ্ন
একটা media কোম্পানি browser-এ রেকর্ড করা video ছোট ছোট video ফাইল হিসেবে HTTPS দিয়ে দেখায়। টিমের একজন বলছে video streaming মানেই Network Load Balancer লাগবে। সবচেয়ে ভালো জবাব কী?
নিজেকে যাচাই করোপ্রশ্ন
নোটে লেখা: ‘AWS WAF লাগানো যায় শুধু Application Load Balancer আর Classic Load Balancer-এ; NLB-তে না।’ সঠিক কথাটা কী?
নিজেকে যাচাই করোপ্রশ্ন
নোটে লেখা load balancer প্রতিটা server ‘প্রতি ১০ সেকেন্ডে’ পরীক্ষা করে। এখনকার ALB বা NLB-এর জন্য সঠিক কথা কী?