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的工作原理
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 stop172.25.85.2 server2.example.com master172.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_installationSecuring 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.sqltime mysqlpump --default-parallelism=2 --compress-output=lz4 westos > testtime mysqlpump -pZhang+001 --default-parallelism=2 --compress-output=lz4 westos > test2time mysqlpump -pZhang+001 --default-parallelism=2 westos > test3