五、Mysql复制

2020-07-13  本文已影响0人  这个程序猿不太冷

目录
[toc]

概述

复制的问题解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。主库和备库之间可以有多种不同的组合方式。
两种复制方式:
基于行的复制和基于语句的复制。这两种方式都是通过在主库上记录二进制日志、在备库重放日志的方式来实现异步的数据复制。
复制通常不会增加主库的开销,主要是启用二进制日志带来的开销。除此之外,每个备库也会对主库增加一些负载(网络I/O开销)。

复制解决的问题

复制如何工作

  1. 在主库上把数据更改记录到二进制日志中。
    在每次准备提交事务完成数据更新前,主库将数据更新的实践记录到二进制日志中。按照事务提交的顺序而非语句执行的顺序来记录二进制日志。在执行完记录二进制日志之后,主库会告诉存储引擎可以提交事务了。
  2. 备库将主库的日志复制到自己的中继日志中
    备库将主库的二进制日志复制到其本地的中继日志中。首先,备库会启动一个工作现场。即I/O线程跟主库建立一个客户端连接,然后主库上启动一个特殊的二进制转储(binlog dump)线程,这个二进制转储线程会读取二进制日志中的事件,备库I/O线程将会接收到的事件记录到中继日志中。
  3. 备库读取中继日志的事件,将其重放到备库数据库之上
    备库会启用sql线程,从中继日志中读取事件并在备库中执行,从而实现备库数据的更新。当SQL线程追赶上I/O线程时,中继日志通常已经在系统中缓存,所以中继日志的开销很低。SQL线程执行的事件也可以通过配置选项来决定是否写入其自己的二进制日志中。

总结:
这种复制架构实现了获取事件和重放事件的解耦,允许这两个过程异步进行。也就是说,I/O线程能独立于SQL线程工作,但这种架构也限制了复制的过程,其中最重要的一点是在主库上并发运行的查询在备库上只能串行化执行

怎么配置复制架构

通常有三步:

  1. 在每台服务器上创建复制账号
    mysql>GRANT REPLICATION SLAVE.REPLICATION CLIEENT ON *.* TO repl@'192.168.0.% ' IDENTIFIED BY 'password'
  2. 配置主库和备库

主库:需要打开二进制日志,并配置一个独一无二的服务器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 (只读权限)

重启。

  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

推荐的复制配置

  1. 在主库上二进制日志最重要的选项是sync_binlog: sync_binlog=1
    如果开启了该选项,Mysql每次在提交事务前会将二进制日志同步到磁盘中,保证服务器奔溃是不会丢失事件

复制的原理

基于语句的复制(逻辑复制)

基于语句的复制模式下,主库会记录哪些造成数据更改的查询,当备库读取并重放这些查询时,实际上只是把主库上执行过的SQL再执行一遍。
优点:

缺点:
很多情况下通过基于语句的复制模式无法正确复制。

基于行的复制

将实际数据记录到二进制日志中,跟其他数据库的实现比较相像。
优点:

缺点:

复制拓补

可以在任意的主库和备库之间建立复制,只有一个限制:每一个备库只能有一个主库。
基本原则:

常用的拓补结构

上一篇 下一篇

猜你喜欢

热点阅读