amoeba真的是不错的稳定而灵活的数据库解决方案,阿里巴巴的技术陈思儒开始的一个开源项目,它是分布式数据库Proxy解决方案。

About Amoeba
引用
Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户
端透明。具有负载均衡、高可用性、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,则会有如下提示:

[root@aslibra amoeba-mysql]# bin/amoeba
Error: JAVA_HOME environment variable is not set.


如果你是比1.5低,比如1.4的,运行会有错误提示:

[root@aslibra amoeba-mysql]# bin/amoeba
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文件,然后安装即可:

[root@aslibra amoeba-mysql]# rpm -ivh jdk-1_5_0_15-linux-i586.rpm
Preparing...                ########################################### [100%]
        package jdk-1.5.0_15-fcs is already installed


配置JAVA_HOME变量:

[root@aslibra amoeba-mysql]# cd /usr/java/
[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  ###########

JAVA_HOME=/usr/java/jdk
PATH=$PATH:JAVA_HOME/bin
export JAVA_HOME PATH


依次运行此三句,配置好xml后,即可立刻使用amoeba:

[root@aslibra amoeba-mysql]# bin/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。

读写分离的配置示例片段:

<dbServerList>
  <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,定义日志内容:

引用
在可用性测试已经完成的情况下,建议将log4j.xml 中关于日志输出level为debug的全部设置成warn或者error 级别。
日志是非常消耗系统性能的,在没有必要的情况下可以不使用debug。

参考:关于amoeba 性能测试注意的几点

不算复杂的处理就完成了amoeba的配置和使用了,更加复杂的应用请参考官网介绍资料:
amoeba 中文文档下载地址:http://amoeba.meidusa.com/amoeba.pdf



原创内容如转载请注明:来自 阿权的书房
收藏本文到网摘
Tags: ,
2010/08/15 16:32
hqlulu 回复于 2010/08/13 19:47
1 密码不对2 此用户不能在该ip登录,我觉得是这个问题

我觉得不是这个问题,在我权限表中是这样的
select user,host from user;
root | localhost

密码是1,没有错的

另外我想提点建议:能否在在评论上加个回复?
hqlulu 回复于 2010/08/16 09:36
你较劲了,密码不对是可能的,用户授权是有ip限制的,你如果不在本机开启amoeba,那你这个账号其实不能用,不妨开一个什么ip都可以访问的超级账户试试:

CREATE USER 'test'@'%' IDENTIFIED BY 'test';
GRANT ALL PRIVILEGES ON * . * TO 'test'@'%' IDENTIFIED BY 'test' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
2010/08/13 17:40
你好,我最近要试用amoeba,启动的时候报密码错误,但是我确定我的密码是对的,用户名是root用户
2010-08-13 14:49:00,774 ERROR net.MysqlServerConnection - handShake with /127.0.0.1:3306 error:Access denied for user 'root'@'localhost' (using password: NO)

能否给予提示?
hqlulu 回复于 2010/08/13 19:47
1 密码不对2 此用户不能在该ip登录,我觉得是这个问题
2009/11/14 22:51
你好,请教一个问题,我有一个应用,db_message数据库中有消息表,因为数据量大需要每天的消息数据保存一张表中,如MESSAGE_20091113、MESSAGE_20091114,rule需要怎么配置?AMOEBA是否可以做到?我的qq是33415122,邮箱33415122@qq.com,请赐教,谢谢~!
hqlulu 回复于 2009/11/15 00:01
可以做到,但没有这方面经验可以告诉你
你参考说明文档,有这方面的说明,自己可以试试,不复杂
fangwei Email
2009/08/14 14:52
请教,2个数据库都有若干相同的表,不需要通过amoeba写,查询的时候想返回2个数据库的数据,应该怎么配置呢?
hqlulu 回复于 2009/08/14 23:34
这个我没试过,但你可以尝试配置读写分离的方式
写操作你默认发到一个mysql就好,如果你不用这个写,那就可以忽略writePooll,defaultPool防止出错用的。
你单配置好readPool就好,具体的配置你还是看看amoeba的配置文档,很详细的,结合你的要求来处理就好,这方面我没有处理过,参考文末的《amoeba 中文文档》
beyond
2009/08/10 17:33
阿权:
安装好jdk后
然后 bin/amoeba

就一直抱这个错误:
2009-08-10 17:28:38,537 ERROR net.MysqlServerConnection - handShake with /127.0.0.1:3306 error:Access denied for user \'root\'@\'localhost\' (using password: NO)
2009-08-10 17:28:43,540 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:127.0.0.1:3306

版本是:amoeba-mysql-1.0.0-BETA.tar.gz
怎么解决
hqlulu 回复于 2009/08/10 21:56
这个明显是数据库连接的用户名和密码的问题
你先建立好有一定权限的用户名和密码,在amoeba里填写好
鲁江 Email
2009/06/13 15:46
您好,我测试ameoba有一段时间了,现有几个问题向您请教:amoeba运行的时候必须有 命令提示符(cmd)界面吗?有没有可以设置的地方,设置成没有界面、开机即运行的服务?另外,在命令提示行里 每隔一段时间(10分钟)就出现一些DEBUG信息(向数据库服务器发送、接收数据的信息),这些信息可不可以取消?2004-07-29 01:06:31,030 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.2.203:33062004-07-29 01:06:31,055 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.2.203:33062004-07-29 01:06:31,056 DEBUG net.MysqlServerConnection - authing packet sent to server:192.168.2.203:33062004-07-29 01:06:31,057 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.2.203:33062004-07-29 01:16:26,622 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.2.211:33062004-07-29 01:16:26,622 DEBUG net.MysqlServerConnection - authing packet sent to server:192.168.2.211:3306
hqlulu 回复于 2009/06/13 21:57
看来你使用的是windows版本。
1 cmd命令行界面也许可以通过vbscript隐藏,可以参考:
http://www.aslibra.com/blog/read.php/1177.htm
2 做成开机服务有这方面的脚本制作,可以参考类似制作:
http://www.svn8.com/SVNSY/20090423/4919.html
3 debug信息你可以看看log4j.xml的配置,也许可以设置,这个具体不太肯定。logger字段的level参数是控制错误日志的等级的,我没有用过win下的,不清楚你看到的信息是否跟这有关
分页: 1/1 第一页 1 最后页
发表评论
AD
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML 打开UBB 打开表情 隐藏
昵称   密码   游客无需密码
网址   电邮   [注册]
               

 

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐