一、 介绍
Mysql的复制功能是构建基于SQL数据库的大规模高性能应用的基础,主要用于分担主数据库的读负载,同时也为高可用、灾难恢复、备份等工作提供了更多的选择。
二、为什么要使用mysql复制功能?
大家也许知道对于数据库进行扩展是一件非常困难的事情,这一点和web服务器具有很大的不同,如果我们的网站出现大量的突增访问,web服务器的压力增加,性能下降的时候,我们只需要简单的多增加几台web服务器,只要其上部署的程序完全一样就可以很好的分担这些负担,但是数据库却不同。由于数据库中对数据的事务性要求,就决定了我们不能简单的通过增加数据库服务器的方式来分担数据库的读写负载,而mysql的复制功能,为我们提供了一种可以分担数据库读负载的好办法,注意这里呢,我只说了是读负载,因为事实上只做简单的复制,还是无法分担写负载的,我们可以使用复制功能对数据库服务器进行水平扩展,为数据库服务器增加一个备库或多个备库,而这些备库就可以用于分担主数据库的读负载,同时复制功能也为高可用、灾难恢复、备份等工作提供了更多的选择。
三、mysql复制解决了什么问题?
a、实现在不同服务器上的数据分布
也可以实现不同idc机房的数据库分布。
mysql的功能是基于主库上的二进制日志,然后在备库上重放这些日志的方式来完成的。从这我们可以知道两点:
1、mysql复制是异步的,这也意味着在同一时间点上备库上的数据呢,可能与主库存在不一致的地方,并且无法保证主库和备库间的延迟,影响主库延迟的因素有很多,具体后续文章都会提到,不过虽然延迟无法避免,但是毫无疑问,mysql复制提供了一种提高数据库的性能的方法。
2、因为是利用二进制日志,所以在通常情况下不需要太多的带宽,特别是在基于语句的复制时所需要带宽的就更少了。但使用基于行的复制来进行大批量的更改时,可能会对那种带宽带来一定的压力,特别是在跨IDC环境下进行复制。所以对于这种大批量的数据修改,在任何情况下都应该是分批来进行的,
b、实现数据读取的负载均衡
这种读的负载均衡需要其它组件配合完成。比如可以利用DNS轮询的方式把程序的读连接到不同的备份数据库,或是利用LVS,haproxy这样的代理方式都可以达到这种读负载均衡的目的。关于读写分离和负载均衡,后面我会有文章详细讲解。
c、增强的数据安全性
mysql的复制是非共享架构,同样的数据分布在多台服务器上,所以增加了数据的安全性。
我们还可以利用备库进行数据库备份的工作来减少主库复制,但注意复制并不能代替备份,因为备份和复制所做的工作是不同的,如果我们不小心在主库上错误的删除或是修改了数据,由于备库通常来说很小,所以很难使用备库的数据对错误的删除或修改的数据进行恢复。
要在这种情况下对数据进行恢复只能依靠备份来完成,所以大家千万不要以为做了复制之后就不用备份了,数据库备份在任何时候都是非常重要的。
d、实现数据库高可用和故障切换
备份的另一个重要作用就是让我们可以方便的进行数据库的高可用架构的部署,避免mysql单点故障。后续文章会有详细讲解。
e、实现数据库在线升级
我们可以使用一个高版本的数据库来作为主库的备库,这样在配置高可用工具的时候就可以在很短的时间内完成这种数据库的在线升级。
同时,也可以测试高版本的mysql和我们现有的程序是否兼容。
四、结尾
在对复制进行具体介绍之前,我们先来看mysql二进制日志的一些问题,只有理解了二进制日志的记录方式,我们才能更好的对mysql复制进行部署和优化。
下一篇文章我会对二进制日志文件做介绍,请关注。
本篇文章总结于慕课网《MySQL性能管理及架构设计》课程