mysql并发测试工具:MySQL复制特性的测试



在Sound我们每天24小时不间断地播放实况音频和视频所以对于MySQL新增复制特性我们不能做出很令人信服测试通过测试我们发现可以使用这个特性来和备份数据库服务器保持数据同步这样当主服务器某种原因处理失效时能够使用备份机处理所有查询对于这样要求配置两台服务器并不困难我将详细讨论整个处理过程同时讨论下当主服务器失效时如何使用PHP来重定向查询   MySQL内部复制功能是建立在两个或两个以上服务器的间通过设定它们的间主-从关系来实现其中个作为主服务器其它作为从服务器我将详细讨论如何配置两台服务器个设为主服务器个设为从服务器并且描述下在它们的间进行切换处理过程我是在MySQL3.23.23版本上进行配置设置过程并且也是在这个版本上进行测试MySQL开发人员建议最好使用最新版本并且主-从服务器均使用相同版本同时MySQL 3.23版本仍然是beta测试版而且这个版本可能不能向下兼容所以这个原因在实际网站WebSite中我现在还没有使用这个版本拥有容错能力具有个好处是在不需中断任何查询情况下对服务器进行升级

  第步:配置主服务器

  在这篇文章剩下篇幅中我将指定两台服务器A(IP为10.1.1.1)作为主服务器(简称为主机)B(IP为10.1.1.2)作为后备服务器(简称为备机)

  MySQL复制功能实现过程为:备机(B)和主机(A)连接然后读出主机 2进制更新日志再将发生变化合并到自已数据库中备机需要个用户帐号来和主机连接所以在主机上创建个帐号并只给它FILE权限如下操作:

GRANT FILE _disibledevent=>  为了备机能够和主机连接要在主机上运行FLUSH PRIVILEGES不过不要担心我们将在下面步骤中停掉服务器

  现在我们需要主机数据库个快照并且对主机进行配置允许生成 2进制更新日志首先编辑my.cnf文件以便允许 2进制更新日志所以在[mysqld]部分下面某个地方增加行:log-bin在下次服务器启动时主机将生成 2进制更新日志(名为:<主机名>-bin.<增量序号#>)为了让 2进制更新日志有效关闭MySQL服务然后将主机上所有数据库目录到另个目录中接着重新启动mysqld

  请确定得到了所有数据库否则在进行复制时如果个表在主机上存在但在备机上不存在出错而退出现在你已经得到了数据快照个从建立快照以来 2进制日志上面记录着任何对数据库修改请注意MySQL数据文件(*.MYD*.MYI和*.frm)是依赖于文件系统所以你不能仅仅进行文件传输如从Solaris到Linux如果你处于个异种服务器环境你将不得不使用mysqldump实用或其它定制脚本来得到数据快照



  第 2步:配置备机

  让我们继续停掉备机上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看到在备机上处理 2进制日志中如果发生都将导致备机线程退出并且在*.err日志文件中生成条信息然后可以被改正接着可以使用sql语句SLAVE START来重新启动备机线程线程将从主机 2进制日志处理中断地方继续处理

  至此在主机上所发生数据改变应该已经复制到备机上了要测试它你可以在主机上插入或更新条记录而在备机上选择这条记录

  现在我们拥有了从A机到B机这种主-从关系这样当A机可能当机时候允许我们将所有查询重定向到B机上去但是当A机恢复时我们没有办法将发生改变恢复到A机中去为了解决这个问题我们创建从B机到A机主-从关系




  第 3步:创建相互主从关系

  首先在B机上my.cnf文件中在[mysqld]部分中加入log-bin接着重新启动mysqld然后创建可在它上面执行复制功能用户帐号使用:

GRANT FILE _disibledevent=> master-host=10.1.1.2

master-user=replicate

master-password=password





  在重启A机服务的后现在我们拥有了在A机和B机的间相互主-从关系不管在哪个服务器上更新条记录或插入条记录都将被复制到另台服务器上要注意是:我不敢确定个备机合并 2进制日志变化速度有多快所以用这种思路方法来进行插入或更新语句负载平衡可能不是个好办法

  第 4步:修改你数据库连接

  既然你已经在A机和B机的间建立了个相互关系你需要修改数据库连接以便从这种方式中得到好处下面首先试图和A机连接如果不能建立连接则和B机连接


  /********************************************************

  function db_connect

  s a link identier _disibledevent=>    $password = "password";

   $primary = "10.1.1.1";

   $backup = "10.1.1.2";

  # attempt connection to primary

  (! $link_id = @mysql_connect( $primary,  $username,  $password))

  # attempt connection to secondary

   $link_id = @mysql_connect( $secondary,  $username,  $password)

    $link_id;

  }

  ?>





  我在两种情况下对使用了上面技术数据库连接建立过程进行了测试种是主MySQL服务关闭了但是服务器还在运行种情况是主服务器关闭了如果只是mysqld关闭了连接会马上转向备机;但是如果整个服务器关闭了就出现了无限地等待(两分钟后我放弃了跟踪 -- 很短注意跨度)PHP在查找个不存在服务器不幸地是不象fsockopenmysql_connect没有个超时参数然而我们可以使用fsockopen来模拟个超时处理




  第 5步:个改进数据库连接

  /********************************************************

  function db_connect_plus

  s a link identier _disibledevent=>    $password = "password";

   $primary = "10.1.1.1";

   $backup = "10.1.1.2";

   $timeout = 15; // timeout in seconds

  ( $fp = fsockopen( $primary, 3306, & $errno, & $errstr,

   $timeout)){

  fclose( $fp);

    $link = mysql_connect( $primary,  $username,  $password);

  }

  ( $fp = fsockopen( $secondary, 3306, & $errno, & $errstr,

   $timeout)){

  fclose( $fp);

    $link = mysql_connect( $secondary,  $username,  $password);

  }

   0;

  }

  ?>





  这个新改进向我们提供了个可调超时特性这正是mysql_connect所缺少如果连接立即失败这种情况如机器"活"着但mysqld"当"掉了立即移到第 2个服务器上面相当健壮在试图进行连接的前先测试查看服务是否在指定端口进行监听让你脚本在段可接受时间段后超时允许你适当地对出错情况进行处理如果你修改了缺省端口3306请保证对端口号进行修改

  结论和意见

  首先要确定得到了个完整数据快照如果忘记拷贝个表或数据库将导致备机线停止生成快照时刻是很关健你应该确保在拷贝数据文件的前 2进制日志功能是无效如果在得到快照的前就允许了 2进制日志功能备机线程可能会停止原因就是当线程试图导入重要记录时可能会由于主键重复而停止最好就是接照第 2部分所讨论处理办法来做:关闭-拷贝-允许 2进制日志功能重启

  你可能想要按照最初种方式来配制复制处理并且在合适时间关注备机确保备机和主机保持同步

  我没有测试过个使用了复制特性系统负载平衡处理性能但是我会灵活地使用这样系统来平衡插入和更新例如如果在两台服务器上两条记录都给出了同个auto_increment值这种情况备机线程会在哪条记录上停掉呢?象这样问题将会让负载平衡作为只读处理台服务器处理所有插入和更新同时组备机(是你可以有多个和主机分离备机)处理所有选择

  我非常高兴MySQL已经具备了复制系统某些功能并且配置很简单使用它你就可以开始针对失控事件提供额外安全措施了我仅仅涉及了复制特性这个我已经测试并且使用了但是在MySQL在线文档中第11部分有中更详细介绍说明

  译者话:

  由于我原来使用是3.22版MySQL所以为了测试下我只好下载了3.23.24版最新而且只有台机器我只是增加了 2进制日志设置不过正如本文所说确有文件生成如果大家对此感兴趣只好请自行测试了另外在最新MySQL使用手册中我发现这个复制功能是在3.23.15版以后才有请大家检查自已MySQL版本同时文中有关 2进制日志设置是说在my.cnf中设置在我使用3.23.24版本中手册上说可以有 3个文件进行参数设置分别为windows目录下my.ini文件c:my.cnf和c:mysqldatamy.cnf中可以设置我在设置log-bin时(不需要先设log参数)是使用mysql自带WinMySQLadmin软件Software进行设置并且在my.ini中设定和文中区别请大家自行测试

Tags:  mysql连接测试 php连接mysql测试 mysql特性 mysql并发测试工具

延伸阅读

最新评论

发表评论