Amoeba源码分析之:核心类说明

前记: Amoeba是个分布式数据库代理的综合解决方案,特别适合在巨型数据的分布式切片处理(基于水平切片分割),因此在实际的使用当中非常适合于进行数据库的负载均衡,将巨型数据I/O转化为分布式数据库I/O问题来化解。


Amoeba(变形虫)项目是分布式数据库 proxy 开发框架。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。
主要解决:
* 降低 数据切分带来的复杂多数据库结构
* 提供切分规则并降低 数据切分规则 给应用带来的影响
* 降低db 与客户端的连接数
* 读写分离


项目的使用介绍性材料请参见: http://docs.hexnova.com/amoeba/

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Amoeba目前一共有三个项目产品,分别是:

 

Amoeba for MySQL

为MySQL提供了一种数据库代理的解决方案,可以实现多台MySQL之间的读写分离,具有负载均衡、高可用性、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。 在Amoeba上面你能够完成多数据源的高可用、负载均衡、数据切片的功能。

 

Amoeba for Aladdin

类似“Amoeba for MySQL”,不同的是“Amoeba for MySQL”只支持MySQL数据库,“Amoeba for Aladdin”支持多种数据库,同时还可以在后台使用多种混合数据库。

 

Amoeba for MongoDB

实现对NoSQL数据库MongoDB的代理功能,具备心跳检测、负载均衡、故障转移、查询聚合等功能。

 

从目前Amoeba的系列产品来看,都是针对数据库存储应用在分布式群集负载场景下的解决方案,覆盖了常用的数据库种类。

 

本系列源码分析都是真对Amoeba for MySQL的,其它两个项目其实都是基于Amoeba for MySQL之后,改变而来的,所以,读懂了Amoeba for MySQL,也就读懂了其他两个项目。


核心架构设计思路:



如何获得源码:

Amoeba的源码目前放在Google上,可以使用SVN拉下来,地址为:http://amoeba.googlecode.com/svn/trunk


首先看一下源码的项目列表:

注意:自己建立Maven项目,然后把项目代码用Maven关联起来,上图是我自己加好之后的,如果需要,我可以将我加好的Maven项目提供下载,你只要导入就可以了。

 

主要的几个类:

 

包名:com.meidusa.amoeba.server

类名:AmoebaProxyServer

职责:Amoeba启动主入口,注意,为了很好的扩展性,这个类在Amoeba核心项目中,而不是在amoeba-mysql项目中(不管是Amoeba for MySQL还是Amoeba for Aladdin,主入口都是这个类)

  

包名:com.meidusa.amoeba.mysql.handler

类名:QueryCommandMessageHandler (继承 com.meidusa.amoeba.mysql.handler.CommandMessageHandler)

职责:SQL的查询命令处理者,对于分库分表查询结果的合并逻辑,在其父类 CommandMessageHandler.mergeMessages 方法中

 

包名:com.meidusa.amoeba.mysql.parser

类名:MysqlQueryRouter

职责:MySQL的路由解析器,根据SQL语句来获得符合路由规则中的线程池对象

 

包名:com.meidusa.amoeba.mysql.handler

类名:MySqlCommandDispatcher (实现接口 com.meidusa.amoeba.net.MessageHandler)

职责:SQL命令分发者,将客户端请求的SQL指令根据Amoeba路由配置规则分发到对应的连接池中

 

包名:com.meidusa.amoeba.mysql.handler

类名:CommandQueue

职责:SQL命令执行队列,客户端向Amoeba发送的语句全部先进入该队列

  

包名:com.meidusa.amoeba.mysql.context

类名:MysqlRuntimeContext

职责:Amoeba运行时上下文信息,包括Amoeba版本号、SQL缓存大小、缓存过期时间等

 

包名:com.meidusa.amoeba.mysql.net

类名:MysqlClientConnection

职责:封装客户端连接到Amoeba的连接对象

 

 

包名:com.meidusa.amoeba.mysql.net

类名:MysqlServerConnection

职责:封装Amoeba连接到物理MySQL数据库的连接对象

 

 

包名:com.meidusa.amoeba.net.poolable

类名:MultipleLoadBalanceObjectPool

职责:实现了一个可以负载均衡的对象池,用到了Apache下面的一个开源项目commons-pool,在Amoeba中,该对象池用来存放Amoeba配置中的 Server Pool 对象

 

包名:com.meidusa.amoeba.route

类名:AbstractQueryRouter

职责:实现读写分离的逻辑就在该抽象类中

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

后记:此项目的借鉴参考对象为Mysql Proxy, MySQL Proxy的想法做的非常棒,它能够根据自己的想法去构造目标的MySQL Proxy应用,比如监控SQL执行、数据流量、读写分离等。但由于有时我们使用MySQL Proxy并不能非常轻易地解决一些问题(如读写分离、数据切分、水平切分、负载均衡等),而是需要写大量的Lua脚本,这些Lua并不是现成的,而是需要自己去写。这个工作对于并不熟悉MySQL Proxy内置变量和MySQL Protocol的人来说是非常困难的。


补充代码下载之处:

http://sourceforge.net/projects/amoeba/


Taocode(淘宝开源代码下载):

http://code.taobao.org/hot/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值