MySQL--复制

1.复制概述

MySQL 支持两种复制方式:

  基于行的复制。

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

  这两种方式都是通过在主库上记录二进制日志、在备库重放日志的方式来实现异步的数据复制。

MySQL 复制大部分是向后兼容的,新版本的服务器可以作为老版本服务器的备库,但反过来,将老版本作为新版本服务器的备库通常是不可行的,因为它可能无法解析新版本所采用的新的特性或语法,另外所使用的二进制文件的可是也可能不相同。

复制通常不会增加主库的开销,主要是启用二进制日志带来的开销,但出于备份或及时从崩溃中恢复的目的,这点开销也是必要的。除此之外,每个备库也会对主库增加一些负载(例如网络 I/O 开销),尤其当备库请求从主库读取旧的二进制日志文件时,可能会造成更高的 I/O 开销。另外锁竞争也可能阻碍事务的提交。最后,如果是从一个高吞吐量的主库上复制到多个备库,唤醒多个复制线程发送时间的开销将会累加。

通过复制可以将读操作指向备库来获得更好的读扩展,但对于写操作,除非设计得当,否则并不适合通过复制来扩展写操作。

当使用一主库多备库的架构时,可能会造成一些浪费,因为本质上它会复制大量不必要的重复数据。

1.1复制解决的问题

下面是复制比较常见的用途:

  数据分布

  负载均衡

  备份

  高可用性和故障切换

  MySQL 升级测试

1.2复制如何工作

总的来说,复制有三个步骤:

  1.在主库上把数据更改记录到二进制日志中。

  2.备库将主库上的日志复制到自己的中继日志中。

  3.备库读取中继日志中的事件,将其重放到备库数据之上。

2.配置复制

总的来说分为以下几步:

  1.在每台服务器上创建复制账号

  2.配置主库和备库

  3.通知备库连接到主库并从主库复制数据

2.1创建复制账号

MySQL 会赋予一些特殊的权限给复制线程。在备库运行的 I/O 线程会建立一个到主库的 TCP/IP 连接,这意味着必须在主库创建一个用户,并赋予其合适的权限。备库 I/O 线程以该用户名连接到主库并读取器二进制日志。通过如下语句创建用户账号:

1 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*
2 TO repl@'10.70.8.%' IDENTIFIED BY 'mysql';

2.2配置主库和备库

在主库的 my.cnf 文件中增加或修改如下内容:

1 log_bin=mysql-bin
2 server_id=10

必须明确地指定一个唯一的服务器 ID,默认服务器 ID 通常为 1。使用默认值可能会导致和其他服务器的 ID 冲突。

如果之前没有在 MySQL 的配置文件中指定 log-bin 选项,就需要重新启动 MySQL。为了确认二进制日志文件是否已经在主库上创建,使用

1 SHOW MASTER STATUS

命令,检查输出。

备库上也需要在 my.cnf 中增加类似的配置,并且同样需要重启服务器。

1 log-bin=mysql-bin
2 server_id=2
3 relay_log=/var/lib/mysql/mysql-relay-bin
4 log_slave_updates=1
5 read_only=1

2.3启动复制

这一步不要通过修改 my.cnf 来配置,而是使用 CHANGE MASTER TO 语句,该语句完全替代了 my.cnf 中相应的设置,并且允许以后指向别的主库时无需重启备库。下面是开始复制的基本命令:

1 change master to master_host='10.70.8.58',
2 master_user='repl',
3 master_password='mysql',
4 master_log_file='bin.000019',
5 master_log_pos=1067207908;

当执行完这条语句后,可以通过

1 SHOW SALVE STATUS;

语句来检查复制是否正确执行。

运行下面的命令开始复制

1 START SLAVE;

2.4从另一个服务器开始复制

大多数情况下有一个已经运行了一段时间的主库,然后用一台新安装的备库与之同步,此时这台备库还没有数据。

有几种办法来初始化备库或者从其他服务器克隆数据到备库。包括从主库复制数据、从另外一台备库克隆数据,以及使用最近的一次备份来启动备库,需要有三个条件来让主库和备库保持同步:

  在某个时间点的主库的数据快照

  主库当前的二进制日志文件,和获得数据快照时在该二进制日志文件中的偏移量,我们把这两个值称为日志文件坐标。通过这两个值可以确定二进制日志的位置。可以通过 SHOW MASTER STATUS 命令来获取这些值

  从快照时间到现在的二进制日志

下面是一些从别的服务器克隆备库的方法:

  使用冷备份

  使用热备份

  使用 mysqldump

  使用快照或备份

  使用 Percona Xtrabackup

  使用另外的备库

2.5推荐的复制配置

在主库上二进制日志最重要的选项是 sync_binlog

1 sync_binlog=1

如果使用 InnoDB,我们强烈推荐设置如下选项

1 innodb_flush_logs_at_trx_commit    #Flush every log write
2 innodb_support_xa=1                #MySQL 5.0 and newer only
3 innodb_safe_binlog                 #MySQL 4.1 only
1 log_bin=/var/lib/mysql/mysql-bin

在备库上,我们同样推荐开启如下配置选项,为中继日志指定绝对路径

1 relay_log=/path/to/logs/relay-bin
2 skip_slave_start
3 read_only

即使开启了所有上面建议的选项,备库仍然可能在崩溃后被中断,因为 master.info 和中继日志文件都不是崩溃安全的。默认情况下甚至不会刷新到磁盘,知道 MySQL 5.5 并且不介意额外的 fsync() 导致的性能开销,最好设置以下选项:

1 sync_master_info=1
2 sync_relay_log=1
3 sync_relay_log_info=1
原文地址:https://www.cnblogs.com/microcat/p/8005829.html