本文摘自《MySQL性能調優與架構設計》第 14 章,系統闡述當複製架構遇到寫入瓶頸、單表過大時,如何通過**垂直切分 (按業務模塊)**、**水平切分 (按邏輯鍵)**、**混合切分** 將數據分散到多實例,並解決切分後的路由、事務、跨分片 Join/分頁、中間層選型等核心難題。
user, user_profile, user_group, user_photo_albumgroups, group_message, group_message_content, top_messagephoto, photo_album, photo_album_relation, photo_commentevent雖模塊間有關聯 (如群組-用戶、相冊-用戶),但關聯鍵單一 (user_id/group_id),可在**應用層透過介面組裝**完成 Join,避免跨庫 Join。
| 優點 | 缺點 |
|---|---|
| 規則清晰、實施容易、維護定位快 | 跨模塊 Join 需應用層組裝、增加應用複雜度 |
| 業務隔離、故障域縮小 | 單表過大時無法解決寫入瓶頸 |
| 資源分配靈活 (核心模塊給強機器) | 切分過度導致系統過度碎片化、難維護 |
user_id % N 取模分片。所有與用戶關聯的表 (除 groups 無直接 user_id) 均按 user_id % 2 分片,同一用戶數據落在同一分片,**分片內 Join 零跨庫**。groups 表獨立垂直切出。
| 優點 | 缺點 |
|---|---|
| 分片內 Join 完整、事務簡單 (單分片) | 切分規則抽象難、難以覆蓋所有查詢場景 |
| 線性擴展、無單表瓶頸 | 運維定位難、手工排查成本高 |
| 應用改動相對小 (只加路由邏輯) | 模塊耦合度高時遷移困難 |
隨負載增長:先垂直拆模塊 → 核心模塊單表仍大 → 在該模塊內水平拆分。
示例架構演進:
user_id % N 水平拆;群組庫按 group_id 拆;相冊庫按 album_id 拆;事件庫按時間拆。優點:發揮兩者優勢、極致擴展性;缺點:架構最複雜、運維成本最高。
應用直連多分片不可維護,**必須引入中間代理層** 對應用透明化。
| 代理 | 語言 | 核心功能 | 適用場景 |
|---|---|---|---|
| MySQL Proxy | C + Lua | 連接路由、SQL 分析/過濾/改寫、負載均衡、基礎 HA | 需深度定制 SQL 改寫、Lua 腳本能力強的團隊 |
| Amoeba for MySQL | Java | 垂直/水平路由規則 (XML)、讀寫分離、負載均衡、HA、MySQL 協議兼容 | 純 MySQL 環境、偏好 XML 配置、需現成路由規則引擎 |
| Amoeba for Aladdin | Java | 多異構數據源 (MySQL/Oracle/DB2) 聯合路由、MySQL 協議前端 | 異構數據庫整合、統一 SQL 入口 |
| HiveDB | Java | 基於 Hibernate Shards、僅水平切分、自建冗余/HA、並行多片查詢合併 | ORM 深度整合、Hibernate 技術棧 |
| 其他 | - | HSCALE (MySQL Proxy 增強)、Spock Proxy (Rails)、Pyshards (Python) | 特定技術棧偏好 |
amoeba.xml:數據源、代理參數、讀寫分離、負載均衡。rule.xml:垂直/水平路由規則 (如 user_id % 2)。functionMap.xml / ruleFunctionMap.xml:自定義路由函數 Java 類映射。Federated 引擎雖可跨實例 Join 但結構變更不同步風險大,**不推薦生產使用**。ORDER BY ... LIMIT 涉及多分片,單片 Top-N 合併後非全局 Top-N。數據切分是 MySQL 突破單機寫入/存儲上限的核心手段。**垂直拆業務、水平拆數據、混合演進**,配合 **Amoeba/MySQL Proxy 等中間層** 實現路由透明化,**應用層吸收跨分片 Join/分頁/事務複雜度**,是大型互聯網架構的標準演進路徑。切分規則設計、中間層選型、運維體系建設三位一體,才能真正落地。