Amoeba(變形蟲)是基於 Java 開發的 MySQL 分布式資料庫前端代理層,專注於 SQL 路由、讀寫分離、負載均衡、數據分片(水平/垂直)、高可用故障轉移。本文系統梳理其核心概念、安裝部署、四大核心配置文件、主從讀寫分離實戰、水平/垂直分片規則配置,並分析適用邊界與限制。
| 能力 | 支援狀態 | 說明 |
| 分布式事務 | ❌ 不支援 | 跨分片事務需應用層實現(TCC/Saga/本地消息表) |
| 存儲過程 | ⚠️ 暫不支援 | 官方宣稱近期支援,實際生產慎用 |
| 大結果集 | ❌ 不適合 | 單次查詢 >10 萬行易 OOM,建議分頁/流式處理 |
| 分庫分表 | ⚠️ 僅分實例 | 各分片需保持庫表結構一致,不支援異構分表 |
| DDL 透傳 | ⚠️ 受限 | 結構變更需人工協調各分片同步執行 |
三、環境部署標準化流程
1. JDK 環境(建議 JDK 8+)
# 移除系統自帶 OpenJDK
rpm -qa | grep java | xargs rpm -e --nodeps
# 安裝 Oracle JDK
mkdir /usr/java && cd /usr/java
chmod +x jdk-8u301-linux-x64.rpm.bin
./jdk-8u301-linux-x64.rpm.bin
# 環境變量
echo 'export JAVA_HOME=/usr/java/jdk1.8.0_301' >> /etc/profile
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile
source /etc/profile
java -version
2. Amoeba 安裝
mkdir /usr/local/amoeba && cd /usr/local/amoeba
wget https://sourceforge.net/projects/amoeba/files/amoeba-mysql-binary-2.2.0.tar.gz
tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz
bin/amoeba start # 驗證啟動
四、四大核心配置文件詳解

1. dbServers.xml:後端資料庫節點定義
- 抽象節點:定義共同屬性(端口、用戶、連接池),子節點繼承覆蓋 IP
- 虛擬節點:
virtual="true",聚合多物理節點實現負載均衡/高可用
- 連接池參數:maxActive/maxIdle/minIdle/eviction 策略調優關鍵
2. rule.xml:分片規則引擎核心
tableRule:表級路由規則,含 defaultPools 兜底分片
rule:單條規則,parameters 指定分片鍵欄位,expression 定義 Groovy/JS 表達式
ruleResult:POOLNAME(返回目標節點)、PARTITIONS(返回分區)
3. functionMap.xml / ruleFunctionMap.xml:函數擴展機制
- 內建函數:
hash()、abs()、mod()、range()
- 自定義函數:實現
RuleFunction 介面,打包 Jar 放入 lib/,XML 註冊
4. amoeba.xml:運行時核心配置
proxy/service:前端監聽埠、認證器、IP 白名單
runtime:線程池大小、SQL 快取、查詢超時
queryRouter:規則加載器、預解析開關、默認/讀寫分離節點
五、主從架構下的讀寫分離實戰

1. dbServers.xml 定義主從節點與虛擬從庫池
<dbServer name="Master" parent="abstractServer">
<factoryConfig><property name="ipAddress">192.168.0.1</property></factoryConfig>
</dbServer>
<dbServer name="Slave1" parent="abstractServer">...</dbServer>
<dbServer name="Slave2" parent="abstractServer">...</dbServer>
<dbServer name="virtualSlave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<property name="loadbalance">1</property> <!-- 1=輪詢 2=權重 3=HA -->
<property name="poolNames">Slave1,Slave2</property>
</poolConfig>
</dbServer>
2. amoeba.xml 啟用讀寫分離
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="defaultPool">Master</property>
<property name="writePool">Master</property>
<property name="readPool">virtualSlave</property>
<property name="needParse">true</property>
</queryRouter>
路由邏輯:SELECT → readPool;INSERT/UPDATE/DELETE/DDL → writePool;其他 → defaultPool。
六、水平分片(Sharding)規則配置
場景:按用戶 ID 取模分片至兩實例
<tableRule name="MESSAGE" schema="test" defaultPools="blogdb-1,blogdb-2">
<rule name="rule1">
<parameters>ID</parameters>
<expression><![CDATA[ abs(hash(id)) % 2 == 0 ]]></expression>
<defaultPools>blogdb-1</defaultPools>
</rule>
<rule name="rule2">
<parameters>ID</parameters>
<expression><![CDATA[ abs(hash(id)) % 2 == 1 ]]></expression>
<defaultPools>blogdb-2</defaultPools>
</rule>
</tableRule>
進階分片函數
range(id, 0, 1000000, 10000000):範圍分片
hash(id) % N:哈希均勻分片
month(create_time):時間維度分片
- 自定義複雜業務邏輯(如租戶隔離、地區就近)
七、垂直分片(業務解耦)配置
將不同業務域表路由至獨立資料庫:
<tableRule name="user" schema="userdb" defaultPools="userdb">
<rule name="user_rule">
<parameters>id</parameters>
<expression>true</expression> <!-- 全匹配 -->
<defaultPools>userdb</defaultPools>
</rule>
</tableRule>
<tableRule name="message" schema="blogdb" defaultPools="blogdb">...</tableRule>
<tableRule name="photo" schema="photodb" defaultPools="photodb">...</tableRule>
Amoeba 充當「資料網關」,應用統一連接 Amoeba,無需感知後端多庫拓撲。
八、運維關鍵指標與調優建議
| 維度 | 關鍵指標 | 調優方向 |
| 連接池 | active/idle/wait_count | maxActive 擴容、eviction 間隔調整 |
| SQL 解析 | parse_time、cache_hit_rate | LRUMapSize 擴大、預熱熱點 SQL |
| 路由分發 | route_latency、shard_distribution | 分片鍵選型優化、避免跨分片 JOIN |
| 高可用 | failover_time、heartbeat_interval | 心跳頻率、健康檢查 SQL 簡化 |
九、總結與選型建議
- 適用場景:中小型互聯網應用、讀多寫少、業務可接受最終一致性、團隊缺乏分布式中間件深度定製能力
- 替代方案對比:
- MyCat:功能更豐富、社區更活躍、支援分布式事務(弱 XA)
- ShardingSphere:Java 生態整合度高、支援 Sidecar/Proxy 模式、治理功能強
- Vitess:Kubernetes 原生、YouTube 驗證、適合超大規模
- ProxySQL:輕量、高效能、專注讀寫分離/查詢重寫/緩存
- 遷移路徑:Amoeba → MyCat/ShardingSphere → Vitess/自研,隨業務規模演進
Amoeba 以簡潔配置實現核心分片與讀寫分離,是進入分布式資料庫架構的優秀入門中間件。但隨著業務複雜度提升,建議評估更現代化的治理型中間件,實現從「連接代理」向「資料服務網格」的演進。
- 上一篇文章: Linux 系統下 MySQL 5.5 源碼編譯安裝完整實戰筆記
- 下一篇文章: MySQL MHA 高可用部署常見 11 大坑與解決方案總結
Copyright ©
程式碼之家 All Rights Reserved