Amoeba 日志

Amoeba for MySQL 2.2.0 发布

Amoeba  for MySQL 2.2.0 发布:

主要解决内存问题,将amoeba的connection中的buffer设置成动态收缩,避免由于在访问大数据包造成buffer开启过大而导致最终内存问题。

在MySQL 中在线对表对象做 DDL 操作是要锁表的,对可用性要求比较高而且应用变化又比较频繁的环境,这是个非常很糟糕的。

有同事在讨论Amoeba的时候提起了这个事情,并且给了一个很好的建议。

客户端与Amoeba的Connection (这儿称为ClientConnection) 跟Amoeba与mysql的Connection (这儿称为ServerConnection)是完全不同的Connection,他们之间并没有存在关系,只有在确定一条sql 路由到具体的mysql Server的时候。那么ClientConnection 才与ServerConnection建立一种Session。他们所有数据交互都通过这个Session进行数据包转发,这种query语句结束以后,他们之间的关系也将断开,ServerConnection也就回到了ConnectionPool等待下一次任务。

在Amoeba内部有一个虚拟的ConnectionPool,这个虚拟Pool负责多个ConnectionPool的负载均衡、failOver。 

 那么利用这个优点,Amoeba 虚拟Pool可以将即将做DDL 操作的 mysql从这个虚拟Pool中disable掉。所有的query将转发至虚拟Pool中的其他Pool。DDL完毕以后,将其Enable回来。

传统的F5设备为什么无法做到这种方式呢?

对于客户端采用连接池直接连接mysqlServer的客户端来说,即使F5 Disable即将Online DDL操作的mysqlServer。也无法将存在的连接断开。除非强制性断开或者等待Pool的收缩(时间可能会相当长,时间不可控制)

对非采用保持连接的方式倒是可以采用F5设备来控制,当不采用保持连接在应用性能上面将非常低下。创建连接的时间往往比一次普通的query时间要多上好几倍甚至10多倍。

 Amoeba 要如何解决这个问题?

目前有一个想法,由Amoeba Manager来统一管理一组配置相同的Amoeba。

Amoeba 启动的时候将从Amoeba Manager读取配置。并且能够在Amoeba Manager上面进行实时对多台Amoeba进行管理(动态添加dbServer、disable/enable 虚拟Pool中的DBPool,动态修改QeuryRouter规则)。

那么在Online DDL的时候首先将其从虚拟Pool中disable掉,DDL操作完毕以后将其Enable。

前一段时间由于sourceforge 访问很慢,我在开发amoeba的时候经常需要切换svn分支,由于网络影响切换分支的时候导致只切换了一半就失败了,这样就造成我的代码的更新是在2个分支下面。当时没注意到后来一直在这种情形下面开发了将近2个星期。后来发布的时候有用户告诉我,你以前修正过的bug现在在新版本上面又出现了…

现在都有点不敢用sourceforge 的svn来管理源代码了。

0.25版本主要是在重构amoeba代码以更好的支持后面的一个项目:Amoeba for Oracle

目前0.25以及后期版本将都会包含源代码。抱歉前段时间没有附带源代码给研究amoeba的开发者带来不便。

0.25下载: http://www.sourceforge.net/projects/amoeba