mysql常见问题及答案FAQ

[ 来源:http://www.it55.com | 作者: | 时间:2007-09-07 | 收藏 | 推荐 ] 【

问:如何准备客户端应用程序的代码来适应同步应用?
答:如果代码中负责存取数据库的部分已经被合理地抽象化/模块化了,将它们转化成适用运行于同步环境中将会很平滑和简单。只需要修改数据库存取实现部分,把所有的写操作放到master上,把所有的读操作放到master或者slave上。如果你的代码还没达到这个层次的抽象化,那么这将成为整理代码的机会和动机。可以使用类似以下函数创建封装类库或者模块: 免费设计素材下载http://www.it55.com

* safe_writer_connect()
* safe_reader_connect()
* safe_reader_statement()
* safe_writer_statement() 免费矢量图片素材下载http://www.it55.com

每个函数名的 safe_ 表示它们会处理所有的错误情况。可以使用其他函数名。重要的是,要为读连接、写连接、读、写定义好统一的接口。 免费网页模版下载http://www.it55.com

然后将客户端代码转换成使用封装的类库。已开始可能是很痛苦且麻烦的,不过在将来长期运行中就能得到回报了。所有使用上述方法的应用程序都会在 master/slave配置中有优势,即使包含多个slave。这些代码将很容易维护,一些额外的麻烦也会很少。自豪需要修改一个或者两个函数;例如,想要记录每个语句执行了多长时间,或者在上千个语句中哪个出现错误了。 免费矢量图片素材下载http://www.it55.com

如果已经写了很多代码,你可能想要自动转换它们,那么可以使用MySQL发布的 replace 工具,或者自己写转换脚本。理想地,你的代码已经使用了统一的编程风格。如果不是,最好重写它们,或者可以遍历检查一下,手工规范化一下代码风格。

45398 http://www.it55.com it55学习IT知识,享受IT生活 4dfkjn

问:MySQL同步何时且有多少能提高系统性能?

http://www.it55.com在线教程

答:MySQL同步对于频繁读但不频繁写的系统很有好处。理论上来讲,使用单一master/多slave的配置,就可以通过这个方法来衡量系统:增加更多的slave直到用完所有的网络带宽或者master的更新操作增长到了不能再处理的点了。

免费资源http://www.it55.com

想要知道增加多少个slave之后得到的性能才能平稳,以及能提高多少性能,就需要知道查询模式,并且根据经验对典型的master和slave做读(每秒读或 max_reads)和写(max_write)基准测试得到它们之间的关系。下例展示了一个理想系统取得的性能的简单计算方法。

免费设计素材下载http://www.it55.com

设定系统负载由10%写和90%读组成,我们已经通过基准测试确定 max_reads 是1200 - 2 * max_writes。换句话说,系统可以达到每秒做没有写的1200次读操作,写操作平均是读操作的2倍慢,它们之间的关系是线性的。让我们假设master和每个slave都有同样的容量,有一个master和N个slave。每个服务器(master或slave): http://www.it55.com/

reads = 1200 - 2 * writes

免费设计素材下载http://www.it55.com

reads = 9 * writes / (N + 1) (读是分开的,但是所有写是在所有的服务器上的) it55.com

9 * writes / (N + 1) + 2 * writes = 1200

免费矢量图片素材下载http://www.it55.com

writes = 1200 / (2 + 9/(N+1)) 免费网页模版下载http://www.it55.com

最后的等式说明了N个slave的最大写数量,给它每分钟的最高读频率1200和1次写9次读的机率。
分析结论比率如下:

免费资源http://www.it55.com

* 如果 N = 0(意味着没有同步),系统大致可以处理每秒 1200/11 = 109 次写。
* 如果 N = 1,增加到每秒 184 次写。
* 如果 N = 8,增加到每秒 400 次写。
* 如果 N = 17,增加到每秒 480 次写。
* 最终,随着N接近无穷大(我们的预算为负无穷大),则可以达到几乎每秒 600 次写,大约提高系统吞吐量 5.5 倍。尽管如此,当有8台服务器时,已经提高了4倍了。

免费资源http://www.it55.com

注意,上面的计算是假设了网络带宽无穷大,并且忽略了一些系统中比较大的因素。在很多情况下,当系统增加 N 个同步slave之后,是无法精确计算出上述预计结果的。不过,先看看下列问题将有助于你知道是否有和有多少系统性能上的改善:

免费矢量图片素材下载http://www.it55.com

* 系统读/写得比率是多少?
* 减少读操作后一个服务器能增加处理多少写操作?
* 你的网络带宽足够给多少slave使用? sflj http://www.it55.com kg^&fgd

问:如何利用同步提供冗余/高可用性?
答:使用当前已经可用的特性,可以配置一个master和一个(或多个)slave,并且写一个脚本监控master是否运行着。然后通知应用程序和slave在发现错误时修改master。一些建议如下:

vd;k;l http://www.it55.com rdfg

* 使用 CHANGE MASTER TO 语句告诉slave修改master。
* 一个让应用程序定位master所在主机的办法就是给master使用动态DNS。例如bind就可以用 `nsupdate` 来动态更新DNS。
* 使用 --log-bin 选项,不使用 --log-slave-updates 选项来启动slave。这样就能让slave运行 STOP SLAVE; RESET MASTER 语句后随时准备变成master,并且在其他slave上运行 CHANGE MASTER TO。例如,有以下配置方案: 免费设计素材下载http://www.it55.com

WC
\
v
WC----> M
/ \
/ \
v v v
S1 S2 S3 http://www.it55.com

M 表示masetr,S 表示slave,WC表示提交读写操作的客户端;只提交读操作的客户端没有表示出来,因为它们无需切换。S1,S2,S3都是使用 --log-bin 选项,不用 --log-slave-updates 选项运行的slave。由于除非指定 --log-slave-updates 参数,否则从master读到的更新操作都不会记录到二进制日志中,因此每个slave上的二进制日志都是空的。如果因为某些原因 M 不能用了,可以指定一个slave作为master。例如,如果指定S1,则所有的WC都要重定向到S1上,S2和S3都需要从S1上同步。 http://www.it55.com

确定所有的slave都已经处理完各自的中继日志了。在每个slave上,提交 STOP SLAVE IO_THREAD 语句,然后检查 SHOW PROCESSLIST 的结果直到看到 Has read all relay log 了。当所有的slave都这样子之后,就可以按照新的方案设置了。在slave S1上提交 STOP SLAVE 和 RESET MASTER 语句将其提升为master。 免费网页模版下载http://www.it55.com

在其他slave S2和S3上,提交 STOP SLAVE 和 CHANGE MASTER TO MASTER_HOST='S1' ( 'S1' 代表S1的真实主机名) 语句修改master。把S2,S3如何连接到S1的参数(用户,密码,端口等)都附加到 CHANGE MASTER 后面。在 CHANGE MASTER 中无需指定S1的二进制日志文件名和偏移位置:因为 CHANGE MASTER 默认就是第一个二进制日志和偏移位置4。最后,在S2和S3上提交 START SLAVE 语句。 免费网页模版下载http://www.it55.com

然后让所有的WC都把他们的语句重定向到S1上。从这个时候开始,从所有的WC发送到S1上的更新语句都会写到S1的二进制日志中,它们包含了从M死掉之后发送到S1的全部更新语句。
配置结果如下: vd;k;l http://www.it55.com rdfg

WC
/ 精美韩国模版下载http://www.it55.com

WC M(unavailable)
\
\
v v
S1<--S2 S3
^
+-------+ 免费资源http://www.it55.com


当M又起来了之后,只需在M上提交和在S2和S3上的一样的 CHANGE MASTER 语句,将它变成一个slave并且读取自从它死掉之后的全部WC提交的更新操作。想要把M重新变成master(例如因为它的性能更好),就执行类似上面的操作,把S1当作失效了,把M提升为新的master。在这个步骤中,别忘了在把S2和S3修改成为M的slave之前在M上运行 RESET MASTER 语句。否则的话,它们会从M开始失效的那个时刻开始读取WC提交的更新操作日志。

(编辑:IT资讯之家 www.it55.com

返回顶部
共3页: 上一页 [1] 2 [3] 下一页  

网友评论

[以下评论为网友观点,不代表本站。请自觉遵守互联网相关政策法规,所有连带责任均有评论者自负。]
[不超过250字]