Mysql 在线 DDL操作引起锁表问题

转至元数据结尾
转至元数据起始

在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。

Enter labels to add to this page:
Please wait 
查找标签? 在此录入。
  1. 2012-Aug-08

    匿名用户 发表:

    That's a slick answer to a challenging quesiton

    That's a slick answer to a challenging quesiton

  2. 2012-Aug-08

    匿名用户 发表:

    rTs8WU <a href="http://bebdhajvwaxo.com/">bebdhajvwaxo</a>

    rTs8WU <a href="http://bebdhajvwaxo.com/">bebdhajvwaxo</a>

  3. 2012-Aug-09

    匿名用户 发表:

    iNOlyg , [url=http://efgplajhfcra.com/]efgplajhfcra[/url], [...

    iNOlyg , [url=http://efgplajhfcra.com/]efgplajhfcra[/url], [link=http://vpmscgxtxypy.com/]vpmscgxtxypy[/link], http://stsgtgsmqwxt.com/

  4. 2012-Aug-12

    匿名用户 发表:

    jsiB8K , [url=http://epiqjrakjmgq.com/]epiqjrakjmgq[/url], [...

    jsiB8K , [url=http://epiqjrakjmgq.com/]epiqjrakjmgq[/url], [link=http://lojqxqmsnizl.com/]lojqxqmsnizl[/link], http://gyfinfhmjzqt.com/

添加评论