使用Amoeba for mysql实现mysql读写分离(测试可行)

目录
  1. 1. mysql主从复制配置
  2. 2. java环境配置
  3. 3. Amoeba的安装
  4. 4. 配置用户环境变量
  5. 5. Amoeba for mysql配置
  6. 6. dbServers.xml文件配置
  7. 7. amoeba.xml配置
  8. 8. amoeba启动
  9. 9. FAQ

Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注于分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。 在Amoeba上面你能够完成多数据源的高可用、负载均衡、数据切片的功能。目前在很多企业的生产线上面使用。

这里使用Amoeba for mysql来实现mysql的读写分离,起到缓解主数据库服务器的压力,下面是实现这一方案的架构图:

mysql主从复制配置

因为读写分离,所以一台负责mysql的写操作,另一台负责mysql的读操作,所以我们这里使用mysql的主从复制再合适不过了。关于这一配置,请移步:http://blog.csdn.net/moqiang02/article/details/39924401

java环境配置

Amoeba框架是基于Java SE1.5开发的,建议使用Java SE 1.5版本。目前Amoeba经验证在JavaTM SE 1.5和Java SE 1.6能正常运行,(可能包括其他未经验证的版本)。
Java SE 1.6下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u32-downloads-1594644.html
我这里下载jdk-6u32-linux-i586-rpm.bin。

下载完成后执行sh jdk-6u32-linux-i586-rpm.bin开始安装,将会安装到/usr/java/jdk1.6.0_32目录。

Amoeba的安装

Amoeba下载地址:http://sourceforge.net/projects/amoeba/
下面是安装步骤:

1
2
3
4
cd /tmp
mkdir /usr/local/amoeba
wget http://softlayer.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz
tar xzf amoeba-mysql-binary-2.1.0-RC5.tar.gz -C /usr/local/amoeba

配置用户环境变量

1
2
3
4
5
6
vi ~/.bash_profile
设置为:
PATH=$PATH:$HOME/bin:/usr/local/amoeba/bin
JAVA_HOME=/usr/java/jdk1.6.0_32
export JAVA_HOME
export PATH

立即生效:
source ~/.bash_profile

Amoeba for mysql配置

配置Amoeba for mysql的读写分离主要涉及两个文件:
1、/usr/local/amoeba/conf/dbServers.xml
此文件定义由Amoeba代理的数据库如何连接,比如最基础的:主机IP、端口、Amoeba使用的用户名和密码等等。
2、/usr/local/amoeba/conf/amoeba.xml
此文件定义了Amoeba代理的相关配置。

dbServers.xml文件配置

abstractServer配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<dbServer name="abstractServer" abstractive="true">  
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property>

<!-- mysql port -->
<property name="port">3306</property>

<!-- mysql schema -->
<property name="schema">dbname</property>

<!-- mysql user -->
<property name="user">root</property>

<!-- mysql password -->
<property name="password">root</property>
</factoryConfig>

<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">500</property>
<property name="maxIdle">500</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>

此部分定义真实mysql服务器的端口,数据库名称,mysql用户及密码。
主从数据库定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<dbServer name="Master"  parent="abstractServer">  
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.0.1</property>
</factoryConfig>
</dbServer>
<dbServer name="Slave1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.0.2</property>
</factoryConfig>
</dbServer>
<dbServer name="Slave2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.0.3</property>
</factoryConfig>
</dbServer>
<dbServer name="virtualSlave" virtual="true"> #注意:name="virtualSlave"
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>

<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">Slave1,Slave2</property>
</poolConfig>
</dbServer>

此部分定义主服务器,从服务器,及从服务器连接池。这里只定义数据库地址,它们的用户及密码就是上面的abstractServer里的设置。注意用来连接真实mysql服务器的用户必须拥有远程连接权限。

测试之前先要保证amoeba-server有访问两个主从服务器test库的权限,在主从mysql上都执行:(至关重要!!)
grant all on test.* to rex@’192.168.0.%’ identified by ‘123456’;

备注:当使用ROUNDROBIN模式时,如果服务器连接池中某台服务器出现故障时,其它的服务器仍然正常工作,不会因为单台数据库的故障而造成全部瘫痪的后果。

amoeba.xml配置

amoeba连接验证配置:

1
2
3
4
5
6
7
8
9
10
11
<property name="authenticator">  
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<property name="user">root</property>
<property name="password">root</property>
<property name="filter">
<bean class="com.meidusa.amoeba.server.IPAccessController">
<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property>

这里定义连接amoeba时用来验证的用户及密码。
读写分离配置:

1
2
3
<property name="defaultPool">Master</property>  
<property name="writePool">Master</property>
<property name="readPool">virtualSlave</property>

defaultPool:配置了默认的数据库节点,一些除了SELECTUPDATEINSERTDELETE的语句都会在defaultPool执行。
writePool :配置了数据库写库,通常配为Master,如这里就配置为之前定义的Master数据库。
readPool :配置了数据库读库,通常配为Slave或者Slave组成的数据库池,如这里就配置之前的virtualSlave数据库池。

amoeba启动

启动命令:
amoeba start
此命令以前台的方式启动,会输出启动时的信息,检查没有错误信息后,中断,并后台运行:
amoeba start &

FAQ

1、无法正常连接?
首先根据执行amoeba start输出的信息排除配置文件没有问题,之后确认mysql用户是否有远程连接的权限,然后检查网站的数据库配置文件是否设置正确。
2、如何配置网站数据库连接文件?
默认的端口应该为8066,用户及密码在amoeba.xml里设置。
参考:通过Amoeba对一个数据库实例进行操作
在Master/Slave结构下的读写分离

转载请标明文章来源:https://www.centos.bz/2012/05/amoeba-for-mysql/