背景定位
Spock Proxy 是早期 MySQL 水平分片 (Sharding) 代理項目,基於 Lua 腳本實現 SQL 路由、結果合併。目前**已停止維護**,僅供架構演進參考。
核心架構原理
Client → Spock Proxy (Lua Router) → MySQL Shards (分片節點)
↓
SQL 解析 → 分片鍵提取 → 節點路由 → 並行執行 → 結果聚合 → 返回
關鍵功能特性
| 功能 | 實現方式 | 限制 |
| 分片路由 | Lua 腳本解析 SQL 提取 shard_key | 僅支援簡單 WHERE/JOIN,複雜 SQL 需改寫 |
| 結果合併 | 內存排序/分組/聚合 | 大結果集 OOM 風險,無流式處理 |
| 事務支援 | 單分片事務 | 跨分片分布式事務不支援 |
| DDL 代理 | 廣播執行 | Schema 變更需人工協調 |
典型配置示例
-- config.lua 片段
shards = {
{ host = "192.168.1.10", port = 3306, user = "shard", password = "pwd", db = "app_shard_1" },
{ host = "192.168.1.11", port = 3306, user = "shard", password = "pwd", db = "app_shard_2" },
}
function route_sql(sql)
-- 簡單範例: 根據 user_id 取模路由
local user_id = extract_user_id(sql)
if user_id then
return shards[user_id % #shards + 1]
end
return shards[1] -- 默認節點
end
現代替代方案演進
- MyCat (Java): 豐富分片算法 (取模、範圍、枚舉、一致性 Hash)、ER 關係分片、全局序列號
- ShardingSphere (Java): 標準化 Sharding API、分布式事務 (XA/BASE)、影子庫壓測、可插拔算法 SPI
- Vitess (Go): Kubernetes 原生、VReplication 物化視圖、在線 DDL、YouTube 驗證萬億級
- PolarDB-X / OceanBase: 原生分布式數據庫,透明分片、強一致、HTAP
分片架構選型建議
| 業務階段 | 推薦方案 | 核心理由 |
| 初創期 (單表 < 5000萬) | 不分片 + 讀寫分離 | 架構簡單,維護成本低 |
| 成長期 (單表 > 5000萬) | ShardingSphere Proxy / MyCat | 應用無感遷移,算法靈活 |
| 成熟期 (多業務線、強一致) | Vitess / PolarDB-X | 原生分布式,運維自動化 |
| 雲原生/K8s 環境 | Vitess Operator | 聲明式管理,彈性伸縮 |
避坑指南
- ❌ 過早分片:未優化索引/架構就上分片中間件
- ❌ 分片鍵選錯:導致跨分片 JOIN/事務頻發
- ❌ 忽略全局唯一 ID:雪花算法/數據庫段號模式
- ❌ 缺乏變更管理:DDL 執行無回滾預案
- ❌ 測試不足:無混沌工程驗證分片故障降級