作者通过测试发现,可以使用MySQL的新增的复制特性来与备份数据库服务器保持数据同步,这样当主服务器因为某种原因处理失效时,能够使用备份机处理所有的查询。对于这样的要求,配置两台服务器并不困难。本文中作者将详细讨论整个处理过程,同时讨论一下当主服务器失效时,如何使用PHP来重定向查询。

MySQL内部仿制功用是树立在两个或两个以上服务器之间,经过设定它们之间的主-从联系来完成的。其间一个作为主服务器,其它的作为从服务器。我将具体评论怎么装备两台服务器,将一个设为主服务器,另一个设为从服务器。而且描绘一下在它们之间进行切换的处理进程。我是在MySQL的3.23.23版别上进行的装备设置进程,而且也是在这个版别上进行的测验。MySQL开发人员主张最好运用最新版别,而且主-从服务器均运用相同的版别。一起MySQL 3.23版别仍然是beta测验版,而且这个版别或许不能向下兼容。所以因为这个原因,在实践的网站中,我现在还没有运用这个版别。具有容错才能具有一个优点是,在不需中止任何查询的状况下,对服务器进行晋级。

MySQL新特性之仿制特性的测验(mysql 特性)  MySQL 复制特性 测试 数据库 主-从服务器 第1张

第一步:装备主服务器

在这篇文章的剩余篇幅中,我将指定两台服务器。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机之间的彼此主-从联系。不论在哪个服务器上更新一条记载或刺进一条记载,都将被仿制到另一台服务器上。要留意的是:我不敢承认一个备机兼并二进制日志改动的速度有多快,所以用这种办法来进行刺进或更新句子的负载平衡或许不是一个好办法。

#p#

第四步:修正你的数据库衔接程序

已然你现已在A机和B机之间树立了一个彼此的联系,你需求修正数据库衔接程序,以便从这种办法中得到优点。下面的函数首要企图与A机衔接,假如不能树立衔接则与B机衔接。

/********************************************************
  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来模仿一个超时处理。

第五步:一个改善的数据库衔接程序

/********************************************************
  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部分有中更具体的阐明。

【修正引荐】

  1. 三种优化MySQL数据库查询的办法简介
  2. 用于MySQL的PHP XML类
  3. PHP+MySQL视频教程
转载请说明出处
知优网 » MySQL新特性之仿制特性的测验(mysql 特性)

发表评论

您需要后才能发表评论