Skip to main content

Scaling

OPS Advanced

Scale EZ-Console applications horizontally and vertically.

Overview

This guide covers scaling strategies for EZ-Console applications, including horizontal scaling, vertical scaling, database scaling, and load balancing.

Scaling Strategies

Horizontal Scaling

Add more application instances to handle increased load.

Vertical Scaling

Increase resources (CPU, memory) of existing instances.

Application Scaling

Horizontal Scaling

Docker Compose

version: '3.8'

services:
app:
build: .
deploy:
replicas: 3
environment:
- DATABASE_HOST=db

Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 5 # Scale to 5 instances
selector:
matchLabels:
app: myapp
template:
# ...

Auto Scaling

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70

Vertical Scaling

Increase container resources:

resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"

Database Scaling

Read Replicas

Use read replicas for read-heavy workloads:

database:
driver: "mysql"
host: "db-primary.example.com" # Write to primary
read_replicas:
- host: "db-replica-1.example.com"
- host: "db-replica-2.example.com"

Connection Pooling

Optimize connection pool settings:

database:
max_open_connections: 200
max_idle_connections: 20
max_connection_life_time: "5m"

Database Sharding

For very large databases, consider sharding:

  • Shard by organization ID
  • Shard by date range
  • Use consistent hashing

Load Balancing

Application Load Balancer

Nginx

upstream myapp {
least_conn;
server app1:8080;
server app2:8080;
server app3:8080;
}

server {
location /api {
proxy_pass http://myapp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

HAProxy

backend myapp
balance roundrobin
server app1 app1:8080 check
server app2 app2:8080 check
server app3 app3:8080 check

Session Affinity

For stateful applications:

upstream myapp {
ip_hash; # Sticky sessions
server app1:8080;
server app2:8080;
}

Caching

Application Cache

// Use in-memory cache
cache.Set(key, value, 5*time.Minute)

// Use Redis for distributed cache
redis.Set(ctx, key, value, 5*time.Minute)

Database Query Cache

Enable query caching:

database:
enable_query_cache: true
query_cache_size: 100MB

CDN for Static Assets

Serve static files from CDN:

location /static {
proxy_pass https://cdn.example.com;
}

Performance Optimization

Database Indexes

Add indexes for frequently queried fields:

type Product struct {
Name string `gorm:"index"`
Category string `gorm:"index"`
Status string `gorm:"index"`
}

Query Optimization

// Use Select to limit fields
db.Select("id", "name").Find(&products)

// Use pagination
db.Offset(offset).Limit(limit).Find(&products)

// Use preloading
db.Preload("Category").Find(&products)

Connection Pooling

database:
max_open_connections: 200
max_idle_connections: 20

Monitoring Scaling

Metrics to Monitor

  • CPU Usage: Should stay below 70%
  • Memory Usage: Monitor for leaks
  • Request Rate: Requests per second
  • Response Time: P50, P95, P99
  • Error Rate: Should be < 1%

Prometheus Queries

# CPU usage
rate(container_cpu_usage_seconds_total[5m])

# Memory usage
container_memory_usage_bytes

# Request rate
rate(http_requests_total[5m])

# Error rate
rate(http_requests_total{status=~"5.."}[5m])

Scaling Checklist

  • Monitor application metrics
  • Set up auto-scaling
  • Configure load balancer
  • Optimize database queries
  • Add caching layer
  • Use CDN for static assets
  • Test under load
  • Document scaling procedures

Need help? Ask in GitHub Discussions.