基于MySQL的数据库集群系统的实现[MySQL防范]
本文“基于MySQL的数据库集群系统的实现[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
第一节 数据库集群技术的近况
目前数据库集群系统利用得对比成功,利用范围对比遍及的是:Oracle公司的Oracle9与IBM公司DB2.Oracle9采取Shared-storage的技术,DB2挑选了Shared-nothing的技术,二者各有长短.
最新的数据库集群系统的理论底子是分布式计算,将数据分布到每个节点,全部的计算节点并行处理数据,将后果汇总.这样的方法无疑是最完善的.但是目前仍旧不能实现全部的功效.
关于Shared-storage以及Shared-nothing的技术请参考Oracle以及IBM网站上的相关资料.
第二节 目前数据库利用情况
目前数据库利用情况大致分为两类,第一类是数据量在100G以下,数据库拜候频繁,恳求密集.主如果Web APP范例的利用,比方:网站,论坛等.这些Web APP范例的利用拜候数据库的特点是:拜候频繁,数据库每秒钟要承受几千次以上的查询,需求常常追加数据,同时对数据的呼应速度要求对比高.另一类是用于科学计算、存储历史数据的利用,数据量常常到达几百G.这些利用拜候数据库的特点是:多为查询操作,数据都是分批、按时、集合倒入数据库,数据库的记录非常多,堆集了大量的数据,对数据库的呼应速度没有太高要求.
第三节 表暴露来的问题
第一类利用,由于拜候对比频繁,并且为了支持更多的拜候,Web Server普通都利用了负载均衡的集群,但是关于数据库来说,由于无法实现集群操作,每秒钟的恳求不断增添,随着服务器负载的增添,呼应单个恳求的速度越来越慢,假如库文件对比大,呈现写操作的时刻还会呈现锁表时间太长等影响拜候效率的事情.
第二类利用,主如果数据文件太大,每次处理数据都需求大量的时间,假如写错一个语句就需求花几个小时来重做查询.
第四节 若何办理
首先该当从硬件、软件、程序、索引、SQL语句这几个方面举行优化,假如仍旧不能办理问题,我们就要考虑数据库系统的集群(并行处理)了.
关于第一类的利用,在数据库服务器正常运行,负载不高的情形下,利用对数据库系统的情况还是称心的.但是数据库系统负载太高之后,就会呈现完成恳求的时间加长,达不到系统的要求时间.既然负载是由于过量的恳求造成的,我们就采纳分担恳求的方法,让一部份的恳求去拜候别的一台服务器,让单台服务器的负载降低,从而办理问题.
关于第二类的利用,就需求分布式计算的系统来办理了,普通的系统是无能为力了.
第五节 针关于"Linux+Apache+PHP+MySQL"的第一类利用问题的办理方法
一个实际案例的办理:
我在工作当中碰到了这样的问题,我们的Web Server是Linux+Apache+Php的三台机械构成的集群,MySQL运行在SUN450,2G内存的平台上.由于WEB的拜候量在顶峰的时刻几近满负荷运转,LoadAvg(就是一分钟之内处于Running状况的进程数目)都在10-20之间,反映出来就是大量的恳求都在拜候数据库的时刻被挂住了,招致一个恳求没有完成,下一个恳求又进来,最后恶性循环.LoadAvg会在刹时飙升至800以上.数据库哪里就更糟糕了,LoadAvg到达 300多,数据库的线程非常多,CPU忙于切换线程状况,这个时刻除非Restart MySQL,不然怎么都不会好.在对SQL语句优化完成后还是不能很好的办理问题,我们增添了一台数据库服务器,通过MySQL的数据同步机制,让两台数据库上的数据保持同步,改正了一部份只会发生读取操作的php程序,让这些程序衔接别的一台数据库,算是把负载别离出去一部份,问题得到了初步的办理.但是后来业务做大,我们又增添了多台服务器,改正了很多程序,别离他们对数据库的读取操作,拜候差别的服务器.
第六节 MySQL-HA-Proxy筹划的提出
通过改正程序的方法实现将系统的负载别离,是件很痛楚的事情,工程浩荡,并且不能弄错,因为除了主服务器可以写入、改正数据,而别的的服务器只能通过数据同步更新自身的数据,所以假如你对那些数据库举行了写操作,后果将是灾难性的.
假如我们可以有一个程序分拣SQL语句,按照他的范例(读取/写入),额外传送给差别的服务器,然后再将后果返回.采取一种近似HTTP的PROXY的方法,这样我们就不需求通过改正源程序的方法来分担负载了,假如再可以按照服务器的负载情况,大概是表的状况(可用/锁定),来判断应当将这个恳求分配到哪台服务器,那就比我们改正源程序所能到达的效果还要好.
第七节 MySQL Client 与 Server之间若何通信
到处探求,也没有找到一篇关于Mysql通讯协议的文章,看来只有解析Mysql的源程序了.于是找来mysql 3.23.49的代码,翻开sniffer工具.MySQL的通讯协议大概变更过多次,在3.23.49的版本里面,通讯协议的版本竟然是10.
简单的解析了一下通讯协议,目前规整以下,有些地方还不是很完善,由于我实在没有太多的时间细心研读mysql的代码,目前我只理解到了这些.
Server 对 Client 恳求的呼应数据格局:
偏移 | 区域 | 范例 | 长度(byte) | 阐明 |
0 | HEAD | Data Length | 3 | |
1 | ||||
2 | ||||
3 | FLAG | 1 | =0普通信息 =1多段信息 =2认证返回 >2段完毕字 | |
4 | DATA | CMD Code | 1 | |
5 | Message | DataLength - 1 |
当FLAG=0 , 2的时刻 CMD Code 与 Message 的定义
CMDCode | 范例 | Message的构造 | |||
00 | 状况码 | 偏移 | 范例 | Length(byte) | |
0 | Affect rows | 2 | |||
0A | 服务器版本号 | 偏移 | 范例 | Length(byte) | |
只有在方才衔接上Server的时刻有效,Server会即刻返回一个数据节段的信息 | 0 | VersionString | 8 | end of '\0' | |
8 | Session ID | 4 | 32bits | ||
12 | UnKnown | 11 | |||
FF | 当呈现错误的时刻返复书息 | 偏移 | 范例 | Length(byte) | |
0 | ErrCode | 2 | |||
2 | ErrMsg | END | |||
FE | 多段信息传输的完毕 | 空 |
[1] [2] [3] 下一页
Client 对 Server 提交数据的格局:
偏移 | 区域 | 范例 | Length(byte) |
0 | HEAD | Data Length | 3 |
1 | |||
2 | |||
3 | Compressed | 1 | |
4 | DATA | Command ID | 1 |
5 | Command Data | Data Length - 1 |
Command ID 与 Command Data 的阐明:
ID | 范例 | 数据格局 |
0 | COM_SLEEP | |
1 | COM_QUIT | NULL |
2 | COM_INIT_DB | Database name |
3 | COM_QUERY | stand query string |
4 | COM_FIELD_LIST | table name [128] wildcard[128] |
5 | COM_CREATE_DB | Database name |
6 | COM_DROP_DB | Database name |
7 | COM_REFRESH | options(bits) |
8 | COM_SHUTDOWN | NULL |
9 | COM_STATISTICS | NULL |
10 | COM_PROCESS_INFO | NULL |
11 | COM_CONNECT | |
12 | COM_PROCESS_KILL | sid[4] |
13 | COM_DEBUG | NULL |
14 | COM_PING | NULL |
15 | COM_TIME | |
16 | COM_DELAYED_INSERT | |
17 | COM_CHANGE_USER | [user][passwd][db] |
18 | COM_BINLOG_DUMP | |
19 | COM_TABLE_DUMP | |
20 | COM_CONNECT_OUT |
第八节 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.
上一页 [1] [2] [3] 下一页
下图描写的就是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
上一页 [1] [2] [3]
以上是“基于MySQL的数据库集群系统的实现[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |