您现在的位置:计算机技术学习网 > 技术中心 > WEB编程 > PHP >

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

来源:网络收集 责任编辑:栏目编辑 发表时间:2013-07-01 16:44 点击:
第三步:创建相互的主从关系
  首先在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值,这种情况备机线程会在
哪一条记录上停掉呢?象这样的问题将会让负载平衡作为只读的处理,一台服务器

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • PHP测试
    • 十天学会php之第六天
    • 几种显示数据的方法的比较
    • 使用xmlhttp为网站增加域名查询功能
    • PHP+MYSQL+Javascript数据库查询结果的动态显示
    • 查找数组中指定键名的值
    • 用redis实现跨服务器session
    • 用新浪微博接口发送图片微博失败的原因
    • smarty局部缓存技术[源码分析]
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1