MySQL+amoeba,轻量级的分布式数据库实现

2009-03-17

最近因为一个大作业,我需要建立一个分布式数据库系统。Oracle和DB2固然强大,但巨大的资源占用以及软件授权的限制让我放弃选择它们。我的目标是寻找轻量级的、免费(最好是开源)的解决方案,最终目标锁定在国产的amoeba上。

amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。有关amoeba的更多信息可以参考其文档作者blog。google出来的相关信息并不多,不过作者的这个帖子(含回复)倒是值得一看。

下面说说我的理解:

1、amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的Replication等机制来实现副本同步等功能。amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来替代作者的实现。这个程序总体上比较符合KISS的思想。

2、由上一条,建议使用MySQL的Replication机制建立Master-Slave来做副本。我一开始理解有误,使用了amoeba的virtual DB(负载均衡pool)做writePool,结果使得本应插入同一个表中的数据被拆分地写入了不同的物理数据库中。这样自然与副本的语义不符了。

3、amoeba已经实现了数据的垂直切分与水平切分。水平切分方面,粒度是行。使用SQLJEP语句可以设计出复杂的切分规则,个人认为是比较强大的。垂直切分的粒度是表,可以把针对不同表的请求发送到不同的节点上执行,但不能以列作为分片粒度。从作者的说法看,amoeba不做SQL解析和重写。在目前的机制下似乎是难以实现同一个表不同的列在不同节点上的分布。不过对开发人员来说,设计良好的表结构应该可以实现简单的基于关系属性的负载均衡的。

要说这个项目最大的不足,我想可能是文档方面的:

1、软件的文档(0.31版)主要在讲解配置文件怎么修改,却没有说怎么运行amoeba。我以前没有MySQL Proxy以及Java工程方面的经验,下载解压amoeba之后,第一感觉这是一个数据库中间件,要通过Java API编程使用,所以我还纳闷文档中为什么没有API的说明。仔细一看才发现bin目录下有启动脚本。回到文档,发现只在最后的“amoeba性能调优”一节才提到了“amoeba启动脚本”。希望作者改进下一版的文档,让新手不要再疑惑。

2、文档的“amoeba for aladdin”一节说“(amoeba for aladdin)其性能比MySQL Proxy也好,但比amoeba for mysql微微差了点”,看起来性能优劣是“amoeba for mysql>amoeba for aladdin>MySQL Proxy”;但在这个帖子的回复中,作者又说“(amoeba for mysql)比官方的MySQL Proxy性能大致低10%~20%左右”,两处似乎有矛盾。继续翻这个帖子,才发现原来在0.27版本以后,amoeba的性能逐渐超过了MySQL Proxy。所以,希望作者可以完善一下文档,并在官方网站或blog的显著位置说明最新版本的特性,以免引起误会。

3、amoeba是一项优秀的工作,有必要提供完整的英文文档,以便国际推广。