amoeba真的是不错的稳定而灵活的数据库解决方案,阿里巴巴的技术陈思儒开始的一个开源项目,它是分布式数据库Proxy解决方案。
About Amoeba
端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请
求 多台数据库合并结果。
主要解决:
* 降低 数据切分带来的复杂多数据库结构
* 提供切分规则并降低 数据切分规则 给应用带来的影响
* 降低db 与客户端的连接数
* 读写分离
* 制定一种规则可支持DB线性扩容
目前在 amoeba 框架上面已经实现了 amoeba for mysql.
找寻到amoeba是 出于想要做读写分离,目前可以有三种解决方式:
1 程序修改mysql操作类
可以参考PHP实现的 Mysql读写分离 ,阿权开始的本项目,以php程序解决此需求。
优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均 衡,权限独立分配
缺点:自己维护更新,增减服务器在代码处理
2 amoeba
参考官网:http://amoeba.meidusa.com/
优 点:直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案
缺点:自己分配账户,和后端数据库权限管理独立,权限处理不够灵活
3 mysql-proxy
参考 mysql-proxy 。
优点:直接实现读写分离和负载均衡,不用修改代码,master和slave 用一样的帐号
缺点:字符集问题,lua语言编程,还只是alpha版本,时间消耗有点高
如果你不能安装软件来解决读写分离,那可 以尝试阿权的项目解决思路。
如果你可以安装软件,那amoeba是不错的,mysql-proxy不太建议,目前只有alpha版本,效率还不太 理想,amoeba目前在阿里巴巴是内部项目,正在生产环境使用的。
amoeba的安装使用
1 安装java环境,需要Java SE 1.5 或以上
2 配置xml文件
下载地址: http://www.sf.net/projects/amoeba
解 压就可以使用的,顺便说一下,打包的习惯似乎不是太好,最好解压后是自己的文件夹
运行很简单 bin/amoeba 即可,后台运行 bin/amoeba &
如果没有配置JAVA_HOME,则会有如下提示:
Error: JAVA_HOME environment variable is not set.
如果你是比1.5低,比如1.4的,运行会有错误提示:
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/meidusa/amoeba/mysql/server/MysqlProxyServer (Unsupported major.minor version 49.0)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
.....
安 装配置java环境对于不玩java的人不太熟悉,我也不是行家,把自己的配置过程作一下分享:
首先根据你的操作系统下载相应的文件,比 如jdk-1.5.0,文件下载地址:
http://java.sun.com/javase/downloads/index.jsp
下 载回来的是bin文件,加执行属性,然后执行后就能有一个rpm文件,然后安装即可:
Preparing... ########################################### [100%]
package jdk-1.5.0_15-fcs is already installed
配 置JAVA_HOME变量:
[root@aslibra java]# ll
total 16
drwxr-xr-x 8 root root 4096 Apr 27 17:50 j2sdk1.4.2_15
lrwxrwxrwx 1 root root 13 Apr 27 17:52 jdk -> j2sdk1.4.2_15
drwxr-xr-x 9 root root 4096 May 13 09:14 jdk1.5.0_15
[root@aslibra java]# rm jdk
rm: remove symbolic link `jdk'? y
[root@aslibra java]# ln -s jdk1.5.0_15/ jdk
[root@aslibra java]# ll
total 16
drwxr-xr-x 8 root root 4096 May 13 09:20 j2sdk1.4.2_15
lrwxrwxrwx 1 root root 12 May 13 09:21 jdk -> jdk1.5.0_15/
drwxr-xr-x 9 root root 4096 May 13 09:14 jdk1.5.0_15
可 以编辑 /etc/profile以便启动时变量生效,末尾加上
JAVA_HOME=/usr/java/jdk
PATH=$PATH:JAVA_HOME/bin
export JAVA_HOME PATH
依次运行此三句,配置好xml后,即可立刻使用amoeba:
log4j:WARN log4j config load completed from file:/Data/apps/amoeba-mysql/conf/log4j.xml
log4j:WARN ip access config load completed from file:/Data/apps/amoeba-mysql/conf/access_list.conf
2009-05-13 09:22:04,306 INFO net.ServerableConnectionManager - Server listening on /192.168.1.5:9306.
配置amoeba:
conf/amoeba.xml 配置mysql数据库,简单说明一下:
1 server节点定义amoeba为接受client访问的数据库,可以当作是mysql看待的,用户名和密码是访问时使用的,这个似乎不能定义多个用户 名密码,也就是只有一个权限控制,这个对于多应用似乎不大方便。
2 dbServerList里面可以定义很多实际的mysql数据库,增加dbServer节点即可,这里的用户名密码是作为amoeba操作数据库使用 的,要有足够权限。dbServer可以是虚拟的,比如要做负载均衡时可用定义多个数据库归属到此虚拟数据库。
3 queryRouter节点定义读写的分配情况,也就是读写该发往那个dbServer。
读写分离的配置示例片段:
<dbServer name="master">
....
</dbServer>
<dbServer name="slave1">
....
</dbServer>
<dbServer name="slave2">
....
</dbServer>
<dbServer name="slave3">
....
</dbServer>
<dbServer name="multiPool" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<property name="loadbalance">1</property>
<property name="poolNames">slave1,slave2,slave3</property>
</poolConfig>
</dbServer>
</dbServerList>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">multiPool</property>
</queryRouter>
另 外一个需要修改一下的是 conf/log4j.xml,定义日志内容:
日志是非常消耗系统性能的,在没有必要 的情况下可以不使用debug。
参考:关于 amoeba 性能测试注意的几点
不算复杂的处理就完成了amoeba的配置和使用了,更加复杂的应用请参考官网介绍资料:
amoeba 中文文档下载地址:http://amoeba.meidusa.com/amoeba.pdf
原创内容如转载请注明:来自 阿权的书房
本帖地址:http://www.aslibra.com/blog/post/amoeba_mysql_proxy_rw_split.php