##mysql主从复制概述
MySQL 5.7支持多种不同的复制方法。传统的方法是基于master的二进制日志,并要求在他们的日志文件和位置是同步的。新方法基于全局事务标识符(gtids)是事务性的,因此不需要在这些日志文件或位置信息就可工作,大大简化了许多常见的复制任务。复制使用gtids保证master和slave之间的一致性,在master提交的所有事务,同时也将被应用于slave。
MySQL的复制,支持不同类型的同步方式。原始的同步类型是单向的,异步复制,其中一个服务器充当主服务器,而一个或多个其他服务器充当从服务器。与之相反,mysql集群,是基于同步复制的。
MYSQL 5.7还支持半同步复制。使用半同步复制,在MASTER中提交一个事务,将会阻塞其他事务的执行,直到至少一个SLAVE确认已经收到并且记录了这个事务。
MYSQL 5.7还支持延迟复制。即可以指定一个时间,让SLAVE延后于MASTER执行。
有两种重要的复制格式:基于语句的复制(SBR),复制整个SQL语句 和 基于行的复制(RBR),只复制改变了的行。
可以设置一系列的参数配置,以更好的按需要执行复制。
##配置复制
##一.建立基于二进制日志文件位置的复制 Setting Up Binary Log File Position Based Replication
这里将介绍如何建立一个MySQL服务器使用二进制日志文件的位置为基础的复制。有许多不同的设置复制的方法,使用的确切方法取决于您如何设置复制,以及是否已经在MASTER数据库中有数据。
以下是一些通用的设置: 1.在MASTER中,必需启用binary log二进制日志,并且配置一个唯一的server-id 2.每个要连接到MASTER的SLAVE服务器,需要配置一个唯一的server-id 3.在MASTER上配置一个帐户,供SLAVE连接MASTER时使用 4.在导入MASTER的数据或者启动复制进程之前,需要在MASTER中记录下当前二进制日志文件及位置等信息。配置SLAVE,需要这些信息,这样SLAVE才知道从MASTER的什么位置开始进行复制。 5.如果MASTER中才在数据,并且你想同步这些数据到SLAVE,你需要创建这些数据的拷备。使用的mysql存储引擎对拷备数据的拷备方式有影响。如果使用非事务型存储引擎,如MyISAM,首先要获取一个READ LOCK锁,然后获取二进制文件,位置等信息,之后导出数据。此期不能执行写入操作。如果此期间有数据写入操作,将导致主从的不一致性。如果是使用INNODB,可以不需要READ LOCK锁,使用相关语句就可以导出数据。
以下是主从详细的配置说明
1.配置MASTER主服务器 vi /etc/my.cnf,增加以下内容
[mysqld]
log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
2.在MASTER中创建MYSQL帐户,用于供SLAVE连接 为了安全,该MYSQL帐户,仅提供 REPLICATION SLAVE权限。
mysql> CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';
3.获取MASTER中二进制日志文件及位置信息 如果之前没有二进制的相关信息,SLAVE中可以指定二进制日志文件名为’‘,位置4。 1).启动一个客户会话,连接MASTER,执行如下语句,注意!会阻塞事务的提交。
mysql> FLUSH TABLES WITH READ LOCK;
2)启动另一个客户端会话,连接MASTER,执行
mysql > SHOW MASTER STATUS;
显示结果如下,File为二进制日志文件名mysql-bin.000003,Position为位置信息73
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73 | test | manual,mysql |
+------------------+----------+--------------+------------------+
3).设置从服务器 mysql> CHANGE MASTER TO -> MASTER_HOST=’master_host_name’, -> MASTER_USER=’replication_user_name’, -> MASTER_PASSWORD=’replication_password’, -> MASTER_LOG_FILE=’recorded_log_file_name’, -> MASTER_LOG_POS=recorded_log_position;
4)启动从服务器 START SLAVE;
4.获取MYSQL的数据拷备
##使用全局事务标识符(GTIDS)的复制 Replication with Global Transaction Identifiers
当使用GTIDS,源服务器的每个事务都可以被唯一识别和跟踪,这意味着不再需要依赖于二进制日志文件和位置信息,就可以启动一个SLAVE。这将极大的简化了相关操作。因为GTID的复制完全是事务依赖的。可以很容易的分辨MASTER/SLAVE是否一致。MASTER的所有commit操作都将应用于SLAVE,两者间的一致性是有保证的。可以使用基于语句或者基于行的复制。但是推荐使用基于选的格式。
##GTID概念
##MYSQL多源复制 多源复制是在mysql 5.7.6及之后的版本被引进的 多源复制使你能够并行即时的从多个MASTER中进行并行复制。 MYSQL多源复制,让一台slave能够同时从多台源服务接收事务,可以用来备份多台服务器的数据到一台服务器,合并表碎片,合并计算等。每台slave需要一个单独的通信管道channel,用来与master通信。
多源复制配置
多源复制既可以使用基于GTID的复制也可以使用基于二进制日志文件及位置的复制。 使用多源复制,需要将中继状态信息存储到TABLE表中。配置如下
1.配置文件如下
server-id = 3
master_info_repository =TABLE
relay_log_info_repository = TABLE
socket = /tmp/mysql.sock3
port = 3308
pid-file = mysqld.pid
datadir = /usr/local/mysql/data3
user = mysql
2.假定存在2台master主服务器,分别进行如下设置
CHANGE MASTER TO MASTER_HOST='localhost', MASTER_USER='root', MASTER_PORT=3306, MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql_binary_log.000002', MASTER_LOG_POS=4053 FOR CHANNEL 'master-1';
CHANGE MASTER TO MASTER_HOST='localhost', MASTER_USER='root', MASTER_PORT=3307, MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql_binary_log.000001', MASTER_LOG_POS=4044 FOR CHANNEL 'master-2';
3.启动SLAVE服务器
以下命令启动所有通信管道
START SLAVE ;
以下命令启动特定的通信管道
START SLAVE FOR CHANNEL "master-1";
4.停止,重置SLAVE
STOP SLAVE;
STOP SLAVE FOR CHANNEL "master-1";
RESET SLAVE;
RESET SLAVE FOR CHANNEL "master-1";
##参考 dev.mysql.com/doc/refman/5.7/en/replication.html dev.mysql.com/doc/refman/5.7/en/replication-configuration.html