本文收集整理自:
一、Amoeba 是什么
Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。
主要解决:
• 降低 数据切分带来的复杂多数据库结构
• 提供切分规则并降低 数据切分规则 给应用带来的影响
• 降低db 与客户端的连接数
• 读写分离
目前可以有三种解决方式实现mysql读写分离
1 程序修改mysql操作类
优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配
缺点:自己维护更新,增减服务器在代码处理
2 amoeba
参考官网:http://amoeba.meidusa.com/
优点:直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案
缺点:自己分配账户,和后端数据库权限管理独立,权限处理不够灵活
3 mysql-proxy
参考 mysql-proxy。
优点:直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号
缺点:字符集问题,lua语言编程,还只是alpha版本,时间消耗有点高
如果你不能安装软件来解决读写分离,那可以尝试阿权的项目解决思路。
如果你可以安装软件,那amoeba是不错的,mysql-proxy不太建议,目前只有alpha版本,效率还不太理想,amoeba目前在阿里巴巴是内部项目,正在生产环境使用的。
三、快速架设amoeba,实现mysql主从读写分离
假设amoeba的前提条件:
n Java SE 1.5 或以上 Amoeba 框架是基于JDK1.5开发的,采用了JDK1.5的特性。
n 支持Mysql 协议版本10(mysql 4.1以后的版本)。
n 您的网络环境至少运行有一个mysql 4.1以上的服务
1.首先配置主从库:这里不做介绍,《Amoeba搞定mysql主从读写分离》有介绍。
2.amoeba安装:
rpm -ivh jdk-8-linux-x64.rpm 默认安装到了/usr/java下
查看是否安装成功:java -version 会看到版本信息
配置环境变量:vi /etc/profile
在文件中追加:
JAVA_HOME=/usr/java/jdk1.7.0
JRE_HOME=/usr/java/jdk1.7.0/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
使修改生效:source /etc/profile
查看系统环境状态:
[root@admin ~]# echo $PATH
/usr/local/cmake/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.7.0/bin:/usr/java/jdk1.7.0/jre/bin:/root/bin
接下来就是安装amoeba-mysql
这里用 《Amoeba搞定mysql主从读写分离》给的链接下载下来的conf文件好像有修改,可以直接从Amoeba在SourceForge的主页下载Amoeba,http://sourceforge.net/projects/amoeba/files/。
我第一下下载了3.X版本,总是报错。后来下载了2.x.tar.gz的版本,直接解压就OK!
tar -zxpf amoeba-mysql-binary-2.1.0-RC5.tar.gz -C /usr/local/amoeba-mysql
运行很简单 bin/amoeba 即可,后台运行 bin/amoeba &
如果没有配置JAVA_HOME,则会有如下提示:
[root@aslibra amoeba-mysql]# bin/amoeba
Error: JAVA_HOME environment variable is not set.
如果你是比1.5低,比如1.4的,运行会有错误提示,下载jdk1.5以上的版本,压缩版解压后设置好环境变量即可。
我的启动时报错:
The stack size specified is too small, Specify at least 160k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
解决:
打开bin/amoeba
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
改成
DEFAULT_OPTS="-server -Xms2048m -Xmx2048m -Xmn1000m -Xss2048k"
配置文件位于conf目录下,执行文件位于bin目录下,解压后发现bin目录下的启动文件没有可执行权限,请执行:chmod -R +x /usr/local/amoeba/bin/
Amoeba For MySQL 的使用非常简单,所有的配置文件都是标准的XML 文件,总共有四个配置文件。分别为:
◆ amoeba.xml:主配置文件,配置所有数据源以及Amoeba 自身的参数设置;实现主从的话配置这个文件就可以了;
◆ rule.xml:配置所有Query 路由规则的信息;
◆ functionMap.xml:配置用于解析Query 中的函数所对应的Java 实现类;
◆ rullFunctionMap.xml:配置路由规则中需要使用到的特定函数的实现类;
conf/amoeba.xml 配置mysql数据库,简单说明一下:(以下的配置来自《Amoeba非常好用的mysql集群软件》,完全按照这个配置就OK!)
Amoeba配置文件修改
1 server节点定义amoeba为接受client访问的数据库,可以当作是mysql看待的,用户名和密码是访问时使用的,这个似乎不能定义多个用户名密码,也就是只有一个权限控制,这个对于多应用似乎不大方便。
2 dbServerList里面可以定义很多实际的mysql数据库,增加dbServer节点即可,这里的用户名密码是作为amoeba操作数据库使用 的,要有足够权限。dbServer可以是虚拟的,比如要做负载均衡时可用定义多个数据库归属到此虚拟数据库。2.1RC版的dbServer已移到 dbServers.xml文件中配置。
3 queryRouter节点定义读写的分配情况,也就是读写该发往那个dbServer。
vi amoeba.xml 修改主配置文件
4.1)把默认端口8066改成3306
3066
4.2)把默认连接用户名和密码改成自己的
sky
123456
4.3)把默认的客户端线程数,请求数及服务端回应数改成200,300,300
200
300
300
4.4)把默认注释掉的读写分离选项,把注释去掉并readpool修改成server2
server1
server2
提示:readPool或writePool可以是dbServers中的multiPool名称,用multiPool来设置负载均衡。
***************************************
***************************************
此处如果有两个以上的从库做负载均衡的话,可指定:
server1 //写池不变
multiPool //server2 =》multiPool
在修改dbServers.xml 时增加
192.168.2.13
有几个从server增加几个,然后在 中添加从的server名server2,server3,server4,server5
配置方式在dbServers.xml注释中有提到:
*******************************************
**********************************************
5.vi dbServers.xml 增加SEVER2模块,里面的连接用户名密码及地址都表示两台MYSQL的物理机器,192.168.1.11和192.168.1.13 另SERVER1是写,SERVER是读
${defaultManager}
64
128
3306
test
root
123456
500
500
10
600000
600000
true
true
192.168.2.11
192.168.2.13
1
server1
6:修改log4j.xml 取消日志文件生成,如做pdf时(太大了,磁盘很容易满)
改成
注意:我在2.1-rc5版本下第6条的设置JAVA运行时报警,无法通过。
这个确实不能通过!
7:性能优化,打开bin/amoeba
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
改成
DEFAULT_OPTS="-server -Xms2048m -Xmx2048m -Xmn1000m -Xss2048k"
8:启动amoeba
nohup /usr/local/amoeba/bin/amoeba start 2>&1 >/dev/null &