基于MySQL的数据库集群系统的实现 |
<nobr><table cellspacing="0" cellpadding="0"><tbody><tr valign="top"> <td align="right"></td> <td width="46"><form action="https://www-130.ibm.com/developerworks/secure/email-it.jsp"></form></td> </tr></tbody></table></nobr> | ||
<name></name>徐超
您的WebApp系统是否正在使用一个MySQL的数据库系统?您的客户是不是总是抱怨页面结果反馈的非常慢?您的MySQL系统的负载是不是总是维持在一个非常高的状态下?本文将为您提供一个分担MySQL系统的负载的方法,以及由此派生出来的一个MySQL-HA-Proxy的开发项目。使用本文提供的方法,您将以最小的源代码改动,获得MySQL系统的高效运转。
第一节 数据库集群技术的现状
最新的数据库集群系统的理论基础是分布式计算,将数据分布到每个节点,所有的计算节点并行处理数据,将结果汇总。这样的方式无疑是最完美的。但是目前仍然不能实现全部的功能。 对于Shared-storage以及Shared-nothing的技术请参考Oracle以及IBM网站上的相关资料。
第二节 目前数据库应用状况
第三节 暴露出来的问题
第二类应用,主要是数据文件太大,每次处理数据都需要大量的时间,如果写错一个语句就需要花几个小时来重做查询。
第四节 如何解决
对于第一类的应用,在数据库服务器正常运行,负载不高的情况下,应用对数据库系统的状况还是满意的。但是数据库系统负载过高之后,就会出现完成请求的时间加长,达不到系统的要求时间。既然负载是由于过多的请求造成的,我们就采取分担请求的方式,让一部分的请求去访问另外一台服务器,让单台服务器的负载降低,从而解决问题。 对于第二类的应用,就需要分布式计算的系统来解决了,一般的系统是无能为力了。
第五节 针对于"Linux+Apache+PHP+MySQL"的第一类应用问题的解决方式
第六节 MySQL-HA-Proxy方案的提出
如果我们能够有一个程序分拣SQL语句,根据他的类型(读取/写入),分别传送给不同的服务器,然后再将结果返回。采用一种类似HTTP的PROXY的方式,这样我们就不需要通过修改源程序的方式来分担负载了,如果再能够根据服务器的负载状况,或者是表的状态(可用/锁定),来判断应该将这个请求分配到哪台服务器,那就比我们修改源程序所能达到的效果还要好。
第七节 MySQL Client 与 Server之间如何通信
简单的分析了一下通讯协议,现在规整如下,有些地方还不是很完善,由于我实在没有太多的时间仔细研读mysql的代码,目前我只了解到了这些。 Server 对 Client 请求的响应数据格式:
当FLAG=0 , 2的时候 CMD Code 与 Message 的定义
Client 对 Server 提交数据的格式:
Command ID 与 Command Data 的说明:
第八节 Client 如何通过 Server 的用户认证
但是我总要知道用户的密码是否正确吧?怎么办呢?使用一个专用的Mysql来完成密码认证。安装一个最小化资源的Mysql Server用来做MysqlAuth(专用认证服务器),当Client连接后,就将MysqlAuth的第一个数据包返回给Client,这里面当然就包含着Key,然后Client会使用这个Key,加密密码之后,将认证信息发回来,这个时候,MysqlHA系统就会将这个信息转发给MysqlAuth,并且自己保留一份,如果认证通过了,就把保留的那一份进行重组,去掉密码信息,然后用重组后的认证信息去连接集群中的服务器。 图中HA就是使用HeartBeat方式建立的高可靠性系统(具体实现方法请参考 http://www.linuxvirtualserver.org/ )。Proxy为Mysql-Proxy系统,MysqlAuth是专用的认证服务器。红色的RealServer为主要服务器,可以进行数据更新操作,同时将数据同步到其它的RealServer。
下图描述的是认证不通过以及认证通过后与RealServer建立联接的过程
第十节 结束语
系统提供了动态采集RealServer上的LoadAvg然后反馈给Mysql Proxy的程序,但是由于这部分我没有进行测试,所以我在前面的测试中采用的请求分配方式是轮询方式,如果出现两个负载一样的RealServer系统会自动的在它们之间轮换选择。 Mysql-proxy的源代码您可以到我的网站下载: http://netsock.org/bbs/ Mysql-HA-Cluster项目。还有一部分测试的数据我也会在那里公布。 如何进行系统测试? 既然是专门为Linux+Apache+Php+Mysql这样的系统做的集群,就应该找一个实际的应用来跑跑看,然后模拟大量的访问,来进行测试。 选择一个论坛系统也许不错,VBB吧,用的比较多,也比较流行。模拟访问就用Apache自身提供的AB来做。 测试系统的最小环境就是:(五台机器) 1 x Apache + PHP 1 x AB 1 x Mysql Proxy + Mysql Auth Server 2 x Mysql Real Server 第九节的幻灯片可以在 http://www.netsock.org/mysqlha/mysql-ha.ppt 得到 最新版本的源代码可以在 http://www.netsock.org/mysqlha/mysql-proxy_0.0.4.zip 得到 安装说明可以参考 http://netsock.org/bbs/showthread.php?threadid=5 一个sql-bench的运行结果可以在 http://netsock.org/bbs/showthread.php?threadid=9 得到
|