首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

CentOS 搭建 Amoeba + MySQL 主從讀寫分離叢集完整實戰

     編輯:MySQL 綜合教學

架構概覽

元件: 1 Master (寫) + 2 Slave (讀) + Amoeba (中間件代理讀寫分離)

流向: 應用 → Amoeba (8066) → Master/Slave (3306)

第一階段:MySQL 主從複寫搭建

1. Master 配置 (/etc/my.cnf)


[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

2. 建立複寫帳號


-- Master 執行
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'ReplPass123!';
FLUSH PRIVILEGES;

3. 重啟 Master 並查看狀態


service mysqld restart
SHOW MASTER STATUS\G
-- 記錄 File (如 mysql-bin.000001) 和 Position (如 154)

4. Slave 配置 (/etc/my.cnf)


[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   # 可選

5. 初始化 Slave 資料 (兩種方式)

方式 A:全新實例 直接啟動 Slave,執行 CHANGE MASTER TO ... 指向 Master Binlog 位置。

方式 B:已有資料 Master 執行 FLUSH TABLES WITH READ LOCK; → 打包 /var/lib/mysql → scp 到 Slave → 解壓 → Master UNLOCK TABLES; → Slave 啟動複寫。

6. 啟動複寫並驗證


-- 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

第二階段:Amoeba 安裝與配置

1. 環境準備


# 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

2. 下載安裝


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

3. 核心配置檔修改

dbServers.xml - 定義後端 MySQL 節點




  
    3306
    app_db
    amoeba_user
    AmPass123!
  
  
    500
    500
    10
  




  
    192.168.1.10
  




  
    192.168.1.11
  


  
    192.168.1.12
  




  
    1  
    Slave1,Slave2
  

amoeba.xml - 代理邏輯與驗證




  
    app_user
    AppPass123!
    
      
        ${amoeba.home}/conf/access_list.conf
      
    
  



Master   
Master    
virtualSlave  

4. MySQL 建立 Amoeba 連線用戶


-- 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;

5. 啟動 Amoeba


# 前台測試
/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 faileddbServers.xml 密碼/Schema 錯誤核對 user/password/schema,確保 MySQL 端已授權
Java 堆疊溢位-Xss 設定過小調整為 -Xss256k 或 -Xss512k

總結

Amoeba 雖已停止維護 (建議遷移至 MyCat、ShardingSphere-Proxy、ProxySQL),但其讀寫分離原理具有參考價值。生產環境請選擇活躍社群的中間件,並配合 MHA/Orchestrator 實現主庫自動故障轉移。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved