Amoeba for Aladdin
Aladdin项目是针对企业数据库整合而产生的另外一种数据库切分、读写分离、负载均衡的中间件产品,是amoeba的子产品。沿袭了amoeba其他产品的特性(amoeba for mysql)。
Aladdin产品简介:
与Amoeba for mysql 类似,客户端连接aladdin必须用mysql 协议,之所以用mysql协议,主要是想借助mysql使用的广泛程度以及对各种开发语言的支持,因此aladdin对客户端采取了mysql协议以方便适应广泛的使用者。aladdin后端可以同时连接各种数据库。只要这些数据库提供jdbc驱动。aladdin的出现可以解决企业在数据库整合上面提供积极的帮助。使用者不需要知道后端到底使用了什么类型的数据库、数据库的物理地址什么,这些由aladdin来分析sql语句,并且获得相应的要查询的表跟条件,然后由这些规则结合这些条件进行路由到相关的物理数据库。
各个版本得历史情况:
0.5 版本发布 –2008-11-16
1、修复sql中包含Escape关键字造成解析出错
2、相关xml dtd改动
3、规则模块进行重构
0.4 版本发布 –2008-10.29
1、该版本目前后端采用Oracle测试基本正常,主要修正BigDecimal得数据返回。
2、规则框架改动,更加具备复杂的规则计算能力
3、增加规则函数 com.meidusa.amoeba.sqljep.function.SqlQueryCommand
- 下面是函数的配置,这个函数是配置在ruleFunctionMap.xml文件中,这个函数依赖了 JdbcConnectionFactory所提供的Connection,主要用途:是通过jdbc 访问数据库。
<!–
jdbcserver’s factoryConfig class must be com.meidusa.amoeba.jdbc.JdbcConnectionFactory
–>
<function name=”getRule” class=”com.meidusa.amoeba.sqljep.function.SqlQueryCommand”>
<property name=”sql”>select * from rule where id = ?</property> <!– sql语句 –>
<property name=”poolName”>jdbcserver</property> <!– 这条sql语句是在哪个pool中执行的 –>
<property name=”threadLocalCache”>true</property> <!– 启用线程内部 cache –>
</function>
- 如何使用?下面一条规则,通过上面的函数(第一个参数必填(rule表其中一个字段))来获得rule中的member字段的值进行hash的绝对值运算再取10的模 ,如果=1则 将query语句请求到 server2上面。
<rule name=”rule2″>
<parameters>ID</parameters>
<expression><![CDATA[ abs(hash(getRule('member',ID))) mod 10 =1 ]]></expression>
<defaultPools>server2</defaultPools>
</rule>
0.3 版本发布 –2008-10-24
1、修复Database Server Oracle 9i以下版本,Oracle没有TimeStamp类型,而连接到amoeba得客户端无法得Date类型得时间单位
2、增加了driver Wrapper(由阿里巴巴架构师贺贤懋捐献了Driver Wrapper层,可以方便的解决各种数据库编码问题)
3、提供在没有mysql环境下,模拟了一些mysql内置得表比如collation (将这些都存放在table.xml),以应付mysql client端为了初始化一些环境变量。
4、目前preparedstatement 由amoeba返回数据包,这个数据包是一个只包含一列,是一个伪造的数据包。这种情况下在使用 jdbc api 不允许调用PreparedStatement.getMetaData()
0.1 版本发布 –2008-10-14

我想请问一下aladdin跟cjdbc有什么区别
看了文档,有一点还不是很明白,当Amoeba后端有多个数据库,insert/update/delete等更新操作时,Amoeba会把这些操作同时发送到所有的后端数据库吗?
如果只更新到一台后端数据库,多个数据库之间是否有专门用于同步的进程?
谢谢。
目前amoeba不会涉及到数据库同步的职责,这个职责是由数据库之间完成的。
我在公司用Oracle,在家用mysql,博主啊,你真好,感觉是专门为我设计的啊
这个地方的意思没有明白?
如果不启用数据切分,那么只需要配置QueryRouter属性
wirtePool=server1
readPool=virtualSlave
请问,那么需要启用数据切分怎么配置呢?好像在你的文档中写的不是明白。
—————————以下是回复内容———————————————-
需要启用数据切分得话,一个是需要配置rule.xml文件。 每个TableRule都是表示一张表得数据切分方式
Amoeba for Aladdin 是不是同样不支持多个数据库数据的合并,以及排序呢?
如果都是不支持,那我是不是只能分别取出记录,然后在list中进行合并排序呢(用的是hibernate框架),如果是这样的话我真的很担心效率问题呀,请给点好的建议来解决这个效率问题好么?
—————————-以下是回复内容—————————————-
目前amoeba对于聚合函数无法做到多个数据源过来的数据进行数据上面的合并,只能是记录上面的合并,也无法做到多个数据源过来的数据进行再次排序
在有排序分页的情况下比较难以实现的(数据经过水平切分)!
目前我也没有找到比较合适的解决方案!!
关注amoeba很久了,发现它确实是个好东西。
现在有个问题:我后端挂载的是oracle,而前端采用hibernate(hibernate肯定是要使用mysql的驱动了)。可是,对于hibernate这样的orm框架而言,在某些情况下(如分页),他会自动生成一些mysql的方言(如limit)去执行。此时,Aladdin可以正确的代理过去吗?
---------------------以下是回复内容----------------------------
amoeba 是解析sql语句的,对limit等sql也会支持的,如果有不支持的sql请email给我~ 谢谢!
大概看看了这个项目,很佩服作者这份辛勤的努力。有两个问题问下,1.这项目的目的就是实现表的横切,把横切这部分逻辑脱离应用。不过这种情况都应用于海量数据的情况,这种情况很多情况会数据库并发很高,所以才作的分割,你这种数据库代理的方式会不会承受不了大并发。2.用mysql作sql的解析根据规则实现路由,然后再作更类数据库的sql与mysql数据库的映射,进行sql转化,这样理解对不对。
-------------以下是回复内容----------------
1、amoeba高并发能力问题,我希望每个人在使用开源产品的时候需要了解的一个产品的特性,做风险评估。看具体的产品是否能够满足功能与非功能上的需求。
2、amoeba的sql路由是解析客户端提交过来的sql,将sql中的条件以key/value的形式抽取出来,然后做为参数与相关的规则进行再次计算,得出每个规则的最终结果。
我总是无法使用amoeba for Aladdin 进行水平分割,amoeba每次都使用queryRouter / defaultPool 中设置的数据库,而rule中配置的规则却没有生效。我使用相同的配置方法在amoeba for mysql 中成功实现了水平分割,不知道是不是这两个版本对配置的要求不同?
我使用的amoeba.xml配置文件中,除queryRouter外与缺省的基本一样。在dbServerList中定义了server1 和 server2 两个mysql数据库(使用oracle数据库也是同样问题);queryRouter的配置如下:
${amoeba.home}/conf/rule.xml
${amoeba.home}/conf/functionMap.xml
${amoeba.home}/conf/ruleFunctionMap.xml
1500
server1
true
配置文件 rule.xml 如下定义,想根据表tabel1中的字段ID分割
ID
server1
ID
10 ]]>
server2
———以下是回复内容—————-
很抱歉amoeba for aladdin目前更新的频率比较少,如果后端是mysql,尽量使用amoeba for mysql.
amoeba for mysql目前也逐步趋向稳定了,多谢支持