為什麼選型這麼難#
儲存產品幾十種,「哪個對」沒有絕對答案。本章把選型決策結構化:
- 先理清業務需求
- 對應到資料模型 + 存取模式
- 過濾候選技術
- 用評估維度比較
- 配合運維能力做最終決定
第 1 步:問對的問題#
選型前要回答的問題:
| 問題 | 影響 |
|---|---|
| 資料量現在多少、3 年後多少? | 是否需要分散式 / 分片 |
| 寫入 QPS、讀取 QPS? | 並發容量、是否需要 cache |
| 一致性要求? | 強 / 最終 / 不在意 |
| 延遲 SLA? | ms 還是秒 |
| 資料模型? | 結構化 / 半結構化 / 媒體 |
| 訪問模式? | 單筆 / 範圍 / 全文 / 聚合 |
| 預算? | 自建 vs 雲端、開源 vs 商用 |
| 人力? | DBA 多少、開發團隊熟悉哪些技術 |
最後一條最常被忽略 ── 但是最重要。一個團隊不會用的技術再先進也是失敗。
第 2 步:資料模型與存取模式#
資料模型對選型決定性極大:
| 資料模型 | 例子 | 適配儲存 |
|---|---|---|
| 結構化、強關係 | 訂單、賬戶、ERP | RDBMS:MySQL、PostgreSQL、Oracle |
| 結構化、無 join | 使用者表、設定表 | RDBMS、KV 都行 |
| 半結構化、JSON | 商品規格、裝置設定 | MongoDB、PG JSONB |
| 鍵值(KV) | session、token、cache | Redis、Memcached、DynamoDB |
| 檔案 / 媒體 | 圖片、影片、附件 | S3、OSS、COS |
| 全文 | 商品搜尋、log search | Elasticsearch、OpenSearch |
| 時序 | metrics、IoT、股價 | InfluxDB、Prometheus、TimescaleDB |
| 圖 | 社交網路、知識圖譜 | Neo4j、JanusGraph、ArangoDB |
| 列式(OLAP) | 報表、分析、BI | ClickHouse、Doris、BigQuery |
| 訊息流 | 事件、binlog | Kafka、Pulsar、RocketMQ |
| 大量物件 KV | 行為日誌儲存 | HBase、Cassandra |
不要硬把所有資料塞到單一儲存。電商完整架構通常有 5~10 種儲存共存。
第 3 步:訪問模式決定細節#
兩個都用 RDBMS,需求差異會導致設計差異:
場景 A: 訂單查詢
- 「我的訂單列表」── user_id + date 範圍
- 「訂單詳情」── order_id 單筆
→ 設計:以 user_id 分片,order_id 編碼 user_id,主鍵 (user_id, order_id)
場景 B: 商品查詢
- 「商品詳情」── product_id 單筆,QPS 極高
- 「分類列表」── category_id + 排序
→ 設計:products 表加 cache 層,category 走 ES儲存選型不只選哪個 DB,還要設計怎麼用它。
第 4 步:評估維度#
當候選收斂到 2~3 個,從這些維度比較:
性能#
| 子維度 | 量度 |
|---|---|
| 寫入吞吐 | QPS、bytes/sec |
| 讀取吞吐 | QPS、bytes/sec |
| 延遲 | p50、p99、p999 |
| 並發 | 連接數上限 |
不只看 marketing 數字 ── 跑你自己的 benchmark。每個系統都有 sweet spot 與 weak spot。
一致性#
| 等級 | 含義 |
|---|---|
| Strong | 寫完立刻可讀,全節點一致 |
| Linearizable | 看起來是單機行為 |
| Snapshot Isolation | 事務內一致快照 |
| Read Your Writes | 讀自己寫的一定看到 |
| Eventual | 最終一致,期間可能不同 |
電商:賬戶必 Strong;商品 cache 可 Eventual;訂單視業務切。
可用性#
| 量度 | 業界水準 |
|---|---|
| 99.9% (3 個 9) | 一年停 8.76 小時 |
| 99.99% (4 個 9) | 一年停 53 分鐘 |
| 99.999% (5 個 9) | 一年停 5 分鐘 |
| 99.9999% (6 個 9) | 一年停 31 秒 |
雲端商用通常 SLA 99.99%。自建要對等需要重複工程。
擴展性#
| 維度 | 問題 |
|---|---|
| 垂直擴展 | 升級 instance 規格能撐到多大 |
| 水平擴展 | 加節點是否線性?瓶頸在哪? |
| 跨地域 | 多 region 部署是否原生支持 |
| 彈性收縮 | 流量小時能否縮回節省成本 |
運維#
| 維度 | 問題 |
|---|---|
| 部署複雜度 | 幾個元件?需要哪些前置? |
| 監控成熟度 | 自帶 metrics、prometheus exporter? |
| 備份 / 恢復 | RTO(恢復時間)、RPO(資料丟失上限) |
| 升級 | rolling upgrade?停機時間? |
| 故障診斷 | 工具、文件、社群 |
| 線上修復 | 不停機 ALTER、不停機擴容 |
雲端託管在這個維度幾乎全勝(每個都不用自己擔)。
成本#
| 項目 | 自建 | 雲端 |
|---|---|---|
| 硬體 / instance | 預付 / 攤銷 | 月費(ondemand 或 reserved) |
| 人力 | 重資產 | 較輕 |
| 出入網流量 | 機房內基本免費 | 出網流量是大頭 |
| 災備 | 自己搭跨機房 | 多 region 內建(要錢) |
| 升級 / 替換 | 自己折騰 | 點按鈕 |
生態與社群#
| 維度 | 觀察點 |
|---|---|
| GitHub stars | 受歡迎程度 |
| 商業支持 | 有公司 backed?破產風險? |
| 文件 | 上手難度 |
| 用戶端 SDK | 多語言?品質? |
| 工具鏈 | migration、benchmark、operator |
| 招聘 | 找得到熟手嗎 |
冷門技術可能技術上更好,但人才難找、社群差、Stack Overflow 沒人答 ── 真實成本很高。
在線業務的選型矩陣#
線上業務(OLTP)的常見決策:
結構化 + 強事務#
首選:MySQL(成熟、社群、SDK 全)
備選:PostgreSQL(功能更豐、JSON 強)
需要極端擴展:TiDB / CockroachDB / Spanner(NewSQL)
雲端 native:Aurora / AlloyDB / TiDB CloudKV / Cache#
快、單純:Redis
高可用:Redis Cluster
持久 + 雲託管:DynamoDB / Bigtable媒體 / 大檔#
公雲:S3 / OSS / COS
自建大規模:MinIO、Ceph半結構化#
純文檔:MongoDB
與 RDBMS 混存:PostgreSQL JSONB全文 / 搜尋#
首選:Elasticsearch(OpenSearch)
輕量:Meilisearch、Typesense
規模極大:Solr Cloud、Vespa訊息#
吞吐第一:Kafka
功能豐富:Pulsar、RocketMQ
輕量:RabbitMQ、NATS時序 / metrics#
監控:Prometheus
大量 IoT:InfluxDB、TimescaleDB
日誌:Loki + Grafana分析系統的選型#
OLAP 場景另一套:
選型流程
是否需要 ad-hoc 跨多源查詢?
┌────────────┴──────────────┐
是 否
│ │
Trino / Presto 資料量?
│
┌────────────┼─────────────┐
小(GB) 中(TB) 大(PB)
│ │ │
PostgreSQL ClickHouse ClickHouse
(純粹單機OLTP+OLAP) + S3 lake
Spark / Trino offline並考慮:
- 時序 / 時間維度極重 → Druid 比 ClickHouse 更貼合
- 單純報表 + 簡單 → Snowflake / BigQuery(運維 0)
- 與 Hadoop 生態整合 → Hive / Iceberg
反模式#
選型時的常見錯誤:
- 「大廠用什麼我用什麼」:忽略了規模差異與團隊能力
- 「最新最潮」:早期版本踩雷頻繁
- 「全用 MySQL / 全用 MongoDB」:硬塞所有需求進單一儲存
- 「分庫分表先做了再說」:過早分片,後續難回頭
- 「先解決現在問題」:3 個月後資料量爆漲再痛苦遷移
- 「雲廠商一定貴」:自建運維 + 人力可能更貴
一個完整電商的儲存組合#
實際電商可能同時用:
+----------+--------+-----------+---------------------+
| 系統 | 主儲存 | 快取 | 同步去向 |
+----------+--------+-----------+---------------------+
| 用戶 | MySQL | Redis | - |
| 商品 | MySQL | Redis | ES(搜尋) |
| | + Mongo| | CDN(圖片從 OSS) |
| 訂單 | MySQL | - | Kafka → ClickHouse |
| | (分片) | | |
| 購物車 | Redis | - | MySQL(持久化) |
| 賬戶 | MySQL | - | - |
| 庫存 | MySQL | Redis | - |
| 評論 | MySQL | - | ES |
| 行為日誌 | - | - | Kafka → CK + S3 |
| 圖片 | OSS | - | CDN |
| 影片 | OSS | - | CDN |
+----------+--------+-----------+---------------------+10 種儲存、各司其職。這不是過度工程 ── 是務實設計。
小結#
選型決策樹:
1. 業務需求 → 資料模型 + 訪問模式
2. 候選技術過濾(資料模型對應 + 規模對應)
3. 評估維度比較:
- 性能 / 一致性 / 可用性 / 擴展性
- 運維 / 成本 / 生態
4. 配合團隊能力做最終決定
5. POC:跑你自己的 workload,不要信 marketing最重要:沒有最好的儲存,只有最合適的儲存。電商的成熟系統幾乎都是「對的工具放對的位置」。
下兩章看兩個值得單獨展開的「未來方向」:NewSQL 與 LSM-Tree。