在Soundbreak我们每天24小时不间断地播放实况音频和视频,所以对于MySQL的新增的复制特性,我们不能做出很令人信服的测试。通过测试我们发现,可以使用这个特性来与备份数据库服务器保持数据同步,这样当主服 务器因为某种原因处理失效时,能够使用备份机处

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

MySQL内部复制功能是建立在两个或两个以上服务器之间,通过设定它们之间的主-从关系来实现的。其中一个作为主服务器,其它的作为从服务器。我将详细讨论如何配置两台服务器,将一个设为主服务器,另一个设为从服务器。并且描述一下在它们之间进行切换的处理过程。我是在MySQL的3.23.23版本上进行的配置设置过程,并且也是在这个版本上进行的测试。MySQL开发人员建议最好使用最新版本,并且主-从服务器均使用相同的版本。同时MySQL 3.23版本仍然是beta测试版,而且这个版本可能不能向下兼容。所以因为这个原因,在实际的网站中,我现在还没有使用这个版本。拥有容错能力具有一个好处是,在不需中断任何查询的情况下,对服务器进行升级。

第一步:配置主服务器

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

第四步:修改你的数据库连接程序 既然你已经在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部分有中更详细的说明。

译者的话:

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

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

mysql 是否支持Unix系统_在UNIX系统下安装MySQL相关推荐

  1. 安装mysql总是未响应状态_求助啊 WIN7下安装mysql出问题 老是说未响应~!!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 # # The following options will be read by the MySQL Server. Make sure that # ...

  2. 安装mysql 图_如何在Windows下安装MYSQL,并截图说明

    说明 : window 下安装 mysql 虽然简单,但是细节不注意就会安装失败,特别是配置服务器时,Current Root Password:为空:如果输入密码了在后面安装会报错.(不知道设置这个 ...

  3. mysql微服务查询问题_微服务架构下,Mysql读写分离后,数据库CPU飙升卡壳问题解析...

    前言 最近系统(基于SpringCloud+K8s)上线,运维团队早上8点左右在群里反馈,系统登录无反应!我的第一反应是Mysql数据库扛不住了. 排查问题也是一波三折,有网络问题,也有mysql读写 ...

  4. win7装mysql一直未响应_求助啊 WIN7下安装mysql出问题 老是说未响应~!!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 # # The following options will be read by the MySQL Server. Make sure that # ...

  5. mysql bundle 安装_阿里云服务器下安装MySQL (Bundle压缩包 安装)

    一  下载Bundle文件 我阿里云版本是centos 7.3 ,下载的是如下版本 二 卸载对应的依赖 主要是如下两个依赖: rpm -qa | grep  postfix rpm -qa | gre ...

  6. win10 mysql安装转圈_win10系统下安装MySQL的过程

    转自脚本之家原链接 WIN10系统MYSQL的下载与安装详细教程,记录如下 前两天ubuntu下安装mysql遇到了一些依赖问题,结果解决了半天,没解决好,还把我的系统搞坏了,小白破坏力好强. 到现在 ...

  7. win10系统下安装MySQL的过程

    转自脚本之家原链接 WIN10系统MYSQL的下载与安装详细教程,记录如下 前两天ubuntu下安装mysql遇到了一些依赖问题,结果解决了半天,没解决好,还把我的系统搞坏了,小白破坏力好强. 到现在 ...

  8. Linux系统下安装MySQL及QT数据库编程

    系统为Ubuntu16.04LTS,MySQL版本为5.7,QT版本为5.12.9 安装MySQL sudo apt-get install mysql-server //服务端 sudo apt-g ...

  9. 在linux下怎么安装mysql,手把手教你在Linux系统下安装MySQL

    在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1. 下载并安装MySQL官方的 Yum R ...

  10. 与mysql数据库的交互实战_实战教程丨五步教你优雅地在Windows下安装MySQL数据库...

    虽说近几个月全球的经济都不怎么景气,但有个事实我们必须得承认: 各行各业的数据体量正在不断变大. 而随着数据体量的不断扩大,各公司使用数据库管理来数据再常见不过.比如MySQL这样的关系型数据库,互联 ...

最新文章

  1. 中小企业网站建设不妨试试快速建站
  2. 最牛营业部——国信泰然九路揭秘
  3. 云服务器的操作系统是什么,服务器操作系统是什么?云服务器的操作系统怎么选择...
  4. linux nohup命令
  5. 一文带你吃透Vue生命周期(结合案例通俗易懂)
  6. Kconfig文件详解
  7. 网页设计如何排成一列_学习DIV+CSS网页布局之一列布局
  8. 4199病毒如何清除
  9. Android Base64编码算法
  10. jenkins编译java项目时无法读取pom.xml文件
  11. Python:retrying与tenacity模块失败重跑库
  12. Django框架_day01
  13. 8个LED灯分别以不同频率闪烁
  14. 四舍六入五成双并保留一位有效位-数据修约
  15. 教你如何用思维导图把一本书内容绘制成一张A4纸!
  16. 抖音3D旋转相册 (源码下载)
  17. Android截屏的几种实现
  18. Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序
  19. python工作流引擎_工作流,活动图和Python协程(一)
  20. 北京计算机大专录取线,北京多少分能上大专,北京大专院校最低分数线

热门文章

  1. 开发指南专题六:JEECG微云快速开发平台代码生成
  2. 视频超分修复,让重温经典影片有了新的可能
  3. 使用HttpClient的时候报错java.io.IOException: Attempted read from closed stream
  4. 加密和杂凑(Hashing)有什么不一样?
  5. “毒液” 高危漏洞背后的技术较量
  6. 【Python 实战基础】Pandas如何统筛选复制某个数据
  7. vscode 下载地址
  8. CISP和等保什么区别?
  9. python 四维数据怎么看性别_四维单子上有男女暗示 我告诉你四维彩超怎么分辨男女...
  10. 实例讲解新GRE填空的变化