System Design — Scale from Zero to Millions of Users
📖 Nguồn tham khảo: System Design Interview – Scale from Zero to Millions of Users
Diagram bằng text tóm tắt quá trình phát triển kiến trúc từ 1 server đơn giản đến hệ thống có Load Balancer, DB Replication, Cache, CDN, Stateless Web Tier.
1. Ban đầu: Single Server Setup
User
├── Web Browser
└── Mobile App
|
| 1. Gõ domain: www.mysite.com / api.mysite.com
v
DNS
|
| 2. Trả về IP server
v
+----------------------+
| Web Server |
|----------------------|
| Web App |
| API |
| Database |
| Cache |
| Static files |
+----------------------+
Ban đầu, mọi thứ nằm trên một server duy nhất:
Web app + API + Database + Cache + File tĩnh
Luồng xử lý:
User nhập domain
↓
DNS trả về IP
↓
Browser/Mobile gửi HTTP request
↓
Web Server xử lý
↓
Trả về HTML hoặc JSON
Cách này đơn giản, dễ triển khai, phù hợp khi ít user. Nhưng khi traffic tăng, một server sẽ bị quá tải.
2. Tách Web Server và Database
+------------------+ read/write/update +------------------+
| Web Server | ------------------------------> | Database |
|------------------| |------------------|
| API | <------------------------------ | Return data |
| Business Logic | | User/Product/... |
+------------------+ +------------------+
Khi user tăng, ta tách thành 2 tầng:
Web Tier = xử lý request, API, business logic
Data Tier = lưu dữ liệu
Lợi ích:
Web server có thể scale riêng
Database có thể scale riêng
Dễ quản lý performance hơn
3. Vertical Scaling vs Horizontal Scaling
Vertical Scaling - Scale Up Horizontal Scaling - Scale Out
=========================== ==============================
1 server mạnh hơn Nhiều server cùng xử lý
+ thêm CPU + Server 1
+ thêm RAM + Server 2
+ thêm disk + Server 3
+ Server N
Nhược điểm: Ưu điểm:
- Có giới hạn phần cứng - Dễ mở rộng
- Server chết là hệ thống chết - Server chết vẫn còn server khác
- Không có redundancy - Phù hợp hệ thống lớn
Scale up giống như mua một chiếc xe tải to hơn. Scale out giống như dùng nhiều xe tải nhỏ cùng chở hàng.
Với hệ thống lớn, thường ưu tiên scale out vì có thể thêm nhiều server khi traffic tăng.
4. Thêm Load Balancer
+------ DNS ------+
| |
v |
User ---------> Load Balancer <-------+
/ \
/ \
v v
+-----------+ +-----------+
| Server 1 | | Server 2 |
+-----------+ +-----------+
Load Balancer đứng giữa user và các web server:
Nhận request từ user
↓
Chọn một server khỏe
↓
Forward request tới server đó
↓
Nếu server chết, chuyển traffic sang server khác
Ví dụ round-robin:
Request 1 → Server 1
Request 2 → Server 2
Request 3 → Server 1
Request 4 → Server 2
Lợi ích:
Tăng khả năng chịu tải
Tăng availability
Tránh một server bị quá tải
Ẩn private IP của web servers
5. Database Replication
+-----------+ +------------+
| Master DB |-->| Slave DB 1 |
+-----------+ +------------+
|
| Replicate
v
+------------+
| Slave DB 2 |
+------------+
Mô hình Master – Slave:
Master DB: Slave DB:
- nhận write - nhận read
- insert/update - select/query
- delete
Luồng xử lý:
User tạo bài viết → ghi vào Master DB
User xem bài viết → đọc từ Slave DB
Lợi ích:
Tăng tốc đọc dữ liệu
Giảm tải cho Master DB
Nếu một Slave chết → đọc từ Slave khác
Nếu Master chết → promote Slave thành Master mới
6. Thêm Cache
Web Server
|
| 1. Check cache trước
v
+---------+
| Cache |
+---------+
| ^
| |
| | 2. Nếu cache miss, query DB
v |
+---------+
| DB |
+---------+
Luồng cache:
Request đến Web Server
↓
Check Cache
↓
Có data?
├── Yes → trả về ngay
└── No → query Database
↓
lưu vào Cache
↓
trả về Client
Cache phù hợp cho dữ liệu:
Đọc nhiều, ít thay đổi
Tính toán tốn thời gian
Query DB tốn chi phí
Ví dụ: User profile, Product detail,
Homepage feed, Config, Category list
Cần chú ý:
Cache expiration → dữ liệu hết hạn sau bao lâu?
Cache consistency → cache và DB có bị lệch không?
Eviction policy → cache đầy thì xóa dữ liệu nào?
SPOF → cache chết có làm hệ thống lỗi không?
7. Thêm CDN
Static files (JS/CSS/Images/Videos)
|
v
User ----------------------> CDN
|
| Dynamic request
v
Load Balancer → Web Servers → Database / Cache
CDN lưu file tĩnh ở nhiều node gần user:
User ở Việt Nam tải logo.png
↓
CDN server gần Việt Nam trả file
↓
Không cần request về origin server xa
Lợi ích:
Tải trang nhanh hơn
Giảm tải cho web server
Giảm latency
Phù hợp cho website nhiều ảnh/video/static files
8. Stateless Web Tier
Stateful — không tốt khi scale
User A ---> Server 1 (giữ session của A)
User B ---> Server 2 (giữ session của B)
User C ---> Server 3 (giữ session của C)
Vấn đề:
User A bắt buộc phải quay lại Server 1
→ Request A đi sang Server 2 → không có session → lỗi
→ Server 1 chết → User A bị logout
→ Khó thêm/xóa server
Stateless — tốt hơn
+----------------+
User A -----> | |
User B -----> | Web Servers |
User C -----> | |
+----------------+
|
| fetch session/state
v
+----------------+
| Shared Storage |
| Redis / DB |
+----------------+
Session được đưa ra ngoài (Redis, DB, NoSQL). Mọi server đều đọc được → request của User A có thể vào bất kỳ server nào.
Lợi ích:
Dễ scale horizontal
Dễ thêm server mới
Server chết không ảnh hưởng nhiều
Không cần sticky session
Hệ thống robust hơn
9. Diagram tổng hợp
+--------+
| DNS |
+--------+
|
+-------------+
| User |
| Web/Mobile |
+-------------+
/ \
/ \
v v
+-----------+ +----------------+
| CDN | | Load Balancer |
| Static | +----------------+
| Assets | / \
+-----------+ / \
v v
+----------+ +----------+
| Server 1 | | Server 2 |
+----------+ +----------+
| |
v v
+------------------------+
| Cache |
| Redis / Memcached |
+------------------------+
|
v
+----------------------------+
| Data Tier |
| +-----------+ |
| | Master DB | |
| +-----+-----+ |
| | Replication |
| v |
| +-----------+ |
| | Slave DB | |
| +-----------+ |
+----------------------------+
^
|
+----------------+
| Session Store |
| Redis / DB |
+----------------+
10. Luồng request theo từng trường hợp
User tải ảnh / video
User → CDN → trả static file ngay
(không cần đi vào web server)
User gọi API lấy dữ liệu
User → Load Balancer → Web Server bất kỳ
→ Check Cache
├── Có data → trả về user
└── Không có → đọc Slave DB → lưu Cache → trả về user
User tạo / sửa / xóa dữ liệu
User → Load Balancer → Web Server
→ Write vào Master DB
→ Master replicate sang Slave DB
→ Trả kết quả về User
Tư duy chính cần nhớ
1 user → Single server là đủ
Nhiều user hơn → Tách Web Server và Database
Traffic tăng → Thêm Load Balancer + nhiều Web Servers
Database đọc nhiều → Thêm Slave DB để scale read
Database ghi → Ghi vào Master DB
Dữ liệu đọc nhiều → Thêm Cache
File tĩnh nhiều → Thêm CDN
Muốn scale dễ → Làm Stateless Web Tier
Câu nhớ nhanh
CDN → tăng tốc static files
Cache → giảm query database
LB → chia tải cho web servers
Replication → tăng read performance + availability
Stateless → giúp web tier scale dễ
Master DB → xử lý write
Slave DB → xử lý read
Lộ trình phát triển kiến trúc
Single Server
↓
Separate Database
↓
Load Balancer
↓
Database Replication
↓
Cache
↓
CDN
↓
Stateless Web Tier
↓
Scalable System ✓
System design không bắt đầu bằng kiến trúc phức tạp — nó đi theo từng bước nhỏ, mỗi bước giải quyết đúng vấn đề đang gặp phải.