当前位置:七道奇文章资讯数据防范MySQL防范
日期:2011-05-02 15:44:00  来源:本站整理

基于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防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 基于MySQL的BBS计划(目录)
  • 基于MySQL的BBS计划(1)
  • 基于MySQL的数据库集群系统的实现
  • 一个基于mysql的登陆考证程序
  • 基于MySQL的BBS计划(3)
  • <b>帮忙你开辟基于MySQL数据库的论坛计划</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .