使用MySQL内建复制功能来最佳化可用性(二)

mysql

使用MySQL内建复制功能来最佳化可用性(二)


第三步:创建相互的主从关系
  首先在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机之间的相互主-从关系。不管在哪个服务器上更新一条记录或插入一条记录,都将被复制到另一台服务器上。要注意的是:我不敢确定一个备机合并二进制日志变化的速度有多快,所以用这种方法来进行插入或更新语句的负载平衡可能不是一个好办法。

第四步:修改你的数据库连接程序
  既然你已经在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:mysqldatamy.cnf中可以设置。我在设置'log-bin'时(不需要先设log参数)是使用mysql自带的
WinMySQLadmin软件进行设置的,并且在my.ini中设定的,与文中不同,请大家自行测试。

原作者:Michael  
来源:PHPBuilder.com   

时间: 2024-08-07 17:35:03

使用MySQL内建复制功能来最佳化可用性(二)的相关文章

使用MySQL内建复制功能来最佳化可用性

mysql 使用MySQL内建复制功能来最佳化可用性2001-10-05 21:31 发布者:fei 阅读次数:142在Soundbreak我们每天24小时不间断地播放实况音频和视频,所以对于MySQL的新增的复制特性,我们不能做出很令人信服的测试.通过测试我们发现,可以使用这个特性来与备份数据库服务器保持数据同步,这样当主服务器因为某种原因处理失效时,能够使用备份机处理所有的查询.对于这样的要求,配置两台服务器并不困难.我将详细讨论整个处理过程,同时讨论一下当主服务器失效时,如何使用PHP来重

使用MySQL内建复制功能来最佳化可用性(一)

mysql 使用MySQL内建复制功能来最佳化可用性(一) 在Soundbreak我们每天24小时不间断地播放实况音频和视频,所以对于MySQL的新增的复制特性,我们不能做出很令人信服的测试.通过测试我们发现,可以使用这个特性来与备份数据库服务器保持数据同步,这样当主服务器因为某种原因处理失效时,能够使用备份机处理所有的查询.对于这样的要求,配置两台服务器并不困难.我将详细讨论整个处理过程,同时讨论一下当主服务器失效时,如何使用PHP来重定向查询. MySQL内部复制功能是建立在两个或两个以上服

用MySQL内建复制功能来优化可用性

在Soundbreak我们每天24小时不间断地播放实况音频和视频,所以对于MySQL的新增的复制特性,我们不能做出很令人信服的测试.通过测试我们发现,可以使用这个特性来与备份数据库服务器保持数据同步,这样当主服务器因为某种原因处理失效时,能够使用备份机处理所有的查询.对于这样的要求,配置两台服务器并不困难.我将详细讨论整个处理过程,同时讨论一下当主服务器失效时,如何使用PHP来重定向查询. MySQL内部复制功能是建立在两个或两个以上服务器之间,通过设定它们之间的主-从关系来实现的.其中一个作为

Python中3种内建数据结构:列表、元组和字典_python

Python中有3种内建的数据结构:列表.元组和字典.参考简明Python教程 1. 列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个 序列 的项目.假想你有一个购物列表,上面记载着你要买的东西,你就容易理解列表了.只不过在你的购物表上,可能每样东西都独自占有一行,而在Python中,你在每个项目之间用逗号分割. 列表中的项目应该包括在方括号中,这样Python就知道你是在指明一个列表.一旦你创建了一个列表,你可以添加.删除或是搜索列表中的项目.由于你可以增加或删除项目,

编程-python内建类型与内部类型的区别

问题描述 python内建类型与内部类型的区别 python核心编程(第二版)书中第四章python对象中的两个概念 解决方案 内部类型是指定义在类型内的类型.内建类型是指语言提供的基本类型,无需定义,比如整数或者字符串. 解决方案二: 内建类型是python类库提供给你的基本数据类型内部类型是面向对象的,类的内部类型,它是类内部使用的

教程/dreamweaver/提高 细品DW MX 2004内建FW技术

dreamweaver|教程  Macromedia官方将在其他软件中内建Fireworks技术称为Fireworks技术,网上也称之为内建图片编辑器.Dreamweaver MX 2004给人的一个感觉就是与Macromedia公司其它产品的全面无缝集成,这样就大大缩短了开发人员的开发周期,提高工作效率. 以前的Dreamweaver中是没有图片处理功能的,即使你要处理也只能使用CSS中的相关滤镜进行一些效果的改变,而大多数特效的制作我们则必须使用Fireworks或者Photoshop工具.

细品DreamweaverMX内建FW技术

dreamweaver Macromedia官方将在其他软件中内建Fireworks技术称为Fireworks技术,网上也称之为内建图片编辑器.Dreamweaver MX 2004给人的一个感觉就是与Macromedia公司其它产品的全面无缝集成,这样就大大缩短了开发人员的开发周期,提高工作效率. 以前的Dreamweaver中是没有图片处理功能的,即使你要处理也只能使用CSS中的相关滤镜进行一些效果的改变,而大多数特效的制作我们则必须使用Fireworks或者Photoshop工具.现在好了

JSP内建对象

js|对象 ① out - javax.servlet.jsp.jspWriter   out对象用于把结果输出到网页上. 方法:1. void clear() ;   清除输出缓冲区的内容,但是不输出到客户端. 2. void clearBuffer() ;   清除输出缓冲区的内容,并输出到客户端. 3. void close() ;   关闭输出流,清除所有内容. 4. void flush() ;   输出缓冲区里面的数据. 5. int getBufferSize() ;   获取以k

Dreamweaver MX 2004 内建Fireworks技术

dreamweaver Macromedia官方将在其他软件中内建Fireworks技术称为Fireworks技术,网上也称之为内建图片编辑器.Dreamweaver MX 2004给人的一个感觉就是与Macromedia公司其它产品的全面无缝集成,这样就大大缩短了开发人员的开发周期,提高工作效率. 以前的Dreamweaver中是没有图片处理功能的,即使你要处理也只能使用CSS中的相关滤镜进行一些效果的改变,而大多数特效的制作我们则必须使用Fireworks或者Photoshop工具.现在好了