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

jopen 11年前發布 | 41K 次閱讀 MySQL 數據庫服務器

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 toMASTER_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配置成功。當然如果想看是否已經實現了完全的主從分離,可以自己抓包分析查看。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!