首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Atlas 分庫分表中間件架構解析:從讀寫分離到 Sharding 落地

     編輯:MySQL 綜合教學

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萬→G2id % 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
...

六、運維避坑指南

  1. 無 Shard Key 查詢 = 全分片掃描:嚴禁在大表上無 Shard Key 查詢,必須在應用層攔截
  2. 跨分片事務業務層解決:採用最終一致性(TCC/Saga/本地消息表)替代分佈式事務
  3. 廣播表(字典/配置表):在所有分片同步冗餘,避免跨分片 JOIN
  4. 擴容方案:Hash 分片擴容需雙寫遷移或停機重分片;Range 分片只需新增分片配置
  5. 監控指標:QPS/RT/錯誤率/連線數/分片分布均勻度/慢查詢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved