MySQL复制 -- 应用场景
本文行文路径如下:
什么是复制?复制是怎么工作的?复制有哪几种表现形式?复制能解决那些问题?业界有哪些数据同步解决方案?
什么是复制?
官方解释道:Replication enables data from one MySQL database server (the master) to be copied to one or more MySQL database servers (the slaves). Replication is asynchronous by default; slaves do not need to be connected permanently to receive updates from the master. Depending on the configuration, you can replicate all databases, selected databases, or even selected tables within a database.
那么简单来说:
1.复制就是从一个服务器把拷贝数据到另一个或者多个服务器;
2.默认情况下是以异步方式拷贝数据的;
3.从库也可以配置过滤器,以此达到应用它只关心数据的目的。
复制是怎么工作的?
首先主库记录所有 数据库更改操作(包括 updates, deletes, and so on)。
然后从库发出读取日志请求,主库接收到请求,主库根据发送过来的position信息并读取本地binlog,主库把读取到的binlog 加载到内存缓冲。(由dump thread 完成)
再然后从库拉取主库日志,进行简单的校验后写入本地的relay log,同时更新本地的postition信息。(由 I/O Thread 完成)
最后从库读取relay log 进行回放,并过滤掉自己不关心的内容进行应用。 (由 SQL Thread 完成)
注意 日志是 slave 主动从 Master 拉取日志,而不由 master 发送给 slave !! (it pulls the data from the master, rather than the master pushing the data to the slave)
复制有哪几种表现形式?
1.同步复制 事物必须在主库和备库同时提交成功
2.异步复制 MySQL默认就采用异步复制,主库提交的事物不需要等到从库接收到或者应用成功
3.半同步复制 在主库提交的事物会block主,直到得知至少一个备库成功接收到主库发送过来的日志事件或者等待超时,如果等待超时,此时半同步会转成异步。
同步,异步,半同步复制的比较:
同步复制:Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕。缺点:完成一个事务可能会有很大的延迟。
异步复制:当Slave准备好才会向Master请求binlog。缺点:不能保证一些事件都能够被所有的Slave所接收。
半同步复制:半同步复制工作的机制处于同步和异步之间,Master的事务提交阻塞,只要一个Slave已收到该事务的事件且已记录。它不会等待所有的Slave都告知已收到,且它只是接收,并不用等其完全执行且提交。
复制可以解决什么问题?
1.服务的高可用,备库可以提升为主库,减少down机时间,双主时承担HA角色
2.服务的高性能,备库可以做为查询,统计分析使用,分担主库负载,承担LB角色
3.延迟备库做为 数据备份恢复使用,应对误删除带来的数据不可恢复性
4.为不停服升级,提供了解决方案
5.为压力测量,性能测试提供了环境
数据同步方案有哪些?
- Oracle DataGuard (只能是Oracle DB 之间进行同步)
- Oracle GoldGate (支持异构数据库之间的同步)
- SymmetricDS ( 支持异构数据之间同步)
- Canal (阿里开源项目,目前只支持MySQL)
- otter (阿里开源项目,基于canal基础上修改,支持异构数据源)
附录:
初探复制你需要知道: http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html
Semi Sync : http://www.orczhou.com/index.php/2011/06/mysql-5-5-semi-sync-replication-setup-config/
otter : https://github.com/alibaba/otter/wiki/Introduction
canal : https://github.com/alibaba/canal