利用MySQL内建复制功效来最佳化可用性[MySQL防范]
本文“利用MySQL内建复制功效来最佳化可用性[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在Soundbreak我们每天24小时不中止地播放实况音频和视频,所以关于MySQL的新增的复制特点,我们不能做出很令人信服的测试.通过测试我们发现,可以利用这个特点来与备份数据库服务器保持数据同步,这样当主服务器因为某种缘由处理失效时,可以利用备份机处理全部的查询.关于这样的要求,配置两台服务器并不艰难.我将具体谈论整个处理历程,同时谈论一下当主服务器失效时,若何利用PHP来重定向查询.
MySQL内部复制功效是成立在两个或两个以上服务器之间,通过设定它们之间的主-从关系来实现的.此中一个作为主服务器,别的的作为从服务器.我将具体谈论若何配置两台服务器,将一个设为主服务器,另一个设为从服务器.并且描写一下在它们之间举行切换的处理历程.我是在MySQL的3.23.23版本上举行的配置设置历程,并且也是在这个版本上举行的测试.MySQL开辟人员倡议最好利用最新版本,并且主-从服务器均利用相同的版本.同时MySQL 3.23版本仍旧是beta测试版,并且这个版本大概不能向下兼容.所以因为这个缘由,在实际的网站中,我目前还没有利用这个版本.拥有容错本领具有一个好处是,在不需中止任何查询的情形下,对服务器举行进级.
第一步:配置主服务器
在这篇文章的剩下篇幅中,我将指定两台服务器.A(IP为10.1.1.1)作为主服务器(简称为主机).B (IP为10.1.1.2)作为后备服务器(简称为备机).
MySQL的复制功效的实现历程为:备机(B)与主机(A)衔接,然后读出主机的二进制更新日记,再将发生的改变归并到自已的数据库中.备机需求一个用户帐号来与主机衔接,所以在主机上成立一个帐号,并只给它FILE权限,以下操作:
GRANT FILE ON *.* TO replicate@10.1.1.2 IDENTIFIED BY 'password';
为了备机可以与主机衔接,要在主机上运行'FLUSH PRIVILEGES',不过不要耽忧,因为我们将在下面的步骤中停掉服务器.
目前我们需求主机数据库的一个快照,并且对主机举行配置,答应生成二进制的更新日记.首先编辑'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号令'SHOW SLAVE-STATUS'看到.在备机上处理二进制日记中假如发生错误,都将招致备机线程的退出,并且在*.err的日记文件中生成一条信息.然后错误可以被改正,接着可以利用sql语句'SLAVE START'来重新启动备机线程.线程将从主机二进制日记处理中止的地方持续处理.
至此,在主机上所发生的数据改变应当已经复制到备机上了,要测试它,你可以在主机上插入或更新一条记录,而在备机上挑选这条记录.
目前我们拥有了从A机到B机的这种主-从关系,这样当A机大概当机的时刻,答应我们将全部的查询重定向到B机上去,但是当A机恢复时,我们没有办法将发生的改变恢复到A机中去.为了办理这个问题,我们成立从B机到A机的主-从关系.
第三步:成立彼此的主从关系
首先在B机上的my.cnf文件中,在[mysqld]部份中加入'log-bin',接侧重新启动mysqld,然后成立可在它的上面履行复制功效的用户帐号,利用:
GRANT FILE ON *.* TO replicate@10.1.1.1 IDENTIFIED BY 'password';
在B机上运行'FLUSH PRIVILEGES'号令,以便装入在加入复制用户后的新的受权表,接着回到A机上,在它的'my.cnf'中加入下面几行:
master-host=10.1.1.2
master-user=replicate
master-password=password
在重启A机的服务程序之后,目前我们一拥有了在A机与B机之间的彼此主-从关系.不管在哪个服务器上更新一条记录或插入一条记录,都将被复制到另一台服务器上.要注意的是:我不敢肯定一个备机归并二进制日记改变的速度有多快,所以用这种办法来举行插入或更新语句的负载均衡大概不是一个好办法.
[1] [2] 下一页
第四步:改正你的数据库衔接程序
既然你已经在A机和B机之间成立了一个彼此的关系,你需求改正数据库衔接程序,以便从这种方法中得到好处.下面的函数首先试图与A机衔接,假如不能成立衔接则与B机衔接.
<?php
/********************************************************
function db_connect()
returns a link identifier on success, or false on error
********************************************************/
function db_connect(){
$username = "replUser";
$password = "password";
$primary = "10.1.1.1";
$backup = "10.1.1.2";
# attempt connection to primary
if(!$link_id = @mysql_connect($primary, $username, $password))
# attempt connection to secondary
$link_id = @mysql_connect($secondary, $username, $password)
return $link_id;
}
?>
我在两种情形下对利用了上面技术的数据库衔接成立历程举行了测试,一种是主MySQL服务程序关闭了,但是服务器还在运行,另一种情形是主服务器关闭了.假如只是mysqld关闭了,衔接会即刻转向备机;但是假如整个服务器关闭了,就呈现了无限地等候(两分钟后我放弃了跟踪 -- 很短的注意跨度),因为PHP在查找一个不存在的服务器.不幸地是,不象fsockopen函数,mysql_connect函数没有一个超时参数,但是我们可以利用fsockopen来模拟一个超时处理.
第五步:一个改良的数据库衔接程序
<?php
/********************************************************
function db_connect_plus()
returns a link identifier on success, or false on error
********************************************************/
function db_connect_plus(){
$username = "username";
$password = "password";
$primary = "10.1.1.1";
$backup = "10.1.1.2";
$timeout = 15; // timeout in seconds
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);
}
return 0;
}
?>
这个新改良的函数向我们供应了一个可调的超时特点,这恰是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:\mysql\data\my.cnf中可以设置.我在设置'log-bin'时(不需求先设log参数)是利用mysql自带的WinMySQLadmin软件举行设置的,并且在my.ini中设定的,与文中差别,请大家自行测试.
上一页 [1] [2]
以上是“利用MySQL内建复制功效来最佳化可用性[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |