用MySQL内建复制功能来优化可用性(2)
作者:佚名 来源:IT专家网BBS 发布时间:2009-02-13 13:55:00
第四步:修改你的数据库连接程序
既然你已经在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部分有中更详细的说明。


猜你喜欢
- 传统的网页BBS大多是采用CGI模式实现的,它的实现要求编程者既要掌握编程语言如Perl或C等,又要了解关于CGI模式的各项技术内容,因此要
- python3.x已经不支持mysqldb了,支持的是pymysql使用pandas读取MySQL数据时,使用sqlalchemy,出现No
- 本文实例讲述了python计算圆周率pi的方法。分享给大家供大家参考。具体如下:from sys import stdout scale =
- 由于现在的博客是使用wordpress搭建,自己得经常修改过一些代码,但是修改第三方源码真的比较痛苦,于是决定计划开始使用React + N
- 一、Mysql锁是什么?锁有哪些类别?锁定义: 同一时间同一资源只能被一个线程访问  
- 前言今天我们一起来聊聊DataFrame中的索引。上一篇文章当中我们介绍了DataFrame数据结构当中一些常用的索引的使用方法,比如ilo
- 首先先发一下我的项目路径1. 首先要下载 sass-resources-loadernpm install sass
- 当地址栏没有参数"id"时: 代码如下:Request.QueryString["ID"] == n
- 本文实例讲述了Python实现的爬取小说爬虫功能。分享给大家供大家参考,具体如下:想把顶点小说网上的一篇持续更新的小说下下来,就写了一个简单
- 问题描述vscode中跨目录的模块调用远不如pycharm中的来的简单,在pycharm中即使是不同库文件夹中子函数也可以进行互相调用。而在
- 简单实现ip代理,为了不卖广告,请自行准备一个ip代理的平台例如我用的这个平台,每次提取10个ip从上面可以看到数据格式是文本,换行是\r\
- 自动依赖注入在 AbpBase.Web 的 AbpBaseWebModule 中,添加一个函数:此函
- 不得不说python的自制包的相关工具真是多且混乱,什么setuptools,什么distutils,什么wheel,什么egg!!怎么有这
- 先来看个例子:#-*- coding:utf8 -*-s = u'中文截取's.decode('utf8')
- xlsxwriter可能用过的人并不是很多,不过使用后就会感觉,他的功能让你叹服,除了可以按要求生成你所需要的excel外还可以加上很形象的
- 这篇文章主要介绍了基于python实现蓝牙通信代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 在使用python编程过程中,我们往往需要借助字典来提高编程效率。同时为了调试方便,我们希望将某些变量保存为中间文件。例如,在协同过滤算法中
- Fiddler,这个是所有软件开发者必备神器!这款工具不仅可以抓取PC上开发web时候的数据包,而且可以抓取移动端(Android,Ipho
- 大家先看一下Python os模块中的部分函数python 路径相关的函数 os.listdir(dirname):列出dirname下的目
- 大家好,今天我在学习 MySQL 8.0.22安装及配置遇到了一些问题,特地将我整个安装过程分享出来希望可以帮助不会安装的小伙伴😜。参考链接