Amoeba是一個以MySQL為底層數據存儲,並對應用提供MySQL協議接口的proxy。它集中地響應應用的請求,依據用戶事先設置的規則,將SQL請求發送到特定的數據庫上執行。基於此可以實現負載均衡、讀寫分離、高可用性等需求。與MySQL官方的MySQL Proxy相比,作者強調的是amoeba配置的方便(基於XML的配置文件,用SQLJEP語法書寫規則,比基於lua腳本的MySQL
Proxy簡單)。本文就來實現一個簡單的amoeba的配置
實驗環境:
192.168.1.121為amoeba服務器,提供讀寫分離
192.168.1.141為mysql的主服務器
192.168.1.142為mysql的從服務器
1.為mysql主服務器提供配置
編輯/etc/my.cnf,提供以下的配置
log_bin=index
server_id=1
在主服務器上授權
mysql> grant replication slave,replication client on user@'192.168.1.142' identified by "123456";
mysql> flush privileges;
2.為mysql從服務提供配置
編輯/etc/my.cnf,提供以下的配置
server_id=10
relay_log=relay
進入mysql命令行接口
mysql > change master to
MASTER_HOST="192.168.1.141",MASTER_USER="user",MASTER_PASSWORD="123456",MASTER_LOG_FILE="index.000004",MASTER_LOG_POS=429;
mysql > start slave;
如果能夠看到Slave_IO_Running: Yes和Slave_SQL_Running:Yes兩行信息的話,證明主從配置已經成功。
3.在192.168.1.121上安裝amoeba
amoeba是java開發的,所以首先需要裝jdk.
[root@localhost ~]# chmod +x jdk-6u43-linux-x64.bin
[root@localhost ~]# ./jdk-6u43-linux-x64.bin
# vi /etc/profile.d/java.sh
export JAVA_HOME=/root/jdk1.6.0_43/bin
export PATH=$JAVA_HOME/bin:$PATH
# source /etc/profile.d/java.sh
安裝amoeba
# wget http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.2.x/amoeba-mysql-binary-2.2.0.tar.gz/download
# mkdir /usr/local/amoeba
# tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
進入amoeba目錄下會看到一下幾個目錄
bechmark:壓力測試
bin:腳本文件
conf:配置文件
lib:庫
在conf文件下有許多配置文件,這裡實現讀寫分離的效果,只需要兩個文件即可amoeba.xml和dbserver.xml。在amoeba.xml文件下需要修改的配置為:
<service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">
<!-- port -->
<property name="port">3306</property> #連接amoeba時所使用的端口號
<!-- bind ipAddress -->
<!--
<property name="ipAddress">127.0.0.1</property> #
-->
<property name="ipAddress">0.0.0.0</property> #監聽地址
<property name="manager">${clientConnectioneManager}</property>
<property name="connectionFactory">
<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
<property name="sendBufferSize">128</property>
<property name="receiveBufferSize">64</property>
</bean>
</property>
<property name="authenticator">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<property name="user">root</property> #連接amoeba時候的賬戶
<property name="password">amoeba</property> #連接amoeba時候的密碼
<property name="filter">
<bean class="com.meidusa.amoeba.server.IPAccessController">
<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property>
</service>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<!--<property name="defaultPool">server1</property>--> #不需要默認路由
<property name="writePool">test1</property> #寫路由到test1上去
<property name="readPool">test2</property> #讀路由到test2上去
<property name="needParse">true</property>
</queryRouter>
在dbserver.xml文件中需要修改的配置為:
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property>
<!-- mysql port -->
<property name="port">3306</property> #後端mysql的端口
<!-- mysql schema -->
<property name="schema">amoeba</property> #後端mysql的默認連接數據庫
<!-- mysql user -->
<property name="user">root</property> #連接後端mysql的賬戶
<!-- mysql password
<property name="password">password</property>
-->
<property name="password">amoebapass</property> #連接後端mysql使用的密碼
</factoryConfig>
<dbServer name="test1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.1.141</property> #後端MySQL的ip
</factoryConfig>
</dbServer>
<dbServer name="test2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.1.142</property>
</factoryConfig>
</dbServer>
在後端代理mysql上給amoeba授權,在192.168.1.141上執行如下操作:
grant all on *.* to 'root'@'192.168.1.121' identified by 'amoebapass';(不用在備庫執行,會自動同步過去)
所有的東西配置好以後就可以開始啟動amoeba了,執行:/usr/local/amoeba/bin/amoeba可能會遇到以下錯誤:
The stack size specified is too small, Specify at least 160k Could not create the Java virtual machine.
修改 amoeba 文件,vi /usr/local/amoeba/bin/amoeba,找到如下的文件:
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
將其修改為:
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k
再次執行/usr/local/amoeba/bin/amoeba,如果出現amoeba start|stop 就可以啟動amoeba了
# /usr/local/amoeba/bin/amoeba start
啟動成功以後,在安裝amoeba的服務器上裝一個mysql的客戶端來測試
# yum install mysql
# mysql -uroot -pamoeba -h192.168.1.121
如果連接成功,並且創建成功的語句可以在後端的代理mysql上顯示出來,證明amoeba配置成功。當然如果想看是否已經實現了完全的主從分離,可以自己抓包分析查看。