1. 程式人生 > >mysql中間件amoeba實現mysql讀寫分離

mysql中間件amoeba實現mysql讀寫分離

ipaddress -c export div 高可用 rop 6.0 res grant

Amoeba是一個以MySQL為底層數據存儲,並相應用提供MySQL協議接口的proxy。它集中地響應應用的請求,根據用戶事先設置的規則。將SQL請求發送到特定的數據庫上運行。基於此能夠實現負載均衡、讀寫分離、高可用性等需求。與MySQL官方的MySQL Proxy相比,作者強調的是amoeba配置的方便(基於XML的配置文件,用SQLJEP語法書寫規則,比基於lua腳本的MySQL Proxy簡單)。本文就來實現一個簡單的amoeba的配置

實驗環境:
192.168.1.121為amoebaserver,提供讀寫分離
192.168.1.141為mysql的主server
192.168.1.142為mysql的從server

1.為mysql主server提供配置
編輯/etc/my.cnf,提供下面的配置
log_bin=index
server_id=1
在主server上授權
mysql> grant replication slave,replication client on [email protected] 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.
[[email protected] ~]# chmod +x jdk-6u43-linux-x64.bin
[[email protected] ~]# ./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 [email protected] 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的server上裝一個mysql的client來測試
# yum install mysql
# mysql -uroot -pamoeba -h192.168.1.121
假設連接成功。而且創建成功的語句能夠在後端的代理mysql上顯示出來,證明amoeba配置成功。當然假設想看是否已經實現了全然的主從分離。能夠自己抓包分析查看。

mysql中間件amoeba實現mysql讀寫分離