mysql读写分离Amoeba3.x的实现

安装amoeba

下载amoeba(1.2.0-GA)后解压到本地(/usr/local/amoeba),即完成安装

配置amoeba

1
2
3
ls

access_list.conf amoeba.xml dbServers.xml functionMap.xml log4j.xml ruleFunctionMap.xml amoeba.dtd dbserver.dtd function.dtd log4j.dtd rule.dtd rule.xml

在这里我主要介绍配置 amoeba.xml、dbServers.xml、log4j.xml 三个主要的配置文件,其它文件没有特殊需要默认就可以了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vi access_list.conf #修改允许访问列表

192.168.152.*:yes
vi amoeba.xml #修改主配置文件
#把默认端口8066改成3306;前提是你的数据库与amoeba安装的机器不在同一个机器上
3066
#把默认连接用户名和密码改成自己的
root
123456
#把默认的代理服务器客户端进程线程大小数改成300

300
#把默认注释掉的读写分离选项,把注释去掉并readpool修改成server2
server1
server2

增加SEVER2模块,里面的连接用户名密码及地址都表示两台MYSQL的物理机器,192.168.1.11和192.168.1.13 另SERVER1是写,SERVER是读. 需要手动增加SERVER2代码,最终改变成如下:

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
30
vi dbServers.xml

${defaultManager}
64
128

3306

test

root

123456

500
500
10
600000
600000
true
true

192.168.2.11

192.168.2.13

1

server1

修改log4j.xml 取消日志文件生成(太大了,磁盘很容易满;) 暂时还不清楚如何进行修改.

性能优化

打开bin/amoeba(window下可用)

1
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"

改成

1
DEFAULT_OPTS="-server -Xms512m -Xmx512m -Xmn100m -Xss1204k"

设置压力比

大家可能会想到,我们加入只有两台数据库服务器,一台主,一台从,按照上面的配置只能是主和从的读取比率是1:1,而写又全部在主上进行,这样主的压力就很大了,所以如果能让主和从的读设置权重,比如设置成1:3,这样就可以很好的解决主从不压力均衡的问题!通过研究确实可以! 配置就是将上面的读的池的配置更改一下:

1
server1,server2

更改成

1
server1,server2,server2,server2

启动amoeba

1
2
3
4
5
#(1.2的`nohup /usr/local/amoeba/bin/amoeba start 2>&1 >/dev/null`)
/usr/local/amoeba/bin/launcher
log4j:WARN log4j config load completed from file:D:openSourceamoeba-mysql-1.2.0-GAconflog4j.xml
log4j:WARN ip access config load completed from file:D:openSourceamoeba-mysql-1.2.0-GA/conf/access_list.conf
2010-07-03 09:55:33,821 INFO net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.

设置mysql主从服务器的允许访问的用户和地址

client端调用与测试

1)在装有mysql客户端的机器上使用:

1
mysql -uroot -p123456 -P3306 -h192.168.152.146

参数分别是amoeba的用户名、密码、端口号和所做主机的地址.

2)调用与测试

首先插入一条数据:

1
insert into zone_by_id(id,name) values(20003,'name_20003')

通过查看master机上的日志 /var/lib/mysql/mysql_log.log:

1
2
3
4
5
6
7
8
9
10
11
12
100703 11:58:42 1 Query set names latin1
1 Query SET NAMES latin1
1 Query SET character_set_results = NULL
1 Query SHOW VARIABLES
1 Query SHOW COLLATION
1 Query SET autocommit=1
1 Query SET sql_mode='STRICT_TRANS_TABLES'
1 Query SHOW VARIABLES LIKE 'tx_isolation'
1 Query SHOW FULL TABLES FROM `amoeba_study` LIKE 'PROBABLYNOT'
1 Prepare [1] insert into zone_by_id(id,name) values( , )
1 Prepare [2] insert into zone_by_id(id,name) values( , )
1 Execute [2] insert into zone_by_id(id,name) values(20003,'name_20003')

得知写操作发生在master机上 通过查看slave机上的日志 /var/lib/mysql/mysql_log.log:

1
100703 11:58:42 2 Query insert into zone_by_id(id,name) values(20003,'name_20003')

得知slave同步执行了这条语句. 然后查一条数据:

1
select t.name from zone_by_id t where t.id = 20003

通过查看slave机上的日志 /var/lib/mysql/mysql_log.log:

1
2
3
4
100703 12:02:00 33 Query set names latin1
33 Prepare [1] select t.name from zone_by_id t where t.id =
33 Prepare [2] select t.name from zone_by_id t where t.id =
33 Execute [2] select t.name from zone_by_id t where t.id = 20003

得知读操作发生在slave机上. 并且通过查看slave机上的日志 /var/lib/mysql/mysql_log.log发现这条语句没在master上执行 通过以上验证得知简单的master-slave搭建和实战得以生效.

注意事项:

1
2
3
4
5
6
7
Amoeba不支持事务
Amoeba不支持跨库join和排序
Insert语句必须指定表的列名
Amoeba不支持分库分表.
Amoeba不支持分库分表,只能分MySQL实例.
Amoeba不支持大数据量的查询.
Amoeba需要更严格的SQL语句规范