元件: 1 Master (寫) + 2 Slave (讀) + Amoeba (中間件代理讀寫分離)
流向: 應用 → Amoeba (8066) → Master/Slave (3306)
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = app_db # 可選,建議不寫以同步所有庫
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# 建立目錄並授權
# mkdir -p /var/log/mysql && chown mysql:mysql /var/log/mysql
-- Master 執行
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'ReplPass123!';
FLUSH PRIVILEGES;
service mysqld restart
SHOW MASTER STATUS\G
-- 記錄 File (如 mysql-bin.000001) 和 Position (如 154)
[mysqld]
server-id = 2 # Slave2 用 3,以此類推
log-bin = mysql-bin
relay-log = relay-bin
read-only = 1 # 從庫只讀
master-host =
master-user = repl_user
master-password = ReplPass123!
master-port = 3306
master-connect-retry = 60
replicate-do-db = app_db # 可選
方式 A:全新實例 直接啟動 Slave,執行 CHANGE MASTER TO ... 指向 Master Binlog 位置。
方式 B:已有資料 Master 執行 FLUSH TABLES WITH READ LOCK; → 打包 /var/lib/mysql → scp 到 Slave → 解壓 → Master UNLOCK TABLES; → Slave 啟動複寫。
-- Slave 執行
CHANGE MASTER TO
MASTER_HOST='',
MASTER_USER='repl_user',
MASTER_PASSWORD='ReplPass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵指標:Slave_IO_Running: Yes, Slave_SQL_Running: Yes, Seconds_Behind_Master: 0
# JDK (Amoeba 基於 Java)
yum install -y java-1.8.0-openjdk-devel
# 設定環境變數 /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$JAVA_HOME/bin:$AMOEBA_HOME/bin:$PATH
source /etc/profile
mkdir -p /usr/local/amoeba
cd /usr/local/amoeba
wget https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.2.0.tar.gz
tar -xzf amoeba-mysql-binary-2.2.0.tar.gz
3306
app_db
amoeba_user
AmPass123!
500
500
10
192.168.1.10
192.168.1.11
192.168.1.12
1
Slave1,Slave2
app_user
AppPass123!
${amoeba.home}/conf/access_list.conf
Master
Master
virtualSlave
-- Master/Slave 皆需執行
GRANT ALL ON app_db.* TO 'amoeba_user'@'%' IDENTIFIED BY 'AmPass123!';
GRANT SELECT ON app_db.* TO 'app_user'@'%' IDENTIFIED BY 'AppPass123!';
FLUSH PRIVILEGES;
# 前台測試
/usr/local/amoeba/bin/amoeba start
# 若報錯 "The stack size specified is too small",修改 bin/amoeba:
# DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"
# 後台生產運行
nohup /usr/local/amoeba/bin/amoeba start &
# 應用連線配置
host: 192.168.1.20 (Amoeba 機器 IP)
port: 8066 (Amoeba 預設埠口)
user: app_user
password: AppPass123!
database: app_db
測試寫入 → 檢查 Master Binlog;測試查詢 → 檢查 Slave 負載均衡。
| 現象 | 原因 | 處理 |
|---|---|---|
| Slave_SQL_Running: No | 主庫誤刪資料導致從庫回放失敗 | 1. SHOW MASTER STATUS 取得最新 File/Pos → CHANGE MASTER TO MASTER_LOG_FILE=..., MASTER_LOG_POS=...; START SLAVE; 2. 或 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; 跳過錯誤事件 |
| Amoeba 啟動報 ValidateObject failed | dbServers.xml 密碼/Schema 錯誤 | 核對 user/password/schema,確保 MySQL 端已授權 |
| Java 堆疊溢位 | -Xss 設定過小 | 調整為 -Xss256k 或 -Xss512k |
Amoeba 雖已停止維護 (建議遷移至 MyCat、ShardingSphere-Proxy、ProxySQL),但其讀寫分離原理具有參考價值。生產環境請選擇活躍社群的中間件,並配合 MHA/Orchestrator 實現主庫自動故障轉移。