1. 环境:
水平切分(即写服务器)的两台服务器:192.168.0.114:3307
192.168.0.114:3308
读服务器:192.168.0.114:3309
采用在一台机器上创建多个mysql实例(上篇文章讲的就是怎么配置多个mysql实例的)的方法进行的实验,没办法,老板让做这个,但是又不给我机器。
2. 对amoeba.xml的配置:
在下面代码中:
<servicename="Amoeba for Mysql"class="com.meidusa.amoeba.net.ServerableConnectionManager">
<!-- port -->
<propertyname="port">8806</property>
<propertyname="ipAddress">192.168.0.109</property>
的ipAddress中绑定amoeba服务器(即允许amoeba的机器)的IP,上面我的是192.168.0.109.
在下面代码中:
<propertyname="authenticator">
<beanclass="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<propertyname="user">root</property>
<propertyname="password">hfut</property>
给出授权信息,即登陆amoeba的账号和密码,我的账户名是root,密码是hfut。
在下面代码中:
<servicename="Amoeba Monitor Server" class="com.meidusa.amoeba.monitor.MonitorServer">
<!-- port -->
<!-- default value: random number
<propertyname="port">9066</property>
-->
<!-- bind ipAddress-->
<propertyname="ipAddress">192.168.0.109</property>
<property name="daemon">true</property>
增加monitor服务器的ip地址,我的是192.168.0.109.
好,其他不变。
3.对dbServers.xml的配置
对下面代码:
<dbServername="abstractServer" abstractive="true">
<factoryConfigclass="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<propertyname="manager">${defaultManager}</property>
<propertyname="sendBufferSize">64</property>
<propertyname="receiveBufferSize">128</property>
<!-- mysql ip-->
<propertyname="ipAddress">192.168.0.114</property>
<!-- mysql schema-->
<propertyname="schema">test</property>
<!-- mysql user-->
<propertyname="user">root</property>
<propertyname="password">scnu</property>
</factoryConfig>
这定义了虚拟的服务器属性,因为我用的服务器的ip都是一样的,只是端口不一样,和amoeba原配置文件不同,它的是端口一样儿ip地址不同,所以我按照我的需求进行配置,将共同的ip配置在这里。
增加三个server,代码如下:
<dbServername="server1" parent="abstractServer">
<factoryConfig>
<!-- mysql port-->
<propertyname="port">3307</property>
</factoryConfig>
</dbServer>
<dbServername="server2" parent="abstractServer">
<factoryConfig>
<!-- mysql port-->
<propertyname="port">3308</property>
</factoryConfig>
</dbServer>
<dbServername="server3" parent="abstractServer">
<factoryConfig>
<!-- mysql port-->
<propertyname="port">3309</property>
</factoryConfig>
</dbServer>
4对rule.xml的配置
我的配置如下:
<?xmlversion="1.0" encoding="gbk"?>
<!DOCTYPEamoeba:rule SYSTEM "rule.dtd">
<amoeba:rulexmlns:amoeba="http://amoeba.meidusa.com/">
<tableRulename="tenant" schema="test" defaultPools="server1,server2"readPools='server1,server2,server3'>
<rulename="rule1" ruleResult="POOLNAME">
<parameters>id</parameters>
<expression><![CDATA[
var division = id % 2;
case division when 0 then'server1';
when 1 then'server2';
end case;
]]></expression>
</rule>
</tableRule>
</amoeba:rule>
关键是tableRule的属性,第一段红色代码,我分割的是数据库test的表tenant,用来写的是做水平切分的是server1和server2,用来读的服务器是server1,server2和server3. 第二段红色代码是水平切分的规则,id是表tenant的属性,当id%2为0时写到server1上,相反写到server2上。
5说明:
1) 通过Amoeba进行插入的时候,插入语句要这么写:
insert tenant(id,name)values(‘1’,’a’);
即表名tenant后面要加上完整的列名,values是复数的形式;