第八节 Client如何通过Server的用户认证
协议分析完成了,我尝试着让它工作起来,可是认证这个部分遇到了麻烦,Mysql Server在Client连接上它的时候,会首先返回给Client一个数据包,包含协议的版本号,版本信息,SessionID,一个8字节的Key,就是这个Key的原因。Client会使用这个Key来加密密码,然后将用户名,密码,需要打开的数据库等信息发送给Server,这样就完成认证了。我不知道Client是如何利用这个Key来加密的,所以我打算跳过密码,我将Client的数据包重组,去掉Password的信息之后,我成功了,但是集群里面的Mysql用户都是没有密码的,安全性多多少少有些问题,不过这些服务器都是放在HA后面的,没有外部的IP地址,应该问题不大,不过多多少少是个缺憾。
但是我总要知道用户的密码是否正确吧?怎么办呢?使用一个专用的Mysql来完成密码认证。安装一个最小化资源的Mysql Server用来做MysqlAuth(专用认证服务器),当Client连接后,就将MysqlAuth的第一个数据包返回给Client,这里面当然就包含着Key,然后Client会使用这个Key,加密密码之后,将认证信息发回来,这个时候,MysqlHA系统就会将这个信息转发给MysqlAuth,并且自己保留一份,如果认证通过了,就把保留的那一份进行重组,去掉密码信息,然后用重组后的认证信息去连接集群中的服务器。
第九节 系统的结构与流程
图中HA就是使用HeartBeat方式建立的高可靠性系统(具体实现方法请参考 http://www.linuxvirtualserver.org/ )。Proxy为Mysql-Proxy系统,MysqlAuth是专用的认证服务器。红色的RealServer为主要服务器,可以进行数据更新操作,同时将数据同步到其它的RealServer。
上图描述的就是Client认证过程
上图描述的是认证不通过以及认证通过后与RealServer建立联接的过程
上图讲述了连接建立后,系统处理SQL Query请求的过程
第十节 结束语
我现在已经基本完成了mysql-proxy的程序的开发,但是目前仍然处于测试阶段,最新的版本是0.0.4,下一个版本仍然还在修订中。从0.0.3版本开始,mysql-proxy已经可以完整的跑完mysql自身提供的sql-bench了,但是这个sql-bench只能提供单点的性能,没有对集群的mysql系统提供测试功能。
系统提供了动态采集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 得到
作者简介:
徐超,任职于TOM.COM北京公司,从事网络系统技术支持及系统维护工作。业余时间致力于以NetSocket技术为基础的网络应用的开发。开发网站:http://netsock.org/bbs/ 目前正在开发的项目包括:SocketChat, MySQL-HA-Proxy, Php Session Server
 
2/2 首页 上一页 1 2 |