复制的基本知识
MySQL复制相对比较简单,就是将主数据库的DDL和DML操作通过二进制日志传到复制服务器(也叫从服务器)上,然后在从库
上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。需要注意的是,虽然所有数据库的二进制日志都混合在同样的文件中,复制时仍然可以通过参数仅将复制特定的数据库到从服务器,或仅复制特定的表到从服务器。具体可参考:
http://dev.mysql.com/doc/refman/5.1/en/replication-options-slave.html#option_mysqld_replicate-do-db
其他主要商业关系型数据库则提供更为复杂多样的分布式数据解决方案。例如SQL Server提供,
1,数据镜像。和MySQL一样通过在从节点上重做log实现,但只能有一个从节点。可以实现自动failover。
2,log shipping。和MySQL复制的实现和功能完全一致。
3,用快照实现的复制等等。
复制的好处有三方面:
1,如果主库出现问题,可以快速切换到从库提供服务。
2,可以在从库上执行查询操作,降低主库的访问压力。
3,可以在从库上执行备份,以避免备份期间影响主库的服务。
异步复制与半同步复制
在MySQL5.5之前,MySQL的复制是异步操作,即主库的更新操作不关心是否成功复制到了从库,只要主库的数据更新完成,就认为数据更新成功。因此主库和从库的数据之间存在一定的延迟,有数据丢失的隐患。为了解决这个问题,从5.5开始引入了半同步复制,当主库执行完commit提交操作后,并从其中一个从库上接受到Binlog事务并成功写入中继日志后,主库才返回commit操作成功给客户端。半同步复制保证了事务成功提交后,至少有两份日志记录,一份在主库的Binlog日志上,另一份在至少一个从库的中继日志上,从而进一步保证了数据的完整性。
复制架构
MySQL常用的复制架构有三种,分别是一主多从,多级复制和双主复制。下面分别说明:
- 一主多从
在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量对实时性要求不是特别高的读请求通过负载均衡分布到多个从库上,降低主库的读取压力。
- 多级复制
一主多从的架构能够解决大部分读请求压力特别大的场景,考虑到MySQL的复制是主库推送Binlog日志到从库,主库的IO压力和网络压力会随着从库的增加而增长(每个从库都会在主库上有一个独立的Binlog Dump线程来发送事件),而多级复制架构解决了一主多从场景下,主库额外的IO和网络压力。
如图所示,master1仅推送binlog到master2上,而由master2推送binlog到所有从库上,从而减轻了master1的压力。同时master2可以考虑使用blackhole存储引擎。
- 双主复制
双主复制特别适用于DBA需要做主从切换的场景。例如主数据库宕机,或人为停止主数据库做维护操作。这是一种类似热备机的架构。