Section 8 - High Availability & Scalability: ELB & ASGV

  • Scalability & High Availability
    • Scalability means that an application/system can handle greater loads by adapting
    • High availability: run instance for the same application across multi AZ
      • High availability usually goes hand in hand with horizontal scaling
      • Means running your application/system in at least 2 AZs
      • The goal is to survive a data center loss
      • Can be passive (for RDS Multi AZ), active (for horizontal scaling)
    • 2 types:
      • Vertical: increasing the size of the instance
      • Common for non distributed systems, such as a database
      • RDS, ElastiCache are services that can scale vertically
      • There's usually a hardware limit to how much you can vertically scale
      • Ex: r4.large ‒> r4.4xlarge
      • Horizontal: increasing the number of instances/systems for your application
      • Auto Scaling Group, Load Balancer
      • Implies distributed systems
      • Common for web applications/modern applications
      • easy to horizontally scale thanks to EC2
  • Elastic Load Balancing
    • Load Balancers ‒> servers that forward traffic to multiple servers (Ex: EC2 Instances) downstream
    • Spread load across multiple downstream instances
    • Expose singly point of access (DNS)
    • Seamlessly handle failures of downstream instances
    • Do Regular health checks to instances
      • enable load balancer to know if instances it forwards traffic to are available to reply to requests
      • done on port and route (/health is common)
      • 200 (Ok)
    • Provide SSL termination (HTTPS) for websites
    • Enforce stickiness with cookies
    • High availability across zones
    • Separate public traffic from private traffic
    • Elastic Load Balancer ‒> managed load balancer
    • AWS guarantees that it will be working
    • AWS takes care of upgrades, maintenance, high availability
    • AWS provides only a few configuration knobs
    • Costs less to setup your own but more effort
    • integrated with many AWS offerings
      • EC2, EC2 Auto Scaling, ECS, ….
    • 4 Types:
      • Classic Load Balancer (v1) - CLB: HTTP, HTTPS, TCP, SSL
      • Supports TCP (Layer 4), HTTP & HTTPS (Layer 7)
      • Health checks are TCP or HTTP based
      • Fixed hostname: XXX.region.elb.amazonaws.com
      • Application Load Balancer (v2) - ALB: HTTP, HTTPS, WebSocket
      • Layer 7 (HTTP)
      • Load balancing to multiple HTTP applications across machines (target groups)
      • Load balancing to multiple applications on the same machine (ex: containers)
      • Support for HTTP/2 and WebSocket
      • Support redirects (from HTTP to HTTPS for example)
      • Routing tables to different target groups:
        • Routing based on path in URL
        • Routing based on hostname in URL
        • Routing based on Query String, Headers
      • ALB are a great fit for micro services & container-based application (example: Docker & Amazon ECS)
      • Has a port mapping feature to redirect to a dynamic port in ECS
      • In comparison, we'd need multiple Classic Load Balancer per application
      • Target Groups:
        • EC2 Instances (can be managed by an Auto Scaling Group) - HTTP
        • ECS task (managed by ECS itself) - HTTP
        • Lambda functions - HTTP request is translated into a JSON event
        • IP Addresses - must be private IPs
      • ALB can route to a multiple target groups
      • Health checks are at the target group level
      • Good to Know:
        • Fixed hostname (XXX.region.elb.amazonaws.com)
        • The application servers don't see the IP of the client directly
        • The true IP of the client is inserted in the header X-Forwarded-For
        • We can also get Port (X-Forwarded-Port) and proto (X-Forwarded-Proto)
      • Network Load Balancer (v2) - NLB: TCP, TLS (secure TCP), UPD
      • Gateway Load Balancer - GWLB: Operates at layer 3 (Network layer) - IP Protocol
      • Recommended to use newer gens
      • Some can be setup as internal or external ELBs