一、Amoeba介绍

Amoeba:基于Java研发,配置文件xml文档。对事务支持功能很差,不支持分布式读,尤其不支持分布式事务。默认监听在8066端口上。2.2.x开始支持单库事务,没有缓存功能,所有请求直接向后转发。对内存占用少,而对CPU占用大。

二、架构简介

Amoeba服:192.168.1.253 监听端口80663306,作为后端mysql服务器代理,监控后端mysql服务器健康的端口9066

主服:station20:192.168.1.20,前端代理往主服写操作会自动复制到从服。

从服:station21:192.168.1.21

如果是多从,在前端代理里设置一个负载均衡从服组(虚拟服务器),组内按调度算法调度,三种算法:轮询rr,加权轮询wrr,高可用ha.

地址:http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/

基于Ameoba实现mysql读写分离_第1张图片

三、操作步骤

主服新建远程用户,从服自动复制次条目
mysql>grant all on *.* to 'root'@'%' identified by 'amoebapass';
mysql>flush privileges;
------------------------------------------------------------------
从服
mysql>show grants for root@'%';
| Grantsfor root@%                                                                                           
| GRANTALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD'*84BB5DF4823DA319BBF86C99624479A198E6EEE9' |

 

Amoba

1.安装Amoeba
[root@station253~]# cp /mnt/hgfs/Share64/jdk/jdk-6u31-linux-x64-rpm.bin /tmp
[root@station253tmp]# chmod +x jdk-6u31-linux-x64-rpm.bin
[root@station253tmp]# ./jdk-6u31-linux-x64-rpm.bin
[root@station253tmp]# vim /etc/profile.d/java.sh
exportJAVA_HOME=/usr/java/latest
exportPATH=$JAVA_HOME/bin:$PATH
[root@station253tmp]# . /etc/profile.d/java.sh
[root@station253tmp]# java -version
javaversion "1.6.0_31"
Java(TM)SE Runtime Environment (build 1.6.0_31-b04)
JavaHotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)  混合模式,支持编译
 
[root@station253tmp]# cp /mnt/hgfs/Share64/amoeba/amoeba-mysql-binary-2.2.0.tar.gz .
ameoba不会自行创建目录,手工创建
[root@station253tmp]# mkdir -pv /usr/local/amoeba-2.2.0  #保留版本信息便于后期识别
[root@station253tmp]# tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba-2.2.0
[root@station253tmp]# cd /usr/local/
[root@station253local]#  ln -sv amoeba-2.2.0/ amoeba
"amoeba"-> "amoeba-2.2.0/"
2.添加环境变量
[root@station253local]# vim /etc/profile.d/amoeba.sh
exportAMOEBA_HOME=/usr/local/amoeba
exportPATH=$AMOEBA_HOME/bin:$PATH
[root@station253local]# . /etc/profile.d/amoeba.sh
[root@station253conf]# amoeba
amoeba start|stop
3.配置amoeba服务
[root@station253local]# cd amoeba
[root@station253amoeba]# cp -r conf/ backup
[root@station253amoeba]# ls
backup  benchmark bin  changelogs.txt  conf lib  LICENSE.txt  README.html
[root@station253amoeba]# cd conf
定义数据库读写分离及节点管理信息
[root@station253conf]# vim amoeba.xml



             #定义代理

       #定义服务,由类实现
     #定义连接池
  加外括号注释
3306      #定义监听端口,将默认改动为3306
     #定义代理服务器对外连接的监听IP
 
 0.0.0.0  #定义监听IP地址,这里定义为监听所有IP
${clientConnectioneManager}
   #连接池

128          #定义发送缓冲大小(可根据主机内存可调整)
 64        #定义接受缓冲的大小(可根据主机内存可调整)
 
 
            #认证器
  
 root      #客户端连接后端时的用户名
amoebapass      #客户端连接后端时的密码
 

${amoeba.home}/conf/access_list.conf     #只允许哪些客户端访问,基于文件实现访问控制


 
 
 

   #amoeba的监控服务器,监测每一个后端的工作状态

3306   #监控服务器监听的端口,默认注释表示使用随机端口

127.0.0.1  #定义监控服务器监听的地址
true
${clientConnectioneManager}
 


 


 20
 
30
 
30
 
500
 
60
 


   #定义连接池的列表

com.meidusa.amoeba.net.ConnectionManager

 

 com.meidusa.amoeba.net.AuthingableConnectionManager
 
 
      #连接池的列表
  

 ${amoeba.home}/conf/dbServers.xml
 
     #定义查询路由

 
 ${amoeba.home}/conf/rule.xml
 ${amoeba.home}/conf/ruleFunctionMap.xml


${amoeba.home}/conf/functionMap.xml
1500                            
 station20                   #定义读写服务器,这里默认定义到主服务器上
station20                     #定义写服务器,若有多个用逗号隔开,这些服务器名来自于dbservers.xml
station21                      #定义读服务器
 true


###############定义连接后端Mysql服务器信息############
[root@node conf]# vim dbServers.xml



  
                  #定义服务器,名字叫抽象服务器,支持抽象功能:公共属性的定义

${defaultManager}
 64                 #定义发送缓冲大小
128             #接受缓冲的大小

 3306                         #监听的端口
 
test                       #默认连接的数据库服务器

root                         #用户名
                                    -->上移与amoebapass                 #后端服务器的密码,授权用户密码
 

 500                      #定义最大活动连接数
 500                        #空闲连接数
 10                         #最少空闲连接数
 600000
 600000
   true
  true
true
 

            #定义服务器,其父服务器就是上面的"abstractServer"继承其属性,若不想请添加属性实现定义
 
 
  192.168.1.20           #server1的IP地址

 
          #server1的IP地址

  
 192.168.18.21
 

                          #定义虚拟服务器组

       #算法:1表示轮询,2:基于权重做轮询,3:高可用效果
 1          #还可以实现负载均衡,算法为1
 
 station20,station21             #此处一定是定义的dbname
 
       
4.启动Amoeba
[root@station253conf]# amoeba start
log4j:WARNlog4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2014-05-2505:05:40,143 INFO context.MysqlRuntimeContext - Amoeba for Mysql currentversoin=5.1.45-mysql-amoeba-proxy-2.2.0  #检测后端mysql服务器兼容版本
log4j:WARNip access config load completed fromfile:/usr/local/amoeba/conf/access_list.conf
2014-05-2505:05:40,415 INFO  net.ServerableConnectionManager- Amoeba for Mysql listening on /0.0.0.0:3306. #监听地址及端口
2014-05-2505:05:40,427 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on/127.0.0.1:23679.  #管理地址及端口(随机)
##########停止amoeba###########
Ctrl+C
#########使用后端启动##########
[root@station253conf]# amoeba start &
#########后端启动服务时停止####
[root@station253conf]# amoeba stop
amoebaserver shutting down with port=11422
###########查看监听端口########
[root@station253conf]# ss -natlp | grep 3306
LISTEN     0     128      :::3306         :::*     users:(("java",2467,50))

5.测试连接

[root@station253conf]# mysql -uroot -pamoebapass -h192.168.1.253
YourMySQL connection id is 432598870  前端连接的是代理服务器amoeba
Serverversion: 5.1.45-mysql-amoeba-proxy-2.2.0 MySQLCommunity Server (GPL)
mysql>select version();  显示后端数据库版本
+------------+
|version()  |
+------------+
|5.6.13-log |
+------------+
测试读写分离是否到各自服务器
前端 读库
mysql>select user,host from mysql.user;   在读写分离后,select必须用库名+表名,因为默认路由是到test库
+------+-----------------------+
| user |host                  |
+------+-----------------------+
| root |%                     |
| root |127.0.0.1             |
| root |::1                   |
|      | localhost             |
| root |localhost             |
|      | station21.example.com |
| root |station21.example.com |
+------+-----------------------+
后端2服务器提前启用tcpdump抓包
[root@station21~]# tcpdump -i eth0 -A -nn -s0 tcp dst port 3306 and ip dst host 192.168.1.21
tcpdump:verbose output suppressed, use -v or -vv for full protocol decode
listeningon eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
07:20:03.771162IP 192.168.1.253.39815 > 192.168.1.21.3306: Flags [P.], select user,host from mysql.user
前端 写库
mysql>create database school;  
[root@station20~]# tcpdump -i eth0 -A -nn -s0 tcp dst port 3306 and ip dst host 192.168.1.20
tcpdump:verbose output suppressed, use -v or -vv for full protocol decode
listeningon eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
07:21:30.426165IP 192.168.1.253.33837 > 192.168.1.20.3306: Flags [P.], create database school
mysql>drop database school;  drop会先drop写库后select读库确认删除
07:33:40.080159IP 192.168.1.253.33849 > 192.168.1.20.3306: Flags [P.], drop database school
07:33:40.410321IP 192.168.1.253.39825 > 192.168.1.21.3306: Flags [P.], SELECT DATABASE()