基於Ameoba實現mysql讀寫分離

1、Amoeba介紹html

Amoeba:基於Java研發,配置文件xml文檔。對事務支持功能不好,不支持分佈式讀,尤爲不支持分佈式事務。默認監聽在8066端口上。2.2.x開始支持單庫事務,沒有緩存功能,全部請求直接向後轉發。對內存佔用少,而對CPU佔用大。前端

2、架構簡介java

Amoeba服:192.168.1.253 監聽端口80663306,做爲後端mysql服務器代理,監控後端mysql服務器健康的端口9066node

主服:station20:192.168.1.20,前端代理往主服寫操做會自動複製到從服。mysql

從服:station21:192.168.1.21linux

若是是多從,在前端代理裏設置一個負載均衡從服組(虛擬服務器),組內按調度算法調度,三種算法:輪詢rr,加權輪詢wrr,高可用ha.算法

地址:http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/sql

wKiom1OB8qaCMgKbAAEYFXPU8AE320.jpg

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' |

 

Amobavim

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()
相關文章
相關標籤/搜索