一 amoebahtml
Amoeba是一個以MySQL爲底層數據存儲,並對應用提供MySQL協議接口的proxy。它集中地響應應用的請求,依據用戶事先設置的規則,將SQL請求發送到特定的數據庫上執行。基於此能夠實現負載均衡、讀寫分離、高可用性等需求。與MySQL官方的MySQL Proxy相比,做者強調的是amoeba配置的方便(基於XML的配置文件,用SQLJEP語法書寫規則,比基於lua腳本的MySQL Proxy簡單)。java
Amoeba優缺點mysql
優勢:linux
一、下降 數據切分帶來的複雜多數據庫結構sql
二、提升系統總體可用性數據庫
三、提供切分規則並下降 數據切分規則 給應用帶來的影響vim
四、下降db 與客戶端的鏈接數後端
五、能夠直接實現讀寫分離及負載均衡效果,而不用修改代碼centos
缺點:服務器
一、不支持事務與存儲過程
二、暫不支持分庫分表,amoeba目前只作到分數據庫實例
三、不適合從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