mysql的主从复制是指从一个mysql主服务器(MASTER)将数据复制到另一台或多台mysql从服务器(SLAVE)的过程,将主数据库的DDL和DML操作通过二进制日志传到复制服务器上,然后在从服务器上对这些日志重新执行,从而使从服务器的数据保持同步。
     首先,主服务器会记录二进制日志,每个事务更新完毕数据之前,主服务器将这些操作的信息记录在二进制日志里面,在事件写入二进制日志完成后,主服务器 通知存储引擎提交事务。
    SLAVE上面的I/O进程连接上MASTER,并发出日志请求,MASTER接收到来自SLAVE的I/O进程的请求后,通过负责复制的I/O进程根据请求信息读取指定日志位置之后的日志信息,返回给SLAVE的I/O进程。SLAVE的I/O进程接收到信息后,将接收到的日志内容依次添加到SLAVE端的relay-log文件的最末端,并将读取到的MASTER端的binlog文件名和位置记录到master-Info文件中
     SLAVE的SQL进程检测到relay-log中新增了内容后,会马上解析relay-log的内容成为在master端真实执行时候的那些可执行内容,并在自身执行。

GTID的工作原理

1、当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
2、binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置
gtid_next变量,即告诉Slave,下一个要执行的GTID值。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,   在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

 
准备工作:

/etc/init.d/iptables stop

172.25.85.2  server2.example.com  master
172.25.85.3  server3.example.com  slave
    [server2和server3]上:
1.tar xf mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar
 
   yum install mysql-community-client-5.7.11-1.el6.x86_64.rpm 

                   mysql-community-common-5.7.11-1.el6.x86_64.rpm  

                   mysql-community-server-5.7.11-1.el6.x86_64.rpm 

                   mysql-community-libs-5.7.11-1.el6.x86_64.rpm  -y

  /etc/init.d/mysqld start
  less   /var/log/mysqld.log                                 ##在mysql的日志中有数据库的初始密码
  mysql_secure_installation
Securing the MySQL server deployment.
Enter password for user root:                      

                                                 ##输入在日志中查找到的初始密码,并设置新的密码 Zhang+001

       [ server2]:
   vim /etc/my.cnf

server-id=1                           ##必须为 1 到 232–1 之间的一个正整数值log-bin=mysql-bin                     ##启动二进制日志系统

 /etc/init.d/mysqld restart

   mysql -p                          ##密码为Zhang+001
   grant replication slave on *.*  to jing@172.25.85.3  identified  by 'Zhang+001';  

                                                                                       ##数据库的密码

   show master status;

  

    server3:
   vim /etc/my.cnf

server-id=2

   /etc/init.d/mysqld restart

   mysql -p
   change master to master_host='172.25.85.2',master_user='jing',master_password='Zhang+001',master_log_file='mysql-bin.000001',master_log_pos=447 ;
   start slave;
   show slave status\G;
 
检测: 一边做一边同步 

   server2:

   mysql -pZhang+001
   create database westos;
   create table usertb( username varchar(50) not null, passwd varchar(25)  not null);
   insert into usertb value('user1','11111');

   server3:

2.   server2:
   vim /etc/my.cnf
增加:

gtid-mode=on                    ##开启gtid功能enforce-gtid-consistency=on ##强制gtid一致性,开启后对于特定create table不被支持

  /etc/init.d/mysqld restart

     mysql  -p
     use westos;
     drop table usertb;
 
    server3:
 
   mysql  -p
   stop slave;
   change master to master_host='172.25.85.2',master_user='jing',master_password='Zhang+001',master_auto_position=1;
 
   vim /etc/my.cnf
增加:

gtid-mode=onenforce-gtid-consistency=on

  /etc/init.d/mysqld restart

   mysql  -p
   start slave;
   show slave status\G;
 
 
   server2:
  mysql -pZhang+001
  use westos  
  create table usertb(username varchar(25) not null, password  varchar(25) not null);
  insert into usertb value('user1','11111');
   server3:
   mysql -pZhang+001
   select * from usertb;
   
3.   server3:
     vim /etc/my.cnf

开启enhanced multi-threaded slave根据如下设置:

增加:slave-parallel-type=LOGICAL_CLOCKslave-parallel-workers=16master_info_repository=TABLErelay_log_info_repository=TABLErelay_log_recovery=ON

    开启MTS功能后,务必将参数master_info_repostitory设置为TABLE,这样性能可以有50%~80%的提升。这是因为并行复制开启后对于元master.info这个文件的更新将会大幅提升,资源的竞争也会变大。

   若将slave_parallel_workers设置为0,则MySQL 5.7退化为原单线程复制,但将slave_parallel_workers设置为1,则SQL线程功能转化为coordinator线程,但是只有1 个worker线程进行回放,也是单线程复制。

    /etc/init.d/mysqld restart

    show slave  status;

    show processlist;

  server2:
  mysql -pZhang+001
  use westos;
  drop table usertb;
  mysql -pZhang+001  westos< add.sql
  mysql -pZhang+001
  use westos;
  select * from usertb;        
  call test2;                           
    server3:
    mysql  -p
    show slave  status\G;           ##不断的查询进度
       server2:
time mysqldump -pZhang+001 westos> westos.sql
time mysqlpump --default-parallelism=2  --compress-output=lz4 westos > test
time mysqlpump  -pZhang+001  --default-parallelism=2  --compress-output=lz4 westos > test2
time mysqlpump  -pZhang+001  --default-parallelism=2   westos > test3