1、Amoeba介紹html
Amoeba:基於Java研發,配置文件xml文檔。對事務支持功能不好,不支持分佈式讀,尤爲不支持分佈式事務。默認監聽在8066端口上。2.2.x開始支持單庫事務,沒有緩存功能,全部請求直接向後轉發。對內存佔用少,而對CPU佔用大。前端
2、架構簡介java
Amoeba服:192.168.1.253 監聽端口8066改3306,做爲後端mysql服務器代理,監控後端mysql服務器健康的端口9066。node
主服:station20:192.168.1.20,前端代理往主服寫操做會自動複製到從服。mysql
從服:station21:192.168.1.21linux
若是是多從,在前端代理裏設置一個負載均衡從服組(虛擬服務器),組內按調度算法調度,三種算法:輪詢rr,加權輪詢wrr,高可用ha.算法
地址:http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/sql
3、操做步驟數據庫
主服新建遠程用戶,從服自動複製次條目 mysql>grant all on *.* to 'root'@'%' identified by 'amoebapass'; mysql>flush privileges; ------------------------------------------------------------------ 從服 mysql>show grants for root@'%'; | Grantsfor root@% | GRANTALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD'*84BB5DF4823DA319BBF86C99624479A198E6EEE9' |
Amoba服vim
1.安裝Amoeba [root@station253~]# cp /mnt/hgfs/Share64/jdk/jdk-6u31-linux-x64-rpm.bin /tmp [root@station253tmp]# chmod +x jdk-6u31-linux-x64-rpm.bin [root@station253tmp]# ./jdk-6u31-linux-x64-rpm.bin [root@station253tmp]# vim /etc/profile.d/java.sh exportJAVA_HOME=/usr/java/latest exportPATH=$JAVA_HOME/bin:$PATH [root@station253tmp]# . /etc/profile.d/java.sh [root@station253tmp]# java -version javaversion "1.6.0_31" Java(TM)SE Runtime Environment (build 1.6.0_31-b04) JavaHotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode) 混合模式,支持編譯 [root@station253tmp]# cp /mnt/hgfs/Share64/amoeba/amoeba-mysql-binary-2.2.0.tar.gz . ameoba不會自行建立目錄,手工建立 [root@station253tmp]# mkdir -pv /usr/local/amoeba-2.2.0 #保留版本信息便於後期識別 [root@station253tmp]# tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba-2.2.0 [root@station253tmp]# cd /usr/local/ [root@station253local]# ln -sv amoeba-2.2.0/ amoeba "amoeba"-> "amoeba-2.2.0/"
2.添加環境變量 [root@station253local]# vim /etc/profile.d/amoeba.sh exportAMOEBA_HOME=/usr/local/amoeba exportPATH=$AMOEBA_HOME/bin:$PATH [root@station253local]# . /etc/profile.d/amoeba.sh [root@station253conf]# amoeba amoeba start|stop
3.配置amoeba服務 [root@station253local]# cd amoeba [root@station253amoeba]# cp -r conf/ backup [root@station253amoeba]# ls backup benchmark bin changelogs.txt conf lib LICENSE.txt README.html [root@station253amoeba]# cd conf 定義數據庫讀寫分離及節點管理信息 [root@station253conf]# vim amoeba.xml <?xml version="1.0"encoding="gbk"?> <!DOCTYPE amoeba:configuration SYSTEM"amoeba.dtd"> <amoeba:configurationxmlns:amoeba="http://amoeba.meidusa.com/"> <proxy> #定義代理 <!-- service class must implementscom.meidusa.amoeba.service.Service --> <service name="Amoeba for Mysql"class="com.meidusa.amoeba.net.ServerableConnectionManager"> #定義服務,由類實現 <!-- port --> #定義鏈接池 <!-- <propertyname="port">8066</property> --> 加外括號註釋 <property name="port">3306</property> #定義監聽端口,將默認改動爲3306 <!-- bindipAddress --> #定義代理服務器對外鏈接的監聽IP <!-- <propertyname="ipAddress">127.0.0.1</property> --> <propertyname="ipAddress">0.0.0.0</property> #定義監聽IP地址,這裏定義爲監聽全部IP <propertyname="manager">${clientConnectioneManager}</property> <propertyname="connectionFactory"> #鏈接池 <beanclass="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory"> <propertyname="sendBufferSize">128</property> #定義發送緩衝大小(可根據主機內存可調整) <propertyname="receiveBufferSize">64</property> #定義接受緩衝的大小(可根據主機內存可調整) </bean> </property> <propertyname="authenticator"> #認證器 <beanclass="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"> <propertyname="user">root</property> #客戶端鏈接後端時的用戶名 <property name="password">amoebapass</property> #客戶端鏈接後端時的密碼 <propertyname="filter"> <beanclass="com.meidusa.amoeba.server.IPAccessController"> <propertyname="ipFile">${amoeba.home}/conf/access_list.conf</property> #只容許哪些客戶端訪問,基於文件實現訪問控制 </bean> </property> </bean> </property> </service> <!-- server class must implementscom.meidusa.amoeba.service.Service --> <servicename="Amoeba Monitor Server"class="com.meidusa.amoeba.monitor.MonitorServer"> #amoeba的監控服務器,監測每個後端的工做狀態 <!-- port --> <property name="port">3306</property> #監控服務器監聽的端口,默認註釋表示使用隨機端口 <!-- bind ipAddress --> <propertyname="ipAddress">127.0.0.1</property> #定義監控服務器監聽的地址 <propertyname="daemon">true</property> <propertyname="manager">${clientConnectioneManager}</property> <propertyname="connectionFactory"> <beanclass="com.meidusa.amoeba.monitor.net.MonitorClientConnectionFactory"></bean> </property> </service> <runtimeclass="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext"> <!-- proxy server net IO Read thread size --> <propertyname="readThreadPoolSize">20</property> <!-- proxyserver client process thread size --> <property name="clientSideThreadPoolSize">30</property> <!-- mysqlserver data packet process thread size --> <propertyname="serverSideThreadPoolSize">30</property> <!-- perconnection cache prepared statement size --> <propertyname="statementCacheSize">500</property> <!-- querytimeout( default: 60 second , TimeUnit:second) --> <propertyname="queryTimeout">60</property> </runtime> </proxy> <!-- EachConnectionManager will start as thread managerresponsible for the Connection IO read , Death Detection --> <connectionManagerList> #定義鏈接池的列表 <connectionManagername="clientConnectioneManager"class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper"> <propertyname="subManagerClassName">com.meidusa.amoeba.net.ConnectionManager</property> <!-- default value is avaliable Processors <propertyname="processors">5</property> --> </connectionManager> <connectionManager name="defaultManager"class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper"> <propertyname="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property> <!-- default valueis avaliable Processors <propertyname="processors">5</property> --> </connectionManager> </connectionManagerList> #鏈接池的列表 <!-- defaultusing file loader --> <dbServerLoaderclass="com.meidusa.amoeba.context.DBServerConfigFileLoader"> <propertyname="configFile">${amoeba.home}/conf/dbServers.xml</property> </dbServerLoader> <queryRouterclass="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"> #定義查詢路由 <property name="ruleLoader"> <beanclass="com.meidusa.amoeba.route.TableRuleFileLoader"> <propertyname="ruleFile">${amoeba.home}/conf/rule.xml</property> <propertyname="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property> </bean> </property> <propertyname="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property> <propertyname="LRUMapSize">1500</property> <propertyname="defaultPool">station20</property> #定義讀寫服務器,這裏默認定義到主服務器上 <propertyname="writePool">station20</property> #定義寫服務器,如有多個用逗號隔開,這些服務器名來自於dbservers.xml <propertyname="readPool">station21</property> #定義讀服務器 <propertyname="needParse">true</property> </queryRouter> </amoeba:configuration> ###############定義鏈接後端Mysql服務器信息############ [root@node conf]# vim dbServers.xml <?xml version="1.0"encoding="gbk"?> <!DOCTYPE amoeba:dbServers SYSTEM"dbserver.dtd"> <amoeba:dbServersxmlns:amoeba="http://amoeba.meidusa.com/"> <!-- Each dbServerneeds to be configured into a Pool, If you need to configure multiple dbServer with loadbalancing that can be simplified by the following configuration:add attributewith name virtual = "true" in dbServer, but the configuration doesnot allow the element with name factoryConfig such as'multiPool' dbServer --> <dbServername="abstractServer" abstractive="true"> #定義服務器,名字叫抽象服務器,支持抽象功能:公共屬性的定義 <factoryConfigclass="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> <propertyname="manager">${defaultManager}</property> <propertyname="sendBufferSize">64</property> #定義發送緩衝大小 <propertyname="receiveBufferSize">128</property> #接受緩衝的大小 <!-- mysql port --> <propertyname="port">3306</property> #監聽的端口 <!-- mysqlschema --> <property name="schema">test</property> #默認鏈接的數據庫服務器 <!-- mysql user --> <property name="user">root</property> #用戶名 <!-- mysql password --> -->上移與<!- 配對,取消下行註釋 <propertyname="password">amoebapass</property> #後端服務器的密碼,受權用戶密碼 </factoryConfig> <poolConfigclass="com.meidusa.amoeba.net.poolable.PoolableObjectPool"> <propertyname="maxActive">500</property> #定義最大活動鏈接數 <propertyname="maxIdle">500</property> #空閒鏈接數 <propertyname="minIdle">10</property> #最少空閒鏈接數 <propertyname="minEvictableIdleTimeMillis">600000</property> <propertyname="timeBetweenEvictionRunsMillis">600000</property> <propertyname="testOnBorrow">true</property> <propertyname="testOnReturn">true</property> <propertyname="testWhileIdle">true</property> </poolConfig> </dbServer> <dbServername="station20" parent="abstractServer"> #定義服務器,其父服務器就是上面的"abstractServer"繼承其屬性,若不想請添加屬性實現定義 <factoryConfig> <!-- mysql ip--> <propertyname="ipAddress">192.168.1.20</property> #server1的IP地址 </factoryConfig> </dbServer> <dbServer name="station21" parent="abstractServer"> #server1的IP地址 <factoryConfig> <!-- mysqlip --> <propertyname="ipAddress">192.168.18.21</property> </factoryConfig> </dbServer> <dbServer name="multiPool"virtual="true"> #定義虛擬服務器組 <poolConfigclass="com.meidusa.amoeba.server.MultipleServerPool"> <!-- Loadbalancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> #算法:1表示輪詢,2:基於權重作輪詢,3:高可用效果 <propertyname="loadbalance">1</property> #還能夠實現負載均衡,算法爲1 <!--Separated by commas,such as: server1,server2,server1 --> <propertyname="poolNames">station20,station21</property> #此處必定是定義的dbname </poolConfig> </dbServer> </amoeba:dbServers>
4.啓動Amoeba [root@station253conf]# amoeba start log4j:WARNlog4j config load completed from file:/usr/local/amoeba/conf/log4j.xml 2014-05-2505:05:40,143 INFO context.MysqlRuntimeContext - Amoeba for Mysql currentversoin=5.1.45-mysql-amoeba-proxy-2.2.0 #檢測後端mysql服務器兼容版本 log4j:WARNip access config load completed fromfile:/usr/local/amoeba/conf/access_list.conf 2014-05-2505:05:40,415 INFO net.ServerableConnectionManager- Amoeba for Mysql listening on /0.0.0.0:3306. #監聽地址及端口 2014-05-2505:05:40,427 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on/127.0.0.1:23679. #管理地址及端口(隨機) ##########中止amoeba########### Ctrl+C #########使用後端啓動########## [root@station253conf]# amoeba start & #########後端啓動服務時中止#### [root@station253conf]# amoeba stop amoebaserver shutting down with port=11422 ###########查看監聽端口######## [root@station253conf]# ss -natlp | grep 3306 LISTEN 0 128 :::3306 :::* users:(("java",2467,50))
5.測試鏈接
[root@station253conf]# mysql -uroot -pamoebapass -h192.168.1.253 YourMySQL connection id is 432598870 前端鏈接的是代理服務器amoeba Serverversion: 5.1.45-mysql-amoeba-proxy-2.2.0 MySQLCommunity Server (GPL) mysql>select version(); 顯示後端數據庫版本 +------------+ |version() | +------------+ |5.6.13-log | +------------+ 測試讀寫分離是否到各自服務器 前端 讀庫 mysql>select user,host from mysql.user; 在讀寫分離後,select必須用庫名+表名,由於默認路由是到test庫 +------+-----------------------+ | user |host | +------+-----------------------+ | root |% | | root |127.0.0.1 | | root |::1 | | | localhost | | root |localhost | | | station21.example.com | | root |station21.example.com | +------+-----------------------+ 後端2服務器提早啓用tcpdump抓包 [root@station21~]# tcpdump -i eth0 -A -nn -s0 tcp dst port 3306 and ip dst host 192.168.1.21 tcpdump:verbose output suppressed, use -v or -vv for full protocol decode listeningon eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 07:20:03.771162IP 192.168.1.253.39815 > 192.168.1.21.3306: Flags [P.], select user,host from mysql.user 前端 寫庫 mysql>create database school; [root@station20~]# tcpdump -i eth0 -A -nn -s0 tcp dst port 3306 and ip dst host 192.168.1.20 tcpdump:verbose output suppressed, use -v or -vv for full protocol decode listeningon eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 07:21:30.426165IP 192.168.1.253.33837 > 192.168.1.20.3306: Flags [P.], create database school mysql>drop database school; drop會先drop寫庫後select讀庫確認刪除 07:33:40.080159IP 192.168.1.253.33849 > 192.168.1.20.3306: Flags [P.], drop database school 07:33:40.410321IP 192.168.1.253.39825 > 192.168.1.21.3306: Flags [P.], SELECT DATABASE()