參考:http://www.jianzhaoyang.com/database/amoeba_for_mysql
開發者博客:http://amoeba.meidusa.com/wordpress/
基於amoeba實現的MySQL數據庫讀寫分離,負載均衡,可擴展性架構:
amoeba是一個基於j2se開發的數據庫連接池,可對數據庫水平切分,垂直切分,或者兩者結合。
amoeba.JPG
Amoeba for MySQL環境:
軟件環境:
OS:RedHat 5.2 (32bit)
MYSQL:MySQL-5.0.77
Amoeba:amoeba-mysql-1.0.0-BETA
JDK:
jdk-6u14-linux-i586
主要測試功能:
1,
讀寫分離
2,
負載均衡
Amoeba主配置文件:
amoeba.xml
主配置文件,配置所有數據源及Amoeba自身的參數。
rule.xml
配置所有Query路由規則的信息:
functionMap.xml
配置用於解析Query中的函數所對應的Java實現類
nullFunctionMap.xml
配置路由規則中需要使用到的特定函數的實現類。
整體配置方案:
配置MySQL 複製。在amoeba server上安裝JDK
這裏不做詳細說明
配置JAVA環境變量
CODE:
[root@localhost ~]# cat .bashrc
JAVA_HOME=/usr/java/jdk1.6.0_14
CLASSPATH=.{JAVA_HOME}/lib/dt.jar{JAVA_HOME}/lib/tools.jar{JAVA_HOME}/lib{JAVA_HOME}/jre/lib
PATH=$PATH{JAVA_HOME}/bin{JAVA_HOME}/jre/bin
export JAVA_HOME CLASSPATH PATH
amoeba.xml文件配置:
CODE:
<?xml version="1.0"encoding="gbk"?>
<!DOCTYPE amoeba:configurationSYSTEM "amoeba.dtd">
<amoeba:configurationxmlns:amoeba="http://amoeba.meidusa.com/">
<server>
<propertyname="port">3306</property>
<propertyname="ipAddress">192.168.0.230</property>
<propertyname="readThreadPoolSize">20</property>
<propertyname="clientSideThreadPoolSize">30</property>
<propertyname="serverSideThreadPoolSize">30</property>
<propertyname="netBufferSize">128</property>
<propertyname="tcpNoDelay">true</property>
<propertyname="user">root</property>
<propertyname="password">root</property>
</server>
<connectionManagerList>
<connectionManagername="defaultManager" />
</connectionManagerList>
<dbServerList>
<dbServername="master">
<factoryConfigclass="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<propertyname="manager">defaultManager</property>
<propertyname="port">3306</property>
<propertyname="ipAddress">192.168.0.240</property>
<propertyname="schema">duote</property>
<propertyname="user">root</property>
<propertyname="password">root</property>
</factoryConfig>
<poolConfigclass="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<propertyname="maxActive">200</property>
<propertyname="maxIdle">200</property>
<propertyname="minIdle">10</property>
<propertyname="minEvictableIdleTimeMillis">600000</property>
<propertyname="timeBetweenEvictionRunsMillis">600000</property>
<propertyname="testOnBorrow">true</property>
<propertyname="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServername="slave1">
<factoryConfigclass="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<propertyname="manager">defaultManager</property>
<propertyname="port">3306</property>
<propertyname="ipAddress">192.168.0.241</property>
<propertyname="schema">duote</property>
<propertyname="user">root</property>
<propertyname="password">root</property>
</factoryConfig>
<poolConfigclass="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<propertyname="maxActive">200</property>
<propertyname="maxIdle">200</property>
<propertyname="minIdle">10</property>
<propertyname="minEvictableIdleTimeMillis">600000</property>
<propertyname="timeBetweenEvictionRunsMillis">600000</property>
<propertyname="testOnBorrow">true</property>
<propertyname="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServername="multiPool" virtual="true">
<poolConfigclass="com.meidusa.amoeba.server.MultipleServerPool">
<propertyname="loadbalance">1</property>
<propertyname="poolNames">slave1</property>
</poolConfig>
</dbServer>
</dbServerList>
<dbServername="slave2">
<factoryConfigclass="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<propertyname="manager">defaultManager</property>
<propertyname="port">3306</property>
<propertyname="ipAddress">192.168.0.242</property>
<propertyname="schema">duote</property>
<propertyname="user">root</property>
<propertyname="password">root</property>
</factoryConfig>
<poolConfigclass="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<propertyname="maxActive">200</property>
<propertyname="maxIdle">200</property>
<propertyname="minIdle">10</property>
<propertyname="minEvictableIdleTimeMillis">600000</property>
<propertyname="timeBetweenEvictionRunsMillis">600000</property>
<propertyname="testOnBorrow">true</property>
<propertyname="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<!—負載均衡配置
-->
<dbServer virtual="true">
<poolConfigclass="com.meidusa.amoeba.server.MultipleServerPool">
<propertyname="loadbalance">1</property>
<propertyname="poolNames">slave1,slave2</property>
</poolConfig>
</dbServer>
</dbServerList>
<queryRouterclass="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<propertyname="ruleConfig">${amoeba.home}/conf/rule.xml</property>
<propertyname="functionConfig">${amoeba.home}/conf/functionMap.xml</property>
<propertyname="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
<propertyname="LRUMapSize">1500</property>
<!—讀寫分離配置
-->
<propertyname="defaultPool">master</property>
<propertyname="writePool">master</property>
<property >multiPool</property>
<propertyname="needParse">true</property>
</queryRouter>
</amoeba:configuration>