由于最近闲的蛋痛,而一直都使用mysql做项目,考虑到如果项目太大,并发访问量太大,数据存储太大,考虑到服务器的相应速度,以前都一直做负载均衡来解决,做什么主从,实现什么读写分离来实现。今天考虑 如果存储数据太大,就考虑到分布式存储。而mysql的分布式存储本身就自带有 mysql-proxy来实现,东问西问 ,朋友说淘宝出了一款 amoeba的套件,它可以很简单的实现 数据库的水平和锤子切分。所以就自己架设了几台机子 来做一个测试。
一、amoeba套件的安装
amoeba套件的安装很简单,不管是linux还是windows下,本测试就在window下面安装的,在官方下载包,在解压就可以了,下载地址:
http://sourceforge.net/projects/amoeba/files/
然后解压,把文件夹放到任意盘即可
二、amoeba套件的配置:
amoeba的所有配置文件都在 conf目录下面,
1、配置:
连接Amoeba程序的用户名和密码(amoeba.xml):
<property name="user">root</property>
<property name="password">chenfeng123</property>
2、配置多台分步式数据库服务器:
dbServers.xml
<dbServer name="abstractServer" abstractive="true">
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="connectionManager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property>
<!-- mysql port -->
<property name="port">3306</property>
<!-- mysql schema -->
<property name="schema">test</property>
<!-- mysql user -->
<property name="user">root</property>
<property name="password">123456</property>
</factoryConfig>
<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
<property name="maxActive">500</property>
<property name="maxIdle">500</property>
<property name="minIdle">1</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testOnReturn">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServer name="server1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.1.139</property>
</factoryConfig>
</dbServer>
<dbServer name="server2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.1.111</property>
</factoryConfig>
</dbServer>
<dbServer name="multiPool1" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">2</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">server2</property>
<property name="loadbalance">1</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">server1</property>
</poolConfig>
</dbServer>
其中 :schema是数据库,
3、配置数据库水平切分规则
1、schema指定数据库名,name指定表名,defaultPools指定关联的数据库节点(指定哪几个节点就从哪几个节点里面查数据)
2、切分规则:
1)用户ID小于100的数据存到数据库节点1
2)用户ID大于100的数据存到数据库节点2
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:rule SYSTEM "rule.dtd">
<amoeba:rule xmlns:amoeba="http://amoeba.meidusa.com/">
<tableRule name="my" schema="test" defaultPools="server1,server2">
<rule name="rule1">
<parameters>id</parameters>
<expression><![CDATA[ id <= 100]]></expression>
<defaultPools>server1</defaultPools>
<readPools>server1</readPools>
<writePools>server1</writePools>
</rule>
<rule name="rule2">
<parameters>id</parameters>
<expression><![CDATA[ id > 100 ]]></expression>
<defaultPools>server2</defaultPools>
<writePools>server2</writePools>
<readPools>server2</readPools>
</rule>
</tableRule>
</amoeba:rule>
4、启动amoeba
amoeba的启动命令在/bin目录下面
使用 amoeba start即可
5、连接amoeba
连接amoeba其实和连接mysql数据库是一样的,
mysql -P8066 -uamoeba -p123456
在这个同时,我们会在 1192.168.1.139 和192.168.1.111两台数据库上面分别建立test数据库,在库中建立my表
字段就2个: id 整形,name varchar 64
insert into test.my (id,name) values(1,'zhangshan')
insert into test.my (id,name) values(2,'wangwu')
insert into test.my (id,name) values(3,'lishi')
insert into test.my (id,name) values(1003,'zhaoliu')
insert into test.my (id,name) values(1004,'zhaoqi')
insert into test.my (id,name) values(1005,'shangsi')
执行这些语句后,就会在台数据库中有对应的消息了,
三、注意信息
由于在实验的时候出现 ,所有的插入数据都在一台服务器上,后台经过多方排查,原来是因为 在插入语句中没有加入“数据库”名字。
经过资料查询后发现:
1、不管是查询和插入,每条都必须显式地指定数据库名(test),否则只会从一个数据库节点中查询数据,或者所有数据全部会插入一个数据库节点中。
2、插入数据时,必须显式地指定列名,如“insert into test.my(id,name)”,否则切分规则不会生效,所有记录都会插入到一个数据库节点中
浙公网安备 33010602011771号