MySQL5.7复制功能
MySQL复制是异步的,所以肯定有延迟
MySQL复制可以是整个实例进行复制,也可以对实例中的某个库或是某个表进行复制
Master端
–binlog-do-db 哪些库要进行binlog写操作
–binlog-ignore-db 哪些库不需要进行binlog写操作
Salve端
–replicate-do-db
–replicate-ignore-db
–replicate-do-table
–replicate-ignore-table
–replicate-wild-do-table
–replicate-wild-ignore-table
复制类型
存在两种复制类型:
1 基于二进制日志的复制
2 使用GTID完成基于事务的复制
在以前的mysql版本中,读写分离的实现一般都是基于日志的主从复制实现的,这样会产生一个问题,就是master宕机之后,slave由于同步延时的问题,会导致master和slave内容不同,甚至会多个slave之间互相不同。所以为了解决这个问题,再mysql5.7.6版本之后加入了基于GTID的事务控制,具体的说就是每个事务由一个唯一的gtid标识,当slave都成功执行之后master才写入硬盘完成该事务,如果master突然宕机,那么就自动回滚。数据的一致性得到保证。
半同步复制
MySQL支持半同步复制
实现基于事务GTID的复制
在gtid模式下,可以自动定位master binlog的文件名和行数,所以省去了去master服务器查看的麻烦。只要master和slave数据首先一模一样(通过mysqldump导入),同时master没有任何操作(需要将3306上所有连接都断开)。然后直接使用change master命令即可。详细过程如下
1、Master的配置还和上面一样。需要打开binlog,并开启enforce_gtid_consistency和gtid_mode(如果嫌每次启动master都要手动开启太麻烦,那么就把这两项写到my.cnf中,上面有提到)
2、Slave的配置文件my.cnf中加入
enforce_gtid_consistency = ON
gtid_mode = ON
并且别忘了修改serverid
server-id = 2
启动之后,通过change master语句设置master的IP地址,无需设置binlog的位置和行数,只需保证目前的库和master库内容一致即可
change master to master_host=’Master的IP地址’,
-> master_user=’dba’,
-> master_password=’123456′
start slave;
然后再检查一下是否都是yes即可
mysql> show slave status \G
实践
准备工作
准备好两台linux服务器,ip为192.168.0.220及221,均搭建好lnmpa环境,mysql版本均为5.7.22
配置MySQL
220为master,221为slave
220部分配置如下:
log-bin=mysql-bin
binlog_format=mixed
server-id = 1
expire_logs_days = 10
early-plugin-load = ""
enforce_gtid_consistency=ON
gtid_mode=ON
221部分配置如下
#log-bin=mysql-bin
#binlog_format=mixed
server-id = 2
replicate-do-db = test
expire_logs_days = 10
early-plugin-load = ""
enforce_gtid_consistency = ON
gtid_mode = ON
修改后重启220和221的mysql服务
创建进行复制的账号
mysql> CREATE USER 'repl'@'192.168.0.221';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.221'
-> ;
准备数据
220复制操作
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> create table test_repl( num int );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test_repl values(3),(2),(4),(45);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
# 导出sql文件
[root@localhost ~]# mysqldump -uroot -p --single-transaction --master-data=2 test > test.sql
Enter password:
# 将sql文件复制到221服务器上
[root@localhost ~]# scp test.sql root@192.168.0.221:/root/
221服务器操作
[root@localhost ~]# mysql -uroot -p < test.sql
Enter password
开启主从复制功能
mysql> change master to
-> master_user='repl',
-> master_host='192.168.0.220',
-> master_password='',
-> master_log_file='mysql-bin.000008',
-> master_log_pos=1545;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.220
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000008
Read_Master_Log_Pos: 1545
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试复制功能
220服务器插入数据
mysql> use test;
Database changed
mysql> insert into test_repl values(3),(32),(3232);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
221上看数据有没有同步
mysql> select * from test_repl;
+------+
| num |
+------+
| 3 |
| 2 |
| 4 |
| 45 |
| 3 |
| 32 |
| 3232 |
+------+
7 rows in set (0.00 sec)