|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不可否认,MySQL也是一个很好的关系型数据库,或许在技术上它与其他领先的关系数据库相差并不大,或不具有劣势。但是,对于一些企业环境来说,MySQL显然不具有优势。利用MySQL内建复制功效来最好化可用性
2001-10-0521:31
公布者:fei浏览次数:142
在Soundbreak我们天天24小时不中断地播放实况音频和视频,以是关于MySQL的新增的复制特征,我们不克不及做出很使人佩服的测试。经由过程测试我们发明,可使用这个特征来与备份数据库服务器坚持数据同步,如许当主服务器由于某种缘故原由处置生效时,可以利用备份机处置一切的查询。关于如许的请求,设置两台服务器其实不坚苦。我将具体会商全部处置历程,同时会商一下当主服务器生效时,怎样利用php来重定向查询。
MySQL外部复制功效是创建在两个或两个以上服务器之间,经由过程设定它们之间的主-从干系来完成的。个中一个作为主服务器,别的的作为从服务器。我将具体会商怎样设置两台服务器,将一个设为主服务器,另外一个设为从服务器。而且形貌一下在它们之间举行切换的处置历程。我是在MySQL的3.23.23版本长进行的设置设置历程,而且也是在这个版本长进行的测试。MySQL开辟职员倡议最好利用最新版本,而且主-从服务器均利用不异的版本。同时MySQL3.23版本仍旧是beta测试版,并且这个版本大概不克不及向下兼容。以是由于这个缘故原由,在实践的网站中,我如今还没有利用这个版本。具有容错才能具有一个优点是,在不需中止任何查询的情形下,对服务器举行晋级。
第一步:设置主服务器
在这篇文章的剩下篇幅中,我将指定两台服务器。A(ip为10.1.1.1)作为主服务器(简称为主机)。B(IP为10.1.1.2)作为后备服务器(简称为备机)。
MySQL的复制功效的完成历程为:备机(B)与主机(A)毗连,然后读出主机的二进制更新日记,再将产生的变更兼并到自已的数据库中。备机必要一个用户帐号来与主机毗连,以是在主机上创立一个帐号,并只给它FILE权限,以下操纵:
GRANTFILEON*.*TOreplicate@10.1.1.2IDENTIFIEDBYpassWord;
为了备性能够与主机毗连,要在主机上运转FLUSHPRIVILEGES,不外不要忧虑,由于我们将鄙人面的步骤中停失落服务器。
如今我们必要主机数据库的一个快照,而且对主机举行设置,同意天生二进制的更新日记。起首编纂my.cnf文件,以便同意二进制更新日记,以是在[mysqld]部分的上面某个中央增添一行:log-bin。鄙人一次服务器启动时,主机将天生二进制更新日记(名为:<主机名>-bin.<增量序号#>)。为了让二进制更新日记无效,封闭MySQL服务程序,然后将主机上的一切数据库目次到另外一个目次中,接侧重新启动mysqld。
请断定失掉了一切数据库,不然在举行复制时,假如一个表在主机上存在但在备机上不存在,将由于堕落而加入。如今你已失掉了数据的快照,和一个从创建快照以来的二进制日记,下面纪录着任何对数据库的修正。请注重MySQL数据文件(*.MYD,*.MYI和*.frm)是依附于文件体系的,以是你不克不及仅仅举行文件传输,如从Solaris到linux。假如你处于一个异种的服务器情况,你将不能不利用mysqldump有用程序或别的的定制剧本来失掉数据快照。
第二步:设置备机
让我们持续。停失落备机上的MySQL服务程序,而且把从主机上拷贝来的数据库目次移到备机上的data目次下。请确认将目次的具有者和属组改动为MySQL用户响应值,而且修正文件形式为660(只对具有者和属组可读、可写),目次自己为770(只对具有者和属组可读、可写和可实行)。
持续。在备机上启动MySQL服务程序,确认MySQL事情一般。运转几个select查询(不要update或insert查询),看一看在第一步中失掉的数据快照是不是乐成。接着,在测试乐成后关失落MySQL服务程序。
在备机上设置必要会见的主机,以便吸收主机的变动。以是必要编纂务机上的my.cnf文件,在[mysqld]部分中增添上面几行:
master-host=10.1.1.1
master-user=replicate
master-password=password
在启动备机服务程序后,备机服务程序将检察在my.cnf文件中所指定的主机,检察是不是有改动,而且将这些改动兼并到自已的数据库中。备机坚持了主机的更新纪录,这些纪录是从主机的master.info文件中吸收上去的。备机线程的形态能够经由过程sql命令SHOWSLAVE-STATUS看到。在备机上处置二进制日记中假如
产生毛病,都将招致备机线程的加入,而且在*.err的日记文件中天生一条信息。然后毛病能够被更正,接着可使用sql语句SLAVESTART来从头启动备机线程。线程将从主机二进制日记处置中止的中央持续处置。
至此,在主机上所产生的数据改动应当已复制到备机上了,要测试它,你能够在主机上拔出或更新一笔记录,而在备机上选择这笔记录。
如今我们具有了从A机到B机的这类主-从干系,如许当A机大概当机的时分,同意我们将一切的查询重定向到B机上往,可是当A机恢复时,我们没有举措将产生的改动恢复到A机中往。为懂得决这个成绩,我们创立从B机到A机的主-从干系。
第三步:创立互相的主从干系
起首在B机上的my.cnf文件中,在[mysqld]部分中到场log-bin,接侧重新启动mysqld,然后创立可在它的下面实行复制功效的用户帐号,利用:
GRANTFILEON*.*TOreplicate@10.1.1.1IDENTIFIEDBYpassword;
在B机上运转FLUSHPRIVILEGES命令,以便装进在到场复制用户后的新的受权表,接着回到A机上,在它的my.cnf中到场上面几行:
master-host=10.1.1.2
master-user=replicate
master-password=password
在重启A机的服务程序以后,如今我们一具有了在A机与B机之间的互相主-从干系。不论在哪一个服务器上更新一笔记录或拔出一笔记录,都将被复制到另外一台服务器上。要注重的是:我不敢断定一个备机兼并二进制日记变更的速率有多快,以是用这类办法来举行拔出或更新语句的负载均衡大概不是一个好举措。
第四步:修正你的数据库毗连程序
既然你已在A机和B机之间创建了一个互相的干系,你必要修正数据库毗连程序,以便从这类体例中失掉优点。上面的函数起首试图与A机毗连,假如不克不及创建毗连则与B机毗连。
/********************************************************
functiondb_connect()
returnsalinkidentifieronsuccess,orfalseonerror
********************************************************/
functiondb_connect(){
$username="replUser";
$password="password";
$primary="10.1.1.1";
$backup="10.1.1.2";
#attemptconnectiontoprimary
if(!$link_id=@mysql_connect($primary,$username,$password))
#attemptconnectiontosecondary
$link_id=@mysql_connect($secondary,$username,$password)
return$link_id;
}
?>
我在两种情形下对利用了下面手艺的数据库毗连创建历程举行了测试,一种是主MySQL服务程序封闭了,可是服务器还在运转,另外一种情形是主服务器封闭了。假如只是mysqld封闭了,毗连会即刻转向备机;可是假如全部服务器封闭了,就呈现了无穷地守候(两分钟后我保持了跟踪--很短的注重跨度),由于PHP在查找一个不存在的服务器。不幸地是,不象fsockopen函数,mysql_connect函数没有一个超时参数,但是我们可使用fsockopen来摹拟一个超时处置。
第五步:一个改善的数据库毗连程序
/********************************************************
functiondb_connect_plus()
returnsalinkidentifieronsuccess,orfalseonerror
********************************************************/
functiondb_connect_plus(){
$username="username";
$password="password";
$primary="10.1.1.1";
$backup="10.1.1.2";
$timeout=15;//timeoutinseconds
if($fp=fsockopen($primary,3306,&$errno,&$errstr,$timeout)){
fclose($fp);
return$link=mysql_connect($primary,$username,$password);
}
if($fp=fsockopen($secondary,3306,&$errno,&$errstr,$timeout)){
fclose($fp);
return$link=mysql_connect($secondary,$username,$password);
}
return0;
}
?>
这个新改善的函数向我们供应了一个可调的超时特征,这恰是mysql_connect函数所短少的。假如毗连当即失利,这类情形如呆板"活"着,但mysqld"当"失落了,函数当即移到第二个服务器。下面的函数相称强健,在试图举行毗连之前先测试一下,检察服务程序是不是在指定端口举行监听,让你的剧本在一段可承受的工夫段后超时,同意你得当地对堕落情形举行处置。假如你修正了缺省端口3306,请包管对端标语举行修正。
结论和定见
起首,要断定失掉了一个完全的数据快照。假如健忘拷贝一个表或数据库将招致备机线程序中断。天生快照的时候是很关健的。你应当确保在拷贝数据文件之前二进制日记功效是有效的。假如在失掉快照之前就同意了二进制日记功效,备机的线程大概会中断,缘故原由就是当线程试图导进主要的纪录时,大概会因为主键反复而中断。最好就是接照第二部分所会商的处置举措来做:封闭-拷贝-同意二进制日记功效重启。
你大概想要依照最后的一种体例来配制复制处置,而且在符合的工夫存眷备机,确保备机与主机坚持同步。
我没有测试过一个利用了复制特征的体系的负载均衡处置功能,可是我会天真地利用如许体系来均衡拔出和更新。比方,假如在两台服务器上两笔记录都给出了统一个auto_increment值,这类情形备机线程会在哪一笔记录上停失落呢?象如许的成绩将会让负载均衡作为只读的处置,一台服务器处置一切的拔出和更新,同时一组备机(是的,你能够有多个与主机分别的备机)处置一切的选择。
我十分乐意,MySQL已具有了复制体系的某些功效,而且设置很复杂。利用它,你就能够入手下手针对掉控的事务供应分外的平安措施了。我仅仅触及了复制特征,这个我已测试而且利用了,可是在MySQL的在线文档中的第11部分有中更具体的申明。
--------------------------------------------------------------------------------
译者的话:
因为我本来利用的是3.22版的MySQL,以是为了测试一下我只好下载了3.23.24版的最新程序。并且由于只要一台呆板,我只是增添了二进制日记的设置。不外,正如本文所说,切实其实有文件天生。假如人人对此感乐趣只好请自行测试了。别的,在最新的MySQL的利用手册中,我发明这个复制功效是在3.23.15版今后才有的,请人人反省自已的MySQL的版本。同时,文中关于二进制日记的设置是说在my.cnf中设置的。在我利用的3.23.24版本中,手册上说能够有三个文件举行参数设置,分离为windows目次下的my.ini文件,c:my.cnf和c:mysqldatamy.cnf中能够设置。我在设置log-bin时(不必要先设log参数)是利用mysql自带的
WinMySQLadmin软件举行设置的,而且在my.ini中设定的,与文中分歧,请人人自行测试。
RDBMS并非没有局限性。它们难以扩展,需要大量的资源来配置和维护,比如时间、硬件和人力。同样,它们往往遵循峰值性能模型,这就要求系统按照峰值容量来配置可用性,而不考虑典型的数据使用情况。 |
|