Atlas 分庫分表中間件架構解析:從讀寫分離到 Sharding 落地
Atlas 是奇虎 360 開源的基於 MySQL 協議的數據中間層,支援讀寫分離、負載均衡、IP 過濾、自動分表、平滑上下線 DB、故障自動摘除。本文深度解析其架構原理、Sharding 實現與生產級部署要點。
一、核心功能矩陣
| 功能 | 描述 | 實現方式 |
| 讀寫分離 | 主庫寫、從庫讀 | SQL 解析路由,SELECT 發往 Slave |
| 從庫負載均衡 | 多從庫分攤讀壓力 | 輪詢/權重/最少連線演算法 |
| IP 過濾 | 黑白名單訪問控制 | 連接階段攔截 |
| 自動分表 | 大表按規則拆分 | Sharding 模塊,支援 Range/Hash |
| 平滑上下線 | 不停服變更拓撲 | 連線池優雅切換 |
| 故障自動摘除 | 心跳檢測失效節點 | 定時健康檢查 + 標記下線 |
二、Atlas Sharding 架構原理
定位: 靜態分片中間件,不支援數據自動遷移,適用於單表數據量巨大、寫入壓力大的場景。
1. 架構拓撲
Client → Atlas (無狀態,可多實例) → 多個 DB Group
├─ Group 1 (Master + Slaves) ← Shard 1
├─ Group 2 (Master + Slaves) ← Shard 2
└─ Group N ... ← Shard N
每個 Group 內部仍支援讀寫分離
2. 分片鍵
- 必須是**整數類型**欄位
- 可以是主鍵,也可以是非主鍵
- Atlas 根據 Shard Key 計算目標 Group
3. 兩種分片策略
| 策略 | Range(範圍) | Hash(哈希) |
| 原理 | 按 Shard Key 區間映射 | 按 Shard Key 取模映射 |
| 配置例 | 1-1000萬→G1, 1001-2000萬→G2 | id % 4 = 0→G1, 1→G2, 2→G3, 3→G4 |
| 優點 | 範圍查詢高效,易擴容(只分裂) | 數據分布均勻,無熱點 |
| 缺點 | 易產生熱點(新數據集中新分片) | 範圍查詢需掃描全部分片,擴容需重新分片 |
| 適用場景 | 時間序列、ID 遞增業務 | 用戶 ID、訂單 ID 等均勻分布 |
三、SQL 支援矩陣與限制
| SQL 類型 | 支援程度 | 限制條件 |
| INSERT | ✅ 全支援 | 必須包含 Shard Key |
| DELETE | ✅ 全支援 | WHERE 必須含 Shard Key(否則全分片掃描) |
| UPDATE | ✅ 全支援 | WHERE 必須含 Shard Key,不支援跨分片更新 Shard Key |
| SELECT | ✅ 全支援 | 含 Shard Key 精確路由;無 Shard Key 廣播查詢 |
| 事務 | ⚠️ 部分支援 | 僅支援**單分片內**事務,跨分片事務不支援 |
| JOIN | ⚠️ 受限 | 僅支援同分片表 JOIN 或廣播表 JOIN |
| ORDER BY / LIMIT | ✅ 支援 | 單分片內完整;跨分片需 Atlas 合併排序 |
| 聚合函數 | ✅ 支援 | 跨分片由 Atlas 二次聚合 |
四、與 MySQL Replication 的互補關係
Replication(主從復制):
├─ 解決:讀擴展、備份、高可用
├─ 局限:寫擴展無能為力,單主寫入瓶頸
Sharding(分片):
├─ 解決:寫擴展、存儲擴展、單表過大
├─ 局限:跨分片事務/JOIN 復雜,運維成本高
最佳組合:每個 Shard 內部搭建 Master-Slave Replication
Atlas 負責 Shard 路由 + 組內讀寫分離
五、生產部署關鍵配置
[atlas]
daemon = true
admin_user = admin
admin_pwd = xxx
proxy_charset = utf8mb4
backend_charset = utf8mb4
worker_threads = 16
max_connections = 2000
client_idle_timeout = 300
# 分片配置範例
[sharding]
table = order_info
shard_key = user_id
type = hash
groups = g1,g2,g3,g4
[g1]
host = 10.0.1.10
port = 3306
user = atlas
pwd = xxx
weight = 1
master = 1
[g2]
host = 10.0.1.11
port = 3306
user = atlas
pwd = xxx
weight = 1
master = 1
...
六、運維避坑指南
- 無 Shard Key 查詢 = 全分片掃描:嚴禁在大表上無 Shard Key 查詢,必須在應用層攔截
- 跨分片事務業務層解決:採用最終一致性(TCC/Saga/本地消息表)替代分佈式事務
- 廣播表(字典/配置表):在所有分片同步冗餘,避免跨分片 JOIN
- 擴容方案:Hash 分片擴容需雙寫遷移或停機重分片;Range 分片只需新增分片配置
- 監控指標:QPS/RT/錯誤率/連線數/分片分布均勻度/慢查詢