DynamoDB 鍵值資料庫 (DynamoDB)
DynamoDB = AWS 全託管、高度可擴展的鍵值(兼文件)NoSQL。幾乎涵蓋面試裡所有持久化需求,現在還支援交易 —— 「NoSQL 沒交易」的舊批評已經過時。
關鍵能力是選對資料模型:partition key、sort key、次要索引。
三個賣點
| 賣點 | 含義 |
|---|---|
| 全託管 | AWS 管硬體、設定、修補、擴展;開發者只管應用程式 |
| 高度可擴展 | 自動上下擴展,無停機、無效能下降 |
| 鍵值模型 | 不用關聯模型,schema-less,儲存/取得更有彈性 |
問你的面試官。 有人歡迎、期待你會用;有人想避開供應商鎖定、期待開源替代。永遠直接問。
資料模型
- Table:頂層結構,必有 primary key;支援次要索引
- Item:相當於 row,一組 attribute,必有主鍵,上限 400KB(含屬性名)
- Attribute:鍵值對,純量/集合/巢狀。schema-less → 同表 item 可有不同屬性集,需在應用層做資料驗證
分區鍵與排序鍵
主鍵由一或兩個屬性組成:
| 鍵 | 角色 |
|---|---|
| Partition Key(必) | 值被 hash → 決定 item 存哪個物理分區 |
| Sort Key(選) | 同分區鍵下對 item 排序 → 分區內高效範圍查詢 |
面試介紹 DynamoDB 一定要指定 partition key(視情況加 sort key)。選能優化最常見查詢、且讓資料均勻分散的鍵。
例:群組聊天用chat_id(PK)+message_id(SK),高效查某群所有訊息並排序。
時間戳不保證唯一(同毫秒多訊息)。單調遞增 ID 同時給時間順序 + 唯一性。產生方式:每分區自增計數器、UUID v7(優於 v1,可排序且不洩 MAC)、Snowflake ID、ULID。
底層:Hash 分區 + B-tree
查詢 → 用 partition key 的 hash 找到正確儲存節點(概念類似 consistent hashing,
但 DynamoDB 用中心化的分區 metadata 服務,非 P2P hash ring)
→ 分區內用 sort key 為索引的 B-tree 找到 item
兩層架構 → 同時達到水平擴展(分區) + 分區內高效查詢(B-tree)。
次要索引:GSI vs LSI
用「非 partition key 的屬性」查詢時需要次要索引。
| 維度 | GSI(全域) | LSI(本地) |
|---|---|---|
| 分區鍵 | 與主表不同 | 與主表相同,但不同 sort key |
| 物理儲存 | 獨立分區、獨立複製(像獨立表) | 與被索引 item 共址 |
| 使用時機 | 用非主鍵屬性做全域查詢 | 同 partition key 下用額外 sort key |
| 大小限制 | 無限制 | 每 partition key 最多 10GB |
| 吞吐量 | 與基表分開計算讀寫容量 | 與基表共用讀寫容量 |
| 一致性 | 僅最終一致 | 最終一致(預設)+ 強一致讀取 |
| 建立時機 | 可隨時新增/移除 | 只能建表時定義,無法移除 |
| 數量上限 | 每表最多 20 個 | 每表最多 5 個 |
例:聊天表 PK=
chat_id。想查「某用戶在所有聊天室發的訊息」→ 建 GSI(PK=user_id, SK=message_id)。想查「某群附件最多的訊息」→ 在num_attachments建 LSI。
存取資料:Scan vs Query
| 操作 | 行為 | 效率 |
|---|---|---|
| Scan | 讀整張表/索引每個 item,分頁回傳 | 大表非常低效,盡量避免 |
| Query | 依主鍵/次要索引鍵取 item,可對 sort key 範圍查詢 | 高效(只讀符合的) |
ProjectionExpression ≠ SQL 欄位選取
它只減少網路傳輸,底層仍讀整個 item,仍按完整大小算讀取費用。大型 item 要適當正規化,避免每次讀回超過所需。
介面是 AWS SDK / 控制台,也支援 PartiQL(SQL 相容語法層,底層仍轉成 DynamoDB 操作)。
CAP:每請求選一致性
DynamoDB 的一致性不是表級設定,而是每個讀取請求指定(ConsistentRead):
| 模式 | 行為 | 成本(每 4KB) | 限制 |
|---|---|---|---|
| 最終一致(預設) | 任一副本服務;最高可用、最低延遲;表現為 AP/BASE | 0.5 RCU | 可能讀到稍舊資料 |
強一致(ConsistentRead=true) |
路由到 leader,反映所有先前成功寫入 | 1 RCU(兩倍) | 不支援 GSI |
設計需要強一致的存取模式時要牢記這點。
靈活性:訂位等場景用強一致;讀多、延遲敏感路徑用最終一致。
- ACID 交易:
TransactWriteItems/TransactGetItems,跨多表最多 100 個 item,提供可序列化隔離。 - 底層:每分區 Multi-Paxos,3 節點 leader-based 複製群組;leader 寫 WAL → peer,等 quorum(3 取 2) 確認才算完成。
架構與可擴展性
- 自動分片:分區達上限(大小/吞吐)自動拆分重分配;hash 分區保證均勻
- Global Tables:跨多 Region 即時複製,全球就近讀寫(面試設計全球應用提這個通常就夠)
- 容錯:單 Region 內自動跨 3 個 AZ 複製(每分區 1 leader + 2 follower),不可設定
- 安全:預設靜態加密(at rest)+ 強制 TLS 傳輸加密;整合 IAM 細粒度控制、VPC Endpoint
定價模型(帶出架構限制)
兩種模式:隨需(on-demand) 按請求計費(流量不可預測);預置容量(provisioned) 指定 RCU/WCU 按小時計費(可預測流量更划算)。
| 單位 | 定義 |
|---|---|
| 1 RCU | 每秒讀 ≤4KB(強一致);最終一致只耗 0.5 RCU |
| 1 WCU | 每秒寫 ≤1KB(無條件進位到 1KB) |
每分區上限 3,000 RCU / 1,000 WCU → 單分區約 12MB/s 讀、1MB/s 寫。
每秒 1,000 萬次寫入,每次 ≥1 WCU、每分區約 1,000 寫/秒 → 約需 10,000 個分區。預置定價(~$0.00065/WCU-小時):10M × $0.00065 × 24 ≈ $156,000/天(隨需更貴)。這種估算能快速判斷方案成本是否合理。
進階功能
- DAX(DynamoDB Accelerator):專屬記憶體快取,讀密集達微秒級(可能省掉 Redis/Memcached)。read-through + write-through;只對經 DAX 的寫入自動失效(直接寫 DynamoDB 繞過 DAX 的條目會留到 TTL/逐出);不快取強一致讀取。
- DynamoDB Streams(CDC):捕獲 item 變更(insert/update/delete)供下游消費。場景:同步 Elasticsearch、即時分析(接 Kinesis)、觸發 Lambda 做通知/更新快取。
面試:何時用 / 何時不用
✅ 用:幾乎任何持久化需求;高可擴展、持久、支援交易、個位數毫秒延遲(DAX 更達微秒)。
❌ 不用:
| 理由 | 說明 |
|---|---|
| 成本效益 | 高流量(數十萬寫/秒)下可能很貴 |
| 複雜查詢 | JOIN、ad-hoc 聚合力不從心(缺 SQL 靈活查詢) |
| 資料建模限制 | 頻繁用 GSI/LSI → 可能 PostgreSQL 更合適 |
| 供應商鎖定 | 綁 AWS;面試官想雲端中立時考慮開源替代 |
自我測驗重點
| 問題 | 重點 |
|---|---|
| PK vs SK 作用 | PK hash 定分區;SK 分區內範圍查詢 |
| GSI vs LSI 最大差異 | GSI 不同 PK/獨立/可隨時建/僅最終一致;LSI 同 PK/共址/建表時定/可強一致 |
| Scan vs Query | Scan 掃全表(避免);Query 走鍵(高效) |
| 強一致限制 | 不支援 GSI;耗 2 倍 RCU |
| 每分區吞吐上限 | 3,000 RCU / 1,000 WCU |
| DAX 不快取什麼 | 強一致讀取;繞過 DAX 的寫入不自動失效 |
| Streams 用途 | CDC → 同步 ES / 即時分析 / 觸發 Lambda |
Related Notes
- 06-Database-Tech/01-Database — KV NoSQL 在選型地圖中的位置
- 06-Database-Tech/02-PostgreSQL — 對照:強一致 RDBMS
- 06-Database-Tech/04-OLTP-vs-OLAP — DynamoDB 是 OLTP
- 02-Distributed-Systems/04-Consistent-Hashing — 分區路由的概念基礎
- 02-Distributed-Systems/02-CAP-Theorem — 最終 vs 強一致取捨
- 05-Database-Advanced/03-Replication — quorum、leader-based 複製
- 07-Caching-Storage/01-Caching — DAX 是 write/read-through 快取
- 09-Messaging-Coord/01-Data-Pipeline — Streams 作為 CDC 來源
- 06-Database-Tech/Practice-Database-Tech