萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

使用 Amoeba 實現 MySQL 主從讀寫分離:原理、部署與驗證全流程

前言

Amoeba for MySQL 是一款基於 MySQL 協議的分布式資料庫代理中間件,座落於應用與 DB 之間,對應用透明,提供讀寫分離、負載均衡、高可用、SQL 路由、分片等能力。本文以 CentOS 6.8 + MySQL 5.1.73 為環境,完整記錄主從搭建、Amoeba 安裝配置、啟動排錯、功能驗證全過程。

一、主從同步架構優勢

  • 讀請求分流至 Slave,降低 Master 壓力
  • 備份操作在 Slave 執行,不影響 Master 服務
  • Master 故障可手動/自動切換至 Slave 恢復服務

二、實驗環境規劃

角色IP說明
Master DB172.16.2.239寫入主庫
Slave DB172.16.2.230讀取從庫
Amoeba Proxy172.16.2.231代理入口,監聽 8066

三、MySQL 主從配置實戰

1. Master 配置

# /etc/my.cnf
[mysqld]
server-id = 1
log-bin = master_bin
replicate-ignore-db = mysql,test,information_schema
  • 建立復制帳號:GRANT REPLICATION SLAVE ON *.* TO 'root'@'172.16.2.230' IDENTIFIED BY '123456';
  • 重啟後記錄 SHOW MASTER STATUS 輸出的 File 與 Position

2. Slave 配置

# /etc/my.cnf
[mysqld]
server-id = 2
relay-log = relay-bin
  • 重啟後驗證連通性:mysql -uroot -p123456 -h 172.16.2.239
  • 配置同步起點:
    SLAVE STOP;
    CHANGE MASTER TO MASTER_HOST='172.16.2.239', MASTER_USER='root', MASTER_PASSWORD='123456', MASTER_LOG_FILE='master_bin.000019', MASTER_LOG_POS=106;
    SLAVE START;
    SHOW SLAVE STATUS\G  -- 確認 Slave_IO_Running & Slave_SQL_Running 均為 Yes
    
  • Master 建表寫入驗證同步生效

四、Amoeba 部署與配置

1. Java 環境準備

yum -y install java-1.6.0-openjdk
# 配置 /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile
java -version  # 驗證

2. 安裝 Amoeba


wget https://sourceforge.net/projects/amoeba/files/Amoeba_for_mysql/2.2.x/amoeba-mysql-binary-2.2.0.tar.gz/download
mkdir /usr/local/amoeba-2.2.0
tar xvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba-2.2.0

3. 核心配置文件

dbServers.xml —— 定義後端 DB 節點

<dbServer name="master" host="172.16.2.239" port="3306" user="root" password="123456" schema="test"/>
<dbServer name="slave" host="172.16.2.230" port="3306" user="root" password="123456" schema="test"/>

amoeba.xml —— 代理邏輯與池化策略

<proxy>
  <service name="amoeba-mysql" port="8066" user="root" password="123456"/>
  <factory className="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
    <property name="manager">defaultManager</property>
  </factory>
</proxy>

<pool name="defaultPool" ... />  -- DDL 等非增刪改查語句
<pool name="writePool" server="master" />  -- 寫操作路由至 Master
<pool name="readPool" server="slave" weight="3" />  -- 讀操作路由至 Slave,權重 1:3
  • LRUMapSize:SQL 解析緩存條數
  • 讀寫分離核心:writePool 綁定 Master,readPool 綁定 Slave 並可配置多節點權重

4. 環境變量與啟動腳本調優

# /etc/profile.d/amoeba.sh
export AMOEBA_HOME=/usr/local/amoeba-2.2.0
export PATH=$AMOEBA_HOME/bin:$PATH

啟動報錯 The stack size specified is too small,修改 bin/amoeba:

DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"  # 原 128k 改 256k

5. 啟動與連接驗證


amoeba start
# 連接代理
mysql -uroot -p123456 -h 172.16.2.231 -P8066

五、功能驗證測試方案

  1. 建表同步測試:Amoeba 建表 → 檢查 Master/Slave 是否同步存在
  2. 寫操作路由測試:SLAVE STOP 停止同步 → Amoeba 執行 INSERT → 僅 Master 有數據
  3. 讀操作負載均衡測試:Master/Slave 各插入不同數據 → Amoeba 查詢 → 觀察返回結果輪詢分佈

六、常見排錯方向

  • 網絡/防火牆:端口 3306/8066 互通
  • 權限:Amoeba 配置的帳號需擁有 Master/Slave 完整訪問權限
  • 配置細節:server-id 唯一、schema 名稱一致、weight 比例合理
  • 日志:$AMOEBA_HOME/logs/ 下查看詳細錯誤堆棧

七、總結與遷移建議

Amoeba 實現了應用零代碼改造的讀寫分離,但項目已停止維護(最後更新 2013 年),生產環境建議考慮更現代的替代方案:

  • MyCat:Amoeba 衍生版,支援分片、全局表、更豐富 SQL 支援
  • ProxySQL:高效能、支援查詢緩存、鏡像、熔斷、動態配置
  • ShardingSphere-Proxy:Apache 項目,分片、讀寫分離、影子庫、分布式事務
  • Vitess:YouTube 開源,大規模分片叢集管理

若維護舊系統必須用 Amoeba,請做好單點故障預案(部署雙 Amoeba + Keepalived/VIP),並嚴格控制 SQL 複雜度,避免不支援語法導致代理報錯。

copyright © 萬盛學電腦網 all rights reserved