mysql數據庫的讀寫分離 amoeba

一 amoeba

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

Amoeba優缺點

優點:

1、降低 數據切分帶來的複雜多數據庫結構

2、提高系統整體可用性

3、提供切分規則並降低 數據切分規則 給應用帶來的影響

4、降低db 與客戶端的連接數

5、可以直接實現讀寫分離及負載均衡效果,而不用修改代碼

缺點:

1、不支持事務與存儲過程

2、暫不支持分庫分表,amoeba目前只做到分數據庫實例

3、不適合從amoeba導數據的場景或者對大數據量查詢的query並不合適(比如一次請求返回10w以上甚至更多數據的場合)

 

二 數據庫讀寫分離配置

環境

系統 centos 6.4 x86_64

軟件 mysql5.6.19              jdk1.7        amoeba2.2

amoeba服務器  192.168.200.19

master                192.168.200.17

slave                    192.168.200.18

主從服務器複製見以前的博客 此處略

 

1 配置JDK

[root@bogon ~]# rpm -ivh jdk-7u60-linux-x64.rpm 
[root@bogon ~]# vim /etc/profile.d/java.sh 
export JAVA_HOME=/usr/java/latest
export PATH=$PATH:$JAVA_HOME/bin
[root@bogon ~]# .  /etc/profile.d/java.sh 
[root@bogon ~]# java -version
java version Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

2 安裝amoeba

[root@bogon ~]# mkdir /usr/local/amoeba
[root@bogon ~]# tar -xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
[root@bogon ~]# cd /usr/local/amoeba/
[root@bogon amoeba]# ls
benchmark  bin  changelogs.txt  conf  lib  LICENSE.txt  README.html
[root@bogon amoeba]# ls conf
access_list.conf  dbserver.dtd   functionMap.xml  rule.dtd
amoeba.dtd        dbServers.xml  log4j.dtd        ruleFunctionMap.xml
amoeba.xml        function.dtd   log4j.xml        rule.xml
  Amoeba總共有7個配置文件,分別如下:

  Amoeba主配置文件($AMOEBA_HOME/conf/amoeba.xml),用來配置Amoeba服務的基本參數,如Amoeba主機地址、端口、認證方式、用於連接的用戶名、密碼、線程數、超時時間、其他配置文件的位置等。

  數據庫服務器配置文件($AMOEBA_HOME/conf/dbServers.xml),用來存儲和配置Amoeba所代理的數據庫服務器的信息,如:主機IP、端口、用戶名、密碼等。

  切分規則配置文件($AMOEBA_HOME/conf/rule.xml),用來配置切分規則。

  數據庫函數配置文件($AMOEBA_HOME/conf/functionMap.xml),用來配置數據庫函數的處理方法,Amoeba將使用該配置文件中的方法解析數據庫函數。

  切分規則函數配置文件($AMOEBA_HOME/conf/ruleFunctionMap.xml),用來配置切分規則中使用的用戶自定義函數的處理方法。

  訪問規則配置文件($AMOEBA_HOME/conf/access_list.conf),用來授權或禁止某些服務器IP訪問Amoeba。

  日誌規格配置文件($AMOEBA_HOME/conf/log4j.xml),用來配置Amoeba輸出日誌的級別和方式。

 

[root@bogon conf]# vim dbServers.xml 
<?xml version= encoding=?>

<!DOCTYPE amoeba:dbServers SYSTEM >
<amoeba:dbServers xmlns:amoeba=>

                <!-- 
                        Each dbServer needs to be configured into a Pool,
                        If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:
                         add attribute with name  =   dbServer, but the configuration does not allow the element with name factoryConfig
                         such   dbServer   
                -->

        <dbServer name= abstractive=>
                <factoryConfig =>
                        <property name=>${defaultManager}</property>
                        <property name=>64</property>
                        <property name=>128</property>

                        <!-- mysql port -->
                        <property name=>3306</property>

                        <!-- mysql schema -->
                        <property name=>test</property>

# 設置amoeba連接後端數據庫服務器的賬號 密碼 需在後端服務器上創建該用戶,並授權amoeba連接
                        <!-- mysql user -->
                        <property name=>root</property>

                        <property name=>redhat</property>
                        <!--  mysql password
                        <property name=>password</property>
                        -->
                </factoryConfig>

                <poolConfig =>
                        <property name=>500</property>
                        <property name=>500</property>
                        <property name=>10</property>
                        <property name=>600000</property>
                        <property name=>600000</property>
                        <property name=></property>
                        <property name=></property>
                        <property name=></property>
                </poolConfig>
        </dbServer>
# 設置一個後端服務器 名字可以隨便取
        <dbServer name=  parent=>
                <factoryConfig>
                        <!-- mysql ip -->
                        <property name=>192.168.200.17</property>
                </factoryConfig>
        </dbServer>

        <dbServer name=  parent=>
                <factoryConfig>
                        <!-- mysql ip -->
                        <property name=>192.168.200.18</property>
                </factoryConfig>
        </dbServer>
#指定一個虛擬數據庫服務器,可以將上面定義的dbserver加入這個虛擬服務器,相當組成一個組
 <dbServer name= =>
                <poolConfig =>
                        <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
                        <property name=>1</property>

                        <!-- Separated by commas,such : server1,server2,server1 -->
                        <property name=>server1,server2</property>
                </poolConfig>
        </dbServer>

</amoeba:dbServers>

 

 

[root@bogon conf]# vim amoeba.xml 
<?xml version= encoding=?>

<!DOCTYPE amoeba:configuration SYSTEM >
<amoeba:configuration xmlns:amoeba=>

        <proxy>

                <!-- service  must implements com.meidusa.amoeba.service.Service -->
                <service name= =>
#設置amoeba監聽的端口
                        <!-- port -->
                        <property name=>8066</property>
#設置監聽的接口,如果不設置,則監聽所有的IP
                        <!-- bind ipAddress -->
                        <!-- 
                        <property name=>127.0.0.1</property>
                         -->

                        <property name=>${clientConnectioneManager}</property>

                        <property name=>
                                <bean =>
                                        <property name=>128</property>
                                        <property name=>64</property>
                                </bean>
                        </property>

                        <property name=>
                                <bean =>
#提供客戶端連接amoeba時需要使用的賬號 密碼 與 amoeba連接後端數據庫服務器密碼無關
                                        <property name=>root</property>

                                        <property name=>redhat</property>

                                        <property name=>
                                                <bean =>
                                                        <property name=>${amoeba.home}/conf/access_list.conf</property>
                                                </bean>
                                        </property>
                                </bean>
                        </property>

                </service>
................................................(省略)

 <dbServerLoader =>
                <property name=>${amoeba.home}/conf/dbServers.xml</property>
        </dbServerLoader>

        <queryRouter =>
                <property name=>
                        <bean =>
                                <property name=>${amoeba.home}/conf/rule.xml</property>
                                <property name=>${amoeba.home}/conf/ruleFunctionMap.xml</property>
                        </bean>
                </property>
                <property name=>${amoeba.home}/conf/functionMap.xml</property>
                <property name=>1500</property>
                <property name=>server1</property>
#設置讀寫分離選項
                <property name=>server1</property>
                <property name=>server2</property>
                <!--
                <property name=>server1</property>
                <property name=>server1</property>
                -->
                <property name=></property>
        </queryRouter>
</amoeba:configuration>

 

 

配置amoeba 環境變量

[root@bogon conf]# vim /etc/profile.d/amoeba.sh
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin:
[root@bogon conf]# .  /etc/profile.d/amoeba.sh

 

啓動amoeba

在JDK1.7下 提示會提示堆內存過小

root@bogon bin]# ./amoeba start

The stack size specified  too small, Specify at least 228k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

[root@bogon bin]# vim amoeba
DEFAULT_OPTS=改爲
DEFAULT_OPTS=[root@bogon bin]# ./amoeba start
log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2014-07-19 09:12:17,345 INFO  context.MysqlRuntimeContext - Amoeba  Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.2.0
log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf
2014-07-19 09:12:47,868 INFO  net.ServerableConnectionManager - Amoeba  Mysql listening on 0.0.0.0/0.0.0.0:8066.
2014-07-19 09:12:47,870 INFO  net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:19499.

 

 

測試

在主DB server上操作

mysql> create databaes db;
mysql>use db
mysql>create table t1(name varchar(10);
mysql>grant all privileges on *.* to @ identified by ;
mysql>flush privileges;
root@bogon ~]# mysql -uroot -predhat -h192.168.200.19  --port 8066
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id  390789680
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle  a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type  or   help. Type  to clear the current input statement.

mysql> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db                 |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows  set (0.01 sec)
mysql> use db;
Reading table information  completion of table and column names
You can turn off  feature to get a quicker startup with -A

Database changed
mysql> show tables;
+--------------+
| Tables_in_db |
+--------------+
| t1           |
+--------------+
1 row  set (0.00 sec)

 

 

注 amoeba服務器提示

java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed

mysql>

ERROR 2006 (HY000): MySQL server has gone away  
No connection. Trying to reconnect...  
Connection id: 11416420  
Current database: test  
ERROR 2006 (HY000): MySQL server has gone away  
No connection. Trying to reconnect...  
Connection id: 11416420  
Current database: test  
ERROR 2006 (HY000): MySQL server has gone away

 

amoeba服務器連接mysql過慢,超時,因mysql 對客戶端連接不管是host或ip 都要反解

可在/etc/my.cnf

[mysqld]

skip-name-resolve

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章