Amoeba 是基於 MySQL 協議的 Java Proxy,介於應用與資料庫之間,依規則將 SQL 路由至特定實例,實現負載均衡、讀寫分離、高可用。對比官方 MySQL Proxy(Lua 腳本),Amoeba 採 XML + SQLJEP 語法,配置更直觀。
log_bin=index
server_id=1
授權複寫帳號:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*
TO 'user'@'192.168.1.142' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
server_id=10
relay_log=relay
建立複寫連線:
CHANGE MASTER TO
MASTER_HOST='192.168.1.141',
MASTER_USER='user',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='index.000004',
MASTER_LOG_POS=429;
START SLAVE;
確認 Slave_IO_Running: Yes 與 Slave_SQL_Running: Yes。
JAVA_HOME、PATH。amoeba-mysql-binary-2.2.0.tar.gz 解壓至 /usr/local/amoeba。bin(啟動腳本)、conf(配置)、lib(依賴)。<service name="Amoeba for Mysql" ...>
<property name="port">3306</property>
<property name="ipAddress">0.0.0.0</property>
<property name="authenticator">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<property name="user">root</property>
<property name="password">amoeba</property>
</bean>
</property>
</service>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="writePool">test1</property> <!-- 寫 -> Master -->
<property name="readPool">test2</property> <!-- 讀 -> Slave -->
<property name="needParse">true</property>
</queryRouter>
<dbServer name="test1" parent="abstractServer"> <!-- Master -->
<factoryConfig>
<property name="ipAddress">192.168.1.141</property>
</factoryConfig>
</dbServer>
<dbServer name="test2" parent="abstractServer"> <!-- Slave -->
<factoryConfig>
<property name="ipAddress">192.168.1.142</property>
</factoryConfig>
</dbServer>
後端 MySQL 授權 Amoeba 連線:
GRANT ALL ON *.* TO 'root'@'192.168.1.121' IDENTIFIED BY 'amoebapass';
修改 bin/amoeba 腳本的 -Xss128k 為 -Xss256k 避免堆疊過小報錯。執行 /usr/local/amoeba/bin/amoeba start。
客戶端測試:
mysql -uroot -pamoeba -h192.168.1.121
寫入操作落在 Master,讀取落在 Slave,抓包可驗證路由正確性。