同事 Struct Chen 的 Amoeba For MySQL 项目已经 出来不短时间了,可一直没有时间好好体验,最近一直在做一些软件和硬件的功能以及性能相关的测试工作,Amoeba For MySQL自然也将被列入计划之内。
对 Amoeba For MySQL 的测试到目前位置主要还是功能方面的测试,配置了一套四台机器的环境:
Server A: Amoeba Server
Server B: MySQL Master
Server C: MySQL Slave1
Server D: MySQL Slave2
软件环境:RHEL5.2 (X86_64),JAVA 1.5.0_16, Amoeba For MySQL 0.31
测试功能:
1、读写分离
2、数据垂直切分
3、数据水平切分
amoeba.xml配置如下:
<
?
xml
version
=
"
1.0
"
encoding
=
"
gbk
"
?>
< ! DOCTYPE amoeba:configuration SYSTEM " amoeba.dtd " >
< amoeba :configuration xmlns:amoeba = " http://amoeba.meidusa.com/ " >
< server >
< property name = " port " > 8066 </ property >
< property name = " ipAddress " > 10.0.38.21 </ property >
<!-- proxy server net IO Read thread size -->
< property name = " readThreadPoolSize " > 500 </ property >
<!-- proxy server client process thread size -->
< property name = " clientSideThreadPoolSize " > 500 </ property >
<!-- mysql server data packet process thread size -->
< property name = " serverSideThreadPoolSize " > 500 </ property >
<!-- socket Send and receive BufferSize(unit:K) -->
< property name = " netBufferSize " > 200 </ property >
<!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
< property name = " tcpNoDelay " > true </ property >
< property name = " user " > user </ property >
< property name = " password " > password </ property >
</ server >
< connectionmanagerlist >
< connectionmanager name = " defaultManager " >
< classname > com.meidusa.amoeba.net.AuthingableConnectionManager </ classname >
</ connectionmanager >
</ connectionmanagerlist >
< dbserverlist >
< dbserver name = " master " >
< factoryconfig >
< classname > com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory </ classname >
< property name = " manager " > defaultManager </ property >
< property name = " port " > 3306 </ property >
< property name = " ipAddress " > 10.0.38.37 </ property >
< property name = " schema " > test </ property >
< property name = " user " > root </ property >
< property name = " password " > password </ property >
</ factoryconfig >
< poolconfig >
< classname > com.meidusa.amoeba.net.poolable.PoolableObjectPool </ classname >
< property name = " maxActive " > 500 </ property >
< property name = " maxIdle " > 200 </ property >
< property name = " minIdle " > 10 </ property >
< property name = " minEvictableIdleTimeMillis " > 600000 </ property >
< property name = " timeBetweenEvictionRunsMillis " > 600000 </ property >
< property name = " testOnBorrow " > true </ property >
< property name = " testWhileIdle " > true </ property >
</ poolconfig >
</ dbserver >
< dbserver name = " slave1 " >
< factoryconfig >
< classname > com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory </ classname >
< property name = " manager " > defaultManager </ property >
< property name = " port " > 3306 </ property >
< property name = " ipAddress " > 10.0.38.22 </ property >
< property name = " schema " > test </ property >
< property name = " user " > root </ property >
< property name = " password " > password </ property >
</ factoryconfig >
< poolconfig >
< classname > com.meidusa.amoeba.net.poolable.PoolableObjectPool </ classname >
< property name = " maxActive " > 500 </ property >
< property name = " maxIdle " > 200 </ property >
< property name = " minIdle " > 10 </ property >
< property name = " minEvictableIdleTimeMillis " > 600000 </ property >
< property name = " timeBetweenEvictionRunsMillis " > 600000 </ property >
< property name = " testOnBorrow " > true </ property >
< property name = " testWhileIdle " > true </ property >
</ poolconfig >
</ dbserver >
< dbserver name = " slave2 " >
< factoryconfig >
... ...
</ factoryconfig >
< poolconfig >
... ...
</ poolconfig >
</ dbserver >
< dbserver name = " virtualSlave " virtual = " true " >
< poolconfig >
< classname > com.meidusa.amoeba.server.MultipleServerPool </ classname >
<!-- 1=ROUNDROBIN , 2=WEIGHTBASED -->
< property name = " loadbalance " > 1 </ property >
< property name = " poolNames " > slave1,slave2 </ property >
</ poolconfig >
</ dbserver >
</ dbserverlist >
< queryrouter >
< classname > com.meidusa.amoeba.mysql.parser.MysqlQueryRouter </ classname >
< property name = " ruleConfig " > ${amoeba.home}/conf/rule.xml </ property >
< property name = " functionConfig " > ${amoeba.home}/conf/functionMap.xml </ property >
< property name = " ruleFunctionConfig " > ${amoeba.home}/conf/ruleFunctionMap.xml </ property >
< property name = " LRUMapSize " > 1500 </ property >
< property name = " defaultPool " > master </ property >
< property name = " writePool " > master </ property >
< property name = " readPool " > virtualSlave </ property >
< property name = " needParse " > true </ property >
</ queryrouter >
</ amoeba >
< ! DOCTYPE amoeba:configuration SYSTEM " amoeba.dtd " >
< amoeba :configuration xmlns:amoeba = " http://amoeba.meidusa.com/ " >
< server >
< property name = " port " > 8066 </ property >
< property name = " ipAddress " > 10.0.38.21 </ property >
<!-- proxy server net IO Read thread size -->
< property name = " readThreadPoolSize " > 500 </ property >
<!-- proxy server client process thread size -->
< property name = " clientSideThreadPoolSize " > 500 </ property >
<!-- mysql server data packet process thread size -->
< property name = " serverSideThreadPoolSize " > 500 </ property >
<!-- socket Send and receive BufferSize(unit:K) -->
< property name = " netBufferSize " > 200 </ property >
<!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
< property name = " tcpNoDelay " > true </ property >
< property name = " user " > user </ property >
< property name = " password " > password </ property >
</ server >
< connectionmanagerlist >
< connectionmanager name = " defaultManager " >
< classname > com.meidusa.amoeba.net.AuthingableConnectionManager </ classname >
</ connectionmanager >
</ connectionmanagerlist >
< dbserverlist >
< dbserver name = " master " >
< factoryconfig >
< classname > com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory </ classname >
< property name = " manager " > defaultManager </ property >
< property name = " port " > 3306 </ property >
< property name = " ipAddress " > 10.0.38.37 </ property >
< property name = " schema " > test </ property >
< property name = " user " > root </ property >
< property name = " password " > password </ property >
</ factoryconfig >
< poolconfig >
< classname > com.meidusa.amoeba.net.poolable.PoolableObjectPool </ classname >
< property name = " maxActive " > 500 </ property >
< property name = " maxIdle " > 200 </ property >
< property name = " minIdle " > 10 </ property >
< property name = " minEvictableIdleTimeMillis " > 600000 </ property >
< property name = " timeBetweenEvictionRunsMillis " > 600000 </ property >
< property name = " testOnBorrow " > true </ property >
< property name = " testWhileIdle " > true </ property >
</ poolconfig >
</ dbserver >
< dbserver name = " slave1 " >
< factoryconfig >
< classname > com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory </ classname >
< property name = " manager " > defaultManager </ property >
< property name = " port " > 3306 </ property >
< property name = " ipAddress " > 10.0.38.22 </ property >
< property name = " schema " > test </ property >
< property name = " user " > root </ property >
< property name = " password " > password </ property >
</ factoryconfig >
< poolconfig >
< classname > com.meidusa.amoeba.net.poolable.PoolableObjectPool </ classname >
< property name = " maxActive " > 500 </ property >
< property name = " maxIdle " > 200 </ property >
< property name = " minIdle " > 10 </ property >
< property name = " minEvictableIdleTimeMillis " > 600000 </ property >
< property name = " timeBetweenEvictionRunsMillis " > 600000 </ property >
< property name = " testOnBorrow " > true </ property >
< property name = " testWhileIdle " > true </ property >
</ poolconfig >
</ dbserver >
< dbserver name = " slave2 " >
< factoryconfig >
... ...
</ factoryconfig >
< poolconfig >
... ...
</ poolconfig >
</ dbserver >
< dbserver name = " virtualSlave " virtual = " true " >
< poolconfig >
< classname > com.meidusa.amoeba.server.MultipleServerPool </ classname >
<!-- 1=ROUNDROBIN , 2=WEIGHTBASED -->
< property name = " loadbalance " > 1 </ property >
< property name = " poolNames " > slave1,slave2 </ property >
</ poolconfig >
</ dbserver >
</ dbserverlist >
< queryrouter >
< classname > com.meidusa.amoeba.mysql.parser.MysqlQueryRouter </ classname >
< property name = " ruleConfig " > ${amoeba.home}/conf/rule.xml </ property >
< property name = " functionConfig " > ${amoeba.home}/conf/functionMap.xml </ property >
< property name = " ruleFunctionConfig " > ${amoeba.home}/conf/ruleFunctionMap.xml </ property >
< property name = " LRUMapSize " > 1500 </ property >
< property name = " defaultPool " > master </ property >
< property name = " writePool " > master </ property >
< property name = " readPool " > virtualSlave </ property >
< property name = " needParse " > true </ property >
</ queryrouter >
</ amoeba >
rule.xml配置:
<
?
xml
version
=
"
1.0
"
encoding
=
"
gbk
"
?>
< ! DOCTYPE amoeba:rule SYSTEM " rule.dtd " >
< amoeba :rule xmlns:amoeba = " http://amoeba.meidusa.com/ " >
< tablerule name = " test_horiz " schema = " test " defaultPools = " master " >
< rule name = " rule1 " >
< parameters > ID </ parameters >
< expression >< ![ CDATA [ ID <= 100000000 ]] ></ expression >
< defaultpools > master </ defaultpools >
< readpools > slave1 </ readpools >
< writepools > master </ writepools >
</ rule >
< rule name = " rule2 " >
< parameters > ID </ parameters >
< expression >< ![ CDATA [ ID between 100000001 and 200000000 ]] ></ expression >
< defaultpools > master </ defaultpools >
< writepools > master2 </ writepools >
< readpools > slave2 </ readpools >
</ rule >
< rule name = " rule3 " >
< parameters > ID </ parameters >
< expression >< ![ CDATA [ ID > 200000000 ]]> </ expression >
< defaultpools > master </ defaultpools >
</ rule >
</ tablerule >
< tablerule name = " master " schema = " test " defaultPools = " master " />
< tablerule name = " slave1 " schema = " test " defaultPools = " slave1 " />
< tablerule name = " slave2 " schema = " test " defaultPools = " slave2 " />
< tablerule name = " master " schema = " t " defaultPools = " master " />
</ amoeba >
< ! DOCTYPE amoeba:rule SYSTEM " rule.dtd " >
< amoeba :rule xmlns:amoeba = " http://amoeba.meidusa.com/ " >
< tablerule name = " test_horiz " schema = " test " defaultPools = " master " >
< rule name = " rule1 " >
< parameters > ID </ parameters >
< expression >< ![ CDATA [ ID <= 100000000 ]] ></ expression >
< defaultpools > master </ defaultpools >
< readpools > slave1 </ readpools >
< writepools > master </ writepools >
</ rule >
< rule name = " rule2 " >
< parameters > ID </ parameters >
< expression >< ![ CDATA [ ID between 100000001 and 200000000 ]] ></ expression >
< defaultpools > master </ defaultpools >
< writepools > master2 </ writepools >
< readpools > slave2 </ readpools >
</ rule >
< rule name = " rule3 " >
< parameters > ID </ parameters >
< expression >< ![ CDATA [ ID > 200000000 ]]> </ expression >
< defaultpools > master </ defaultpools >
</ rule >
</ tablerule >
< tablerule name = " master " schema = " test " defaultPools = " master " />
< tablerule name = " slave1 " schema = " test " defaultPools = " slave1 " />
< tablerule name = " slave2 " schema = " test " defaultPools = " slave2 " />
< tablerule name = " master " schema = " t " defaultPools = " master " />
</ amoeba >
由于第一步主要还只是测试读写分离与数据的垂直切分,所以水平切分的规则设置的很简单,仅仅是按照ID的范围设置简单的规则。而设置一些更为复杂的规则。
总体测试效果还是比较满意的,预期的功能都全部正常,当然所用于测试的SQL语句也大都比较简单,主要还是根据当前工作中遇到的一些SQL。
这次测试没有进行性能测试,等后面再找时间测试一下,不知道有没有哪位朋友已经做过了相应的性能测试没?性能测试之后就要开始规划应用到某些应用上面去了