目录
[toc]
概述
复制的问题解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。主库和备库之间可以有多种不同的组合方式。
两种复制方式:
基于行的复制和基于语句的复制。这两种方式都是通过在主库上记录二进制日志、在备库重放日志的方式来实现异步的数据复制。
复制通常不会增加主库的开销,主要是启用二进制日志带来的开销。除此之外,每个备库也会对主库增加一些负载(网络I/O开销)。
复制解决的问题
- 数据分布
可以随意的停止或开始复制,并在不同的地理位置来分布数据备份,例如不同的数据中心。即使在不稳定的网络环境下,远程复制也可以工作。 - 负载均衡
通过复制可以将读操作分布到多个服务器上,实现对密集型应用的优化,并且实现很方便,通过简单的代码修改就能实现基本的负载均衡 - 备份
对于备份来说,复制是一项很有意义的技术补充,但复制既不是备份也不能取代备份 - 高可用性和故障切换
复制能够帮助应用程序避免Mysql单点故障。 - Mysql升级测试
可以使用一个更高版本的Mysql作为备库,保证在升级全部实例前,查询能够在备库按照预期执行。
复制如何工作
- 在主库上把数据更改记录到二进制日志中。
在每次准备提交事务完成数据更新前,主库将数据更新的实践记录到二进制日志中。按照事务提交的顺序而非语句执行的顺序来记录二进制日志。在执行完记录二进制日志之后,主库会告诉存储引擎可以提交事务了。 - 备库将主库的日志复制到自己的中继日志中
备库将主库的二进制日志复制到其本地的中继日志中。首先,备库会启动一个工作现场。即I/O线程跟主库建立一个客户端连接,然后主库上启动一个特殊的二进制转储(binlog dump)线程,这个二进制转储线程会读取二进制日志中的事件,备库I/O线程将会接收到的事件记录到中继日志中。 - 备库读取中继日志的事件,将其重放到备库数据库之上
备库会启用sql线程,从中继日志中读取事件并在备库中执行,从而实现备库数据的更新。当SQL线程追赶上I/O线程时,中继日志通常已经在系统中缓存,所以中继日志的开销很低。SQL线程执行的事件也可以通过配置选项来决定是否写入其自己的二进制日志中。
总结:
这种复制架构实现了获取事件和重放事件的解耦,允许这两个过程异步进行。也就是说,I/O线程能独立于SQL线程工作,但这种架构也限制了复制的过程,其中最重要的一点是在主库上并发运行的查询在备库上只能串行化执行。
怎么配置复制架构
通常有三步:
- 在每台服务器上创建复制账号
mysql>GRANT REPLICATION SLAVE.REPLICATION CLIEENT ON *.* TO repl@'192.168.0.% ' IDENTIFIED BY 'password'
- 配置主库和备库
主库:需要打开二进制日志,并配置一个独一无二的服务器id,在my.cnf中修改
log_bin = mysql-bin
server_id=10
备库:
log_bin=msql-bin
server_id=2
relay_log=/var/lib/mysql/mysql-reply-bin (中继日志的位置和命名)
log_salve_updates=1 (允许备库将其重放的时间也记录到自身的二进制日志中)
read_only=1 (只读权限)
重启。
- 通知备库连接到主库并从主库复制数据。
使用CHANGE MASTER TO语句开始复制
mysql>CHANGE MASTER TO MASTER_HOST='server1',
>MASTER_USER='repl',
>MASTER_PASSWORD='password',
>MASTER_LOG_FILE='mysql-bin.000001',
>MASTER_LOG_POS=0
启动复制
mysql>START SLAVE
推荐的复制配置
- 在主库上二进制日志最重要的选项是sync_binlog:
sync_binlog=1
如果开启了该选项,Mysql每次在提交事务前会将二进制日志同步到磁盘中,保证服务器奔溃是不会丢失事件
复制的原理
基于语句的复制(逻辑复制)
基于语句的复制模式下,主库会记录哪些造成数据更改的查询,当备库读取并重放这些查询时,实际上只是把主库上执行过的SQL再执行一遍。
优点:
- 不会使用太多的带宽
- 实现相当简单,简单的记录和执行这些语句,就能保持主备同步
缺点:
很多情况下通过基于语句的复制模式无法正确复制。
基于行的复制
将实际数据记录到二进制日志中,跟其他数据库的实现比较相像。
优点:
- 几乎没有基于行的复制模式无法处理的场景
- 可以减少锁的使用
- 占用更少CPU
缺点:
- 找不到要修改的行时,基于行的复制可能会导致复制停止
复制拓补
可以在任意的主库和备库之间建立复制,只有一个限制:每一个备库只能有一个主库。
基本原则:
- 一个Mysql备库实例只能由一个主库
- 每个备库必须有一个唯一的服务器ID
- 一个主库可以有多个备库
- 如果打开了log_salve_updates选项,一个备库可以把其主库上的数据变化传播到其他备库
常用的拓补结构:
- 一主库多备库
- 主主复制
- 环形复制
- 主库-分发主库-多个备库
- 树形
网友评论