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