Design a Key-Value Store: Giới thiệu và Single Server
CHAPTER 6: DESIGN A KEY-VALUE STORE
Mục tiêu bài viết
- Hiểu key-value store là gì, cách key và value được lưu trữ.
- Nắm rõ 7 yêu cầu thiết kế của hệ thống key-value store cần xây dựng.
- Thấy được giới hạn của single-server key-value store và lý do cần đến distributed solution.
- Đặt nền cho các bài tiếp theo: CAP theorem, data partitioning, replication, consistency.
1) Context
Key-value store (còn gọi là key-value database) là một loại non-relational database. Mỗi item được lưu dưới dạng một cặp key → value:
- Key phải là unique. Key có thể là plain text hoặc hashed value.
- Value có thể là bất kỳ kiểu dữ liệu nào: string, list, object, binary, v.v.
- Value thường được xử lý như opaque object — hệ thống không quan tâm cấu trúc bên trong.
Ví dụ key formats:
Plain text key: "last_logged_in_at"
Hashed key: 253DDEC4
Ví dụ data trong key-value store:
key | value
─────────────────┼────────────────────────────────
"last_logged_in" | "2026-07-18T08:30:00Z"
253DDEC4 | { "userId": 42, "plan": "pro" }
"session:abc123" | "user_token_xyz"
"counter:visits" | 1048576
Các hệ thống key-value store nổi tiếng: Amazon Dynamo, Memcached, Redis.
2) Kiến trúc tổng quan
Design Scope — 7 Yêu cầu
Hệ thống key-value store cần thiết kế:
1) Key-value pair size ≤ 10 KB
2) Ability to store big data → cần distributed
3) High availability → respond nhanh ngay cả khi có failure
4) High scalability → hỗ trợ dataset lớn
5) Automatic scaling → auto add/remove server theo traffic
6) Tunable consistency → có thể điều chỉnh strong vs eventual
7) Low latency → read/write nhanh
Không có thiết kế hoàn hảo — mỗi lựa chọn là trade-off giữa:
- Read / Write / Memory performance
- Consistency vs Availability (CAP theorem — sẽ đề cập ở bài tiếp theo)
Single Server Key-Value Store
Approach đơn giản nhất: lưu toàn bộ key-value pairs trong hash table trong memory.
Single Server Architecture:
[Client]
|
▼
[Key-Value Server]
|
▼
[In-Memory Hash Table]
key1 → value1
key2 → value2
key3 → value3
...
Ưu điểm:
+ Memory access rất nhanh (nanoseconds)
+ Implementation đơn giản
Nhược điểm:
- Memory có giới hạn → không lưu được big data
- Single point of failure
- Không scale được
Hai tối ưu hóa để kéo dài tuổi thọ single server:
Optimization 1 — Data Compression:
Nén value trước khi lưu → giảm memory footprint
Đánh đổi: tốn CPU để compress/decompress
Optimization 2 — Tiered Storage:
Hot data (frequently accessed) → lưu trong memory
Cold data (rarely accessed) → lưu xuống disk
Đánh đổi: disk access chậm hơn memory ~1000x
Dù có tối ưu, single server vẫn đạt giới hạn capacity rất nhanh với workload lớn.
3) Request/Data flow
Single Server Flow
PUT operation:
1) Client gọi put("session:abc", token)
2) Server tính hash("session:abc") → bucket index
3) Lưu value vào hash table tại bucket đó
4) Trả về OK
GET operation:
1) Client gọi get("session:abc")
2) Server tính hash("session:abc") → bucket index
3) Đọc value từ hash table
4) [Memory hit] → trả về value ngay (~microseconds)
[Memory miss] → đọc từ disk → trả về value (~milliseconds)
4) API / Data contract
Hai operations cần implement
PUT /api/v1/kv/{key}
Content-Type: application/json
{
"value": "user_token_xyz_12345"
}
Response:
{
"key": "session:abc123",
"status": "ok",
"storedAt": "memory",
"ttl": null
}
GET /api/v1/kv/{key}
Response:
{
"key": "session:abc123",
"value": "user_token_xyz_12345",
"storedAt": "memory",
"hitType": "memory_hit",
"latencyMs": 0.12
}
storedAt cho biết value đang nằm ở memory hay disk. hitType phân biệt memory hit vs disk hit — quan trọng cho performance monitoring.
5) Trade-offs
| Approach | Ưu điểm | Nhược điểm | Phù hợp khi |
|---|---|---|---|
| Pure in-memory | Cực nhanh, đơn giản | Memory có hạn, mất data khi restart | Dataset nhỏ, cache tạm thời |
| In-memory + compression | Tiết kiệm memory hơn | Tốn CPU | Dataset vừa, key-value nhỏ |
| In-memory + disk tiering | Chứa được nhiều data hơn | Latency không đều (memory vs disk) | Dataset lớn hơn memory |
| Distributed key-value store | Big data, high availability, auto scale | Phức tạp hơn, cần handle consistency | Production, large scale |
Tại sao single server không đủ:
- Memory của một server: thường 64GB–512GB
- Dataset thực tế của production system: có thể hàng TB hoặc PB
- Single point of failure: server chết → toàn bộ data không accessible
- Không auto scale theo traffic
6) Tóm tắt + bài học
- Key-value store = non-relational DB lưu cặp
key → value, key phải unique, value là opaque object. - Thiết kế cần đạt 7 mục tiêu: small pair size, big data, high availability, scalability, auto scaling, tunable consistency, low latency.
- Single server dùng in-memory hash table — nhanh nhưng bị giới hạn bởi memory capacity và là single point of failure.
- Tối ưu bằng data compression và disk tiering kéo dài được một chút, nhưng không giải quyết gốc rễ.
- Distributed key-value store là hướng đi bắt buộc cho production — và đó là nội dung chính của phần còn lại Chapter 6.
Bài tiếp theo sẽ giới thiệu CAP Theorem — nền tảng lý thuyết quan trọng nhất để hiểu trade-off trong distributed key-value store.