欢迎访问我的博客,你的支持,是我最大的动力!

MySQL5.7复制功能实战,基于事务的复制,多源复制和多线程复制配置

Mysql-笔记 小马奔腾 13425℃ 评论
目录:
[显示]

这篇是幕课网-MySQL5.7复制功能实战视频教程的学习笔记。http://www.imooc.com/learn/589

第1章 MySQL复制基础

MySQL是异步复制

采取针对特定用户的读写分离,可以实现假无延迟。

MySQL复制是基于binlog日志进行的。存在三种日志格式:

  1. statement格式           存储SQL语句,存储日志量最小
  2. row格式                     存储event数据,日志量大,不能直接进行读取
  3. mixed格式                 建议生产环境使用该格式

MySQL复制可以是整个实例,也可以是实例中的某个库或某个表

Master端:
--binlog-do-db
--binlog-ignore-db

Slave端:
--replicate-do-db
--replicate-ignore-db
--replicate-do-table
--replicate-ignore-table
--replicate-wild-do-table
--replicate-wild-ignore-table

数据过滤控制通常在Slave端进行,因为Master端的修改需要重启数据库实例,而Slave端就会容易操作得多,并且Slave端的控制更细

复制类型:
基于二进制日志的复制,重点关注的是主的二进制日志文件名和复制点,一主多从进行主备互换时,确认日志复制点比较麻烦
使用GTID完成基于事务的复制[MySQL5.7成熟],全局事务标识符,由主机标志和自增ID组成,推荐

MySQL支持半同步复制,通过插件实现,Master阻塞事务的提交,只有当收到Slave确认收到日志的消息后,再进地提交。第一张图为MySQL5.6,第二张图为MySQL5.7

第2章 实现基于日志点的复制

实验环境:

Node1:192.168.3.100  5.7.9   Master
Node2:192.168.3.101  5.7.9   Slave
A在Master端建立复制用户
grant replication slave on *.* to 'dba'@'192.168.3.%' identified by '123456';     #老式写法
show warning;
drop user dba@'192.168.3.%';
select user,host from mysql.user;
create user 'dba'@'192.168.3.%' identified by '123456';     #先建立用户
grant replication slave on *.* to dba@'192.168.3.%';    #对用户进行授权
show databases;
create database dba;
use dba
create table t(id int,c1 varchar(10),primary key (id));
insert into t values(1,'aa'),(2,'cc'),(3,'dd');
select * from t;
B备份Master端的数据,并在Slave端恢复
mysqldump --single-transaction --master-data=2 --triggers --routines --all-databases -uroot -p > all.sql
--single-transaction保证事务完整性
--master-data 为1时不注释,为2时注释
--triggers  如果有触发器加上触发器
--routines  存储过程函数
--all-databases  备份所有数据
scp all.sql root@192.168.3.101:/root
mysql -uroot -p < all.sql
more all.sql 查看Master二十制文件名和日志点(--master-data=2的功劳)mysql-bin.000004 POS=1687
C使用change master命令配置复制

change master to
master_host='192.168.3.100',
master_user='dba',
master_password='123456',
master_log_file='mysql-bin.000004',
master_log_pos=1687;
change master to master_host='192.168.3.100',master_user='dba',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=1687;
show slave status \G
start slave;
iptables -L
/etc/init.d/iptables stop      #关闭防火墙

主从管理的系统视图

use performance_schema;
show tables;
replication_applier_configuration    通道名称和主动延迟时间,比如1小时(3600秒),那么从需要1小时后才会同步数据,有1小时的反悔期
配置:stop slave;change master to master_delay=3600;start slave;
replication_applier_status  显示通道名称,服务状态,下一次同步剩余时间[主动延迟]
replication_applier_status_by_coordinator  多线程复制
replication_applier_status_by_worker   工作线程,线程状态信息  show processlist;
replication_connection_configuration    连接配置信息,主机、端口、用户等
replication_connection_status   连接状态  show slave status;
replication_group_member_stats
replication_group_members

第3章 如何在线变更复制类型

在线将基于日志的复制变更为基于事务的复制[仅5.7版本]

先决条件:
集群中所有服务器版本均高于5.7.6    #show variables like '%version%';
集群中所有服务器gtid_mode都设为off   #show variables like 'gtid_mode';
处理步骤【主/备】:
set @@global.enforce_gtid_consistency=warn;   #修改后需要查看mysql-error.log日志信息,只有在没有报错的情况下,才能进行下一步操作
set @@global.enforce_gtid_consistency=on;
set @@global.gtid_mode=off_permissive;   #修改后需要查看mysql-error.log日志信息,只有在没有报错的情况下,才能进行下一步操作
set @@global.gtid_mode=on_permissive;
show status like 'ongoing_anonymous_transaction_count';   #应为空值或者0值,其实就是基于日志点的复制的数量
set @@global.gtid_mode=on;
show variables like 'gtid_mode';     #核对均为ON的状态
stop slave;
change master to master_auto_position=1;
start slave;
show slave status;     #在备上查看状态,应有Executed_Gtid_Set项,并有值
同时,将gtid-mode=on和enforce-gtid-consistency=on写入my.cnf配置文件中,以使服务重启后能自动进入gtid模式

变更复制类型之后管理视图的变化

use performance_schema;
show tables like 'replication%';
select * from replication_connection_configuration \G       #AUTO_POSITION=1
select * from replication_connection_status  \G    #UUID值

在线将基于事务的复制变更为基于日志的复制[仅5.7版本]

先决条件:
集群中所有服务器版本均高于5.7.6    #show variables like '%version%';
集群中所有服务器gtid_mode都设为on   #show variables like 'gtid_mode';
处理步骤【主/备】:
stop slave;
change master to master_auto_position=0,master_log_file='filename',master_log_pos=1212;
start slave;
set @@global.gtid_mode=on_permissive;
set @@global.gtid_mode=off_permissive;
select @@global.gtid_owned;   #应为空字符串之后,才能进行下一步的操作
set @@global.gtid_mode=off;
set @@global.enforce_gtid_consistency=off;
同时,去掉my.cnf配置文件中gtid-mode=on和enforce-gtid-consistency=on项目,以使服务重启后服务正常

第4章 如何使用多源复制

多源复制也就是多Master复制,允许一个Slave对应多个Master

可以用在跨实例的查询上

change master to option,[option]...[channel_option]
option:
master_bind='interface_name'
master_host='host_name'
master_user='user_name'
master_password='password'
master_port=port_num
master_connect_retry=interval
master_retry_count=count
master_delay=interval
master_heartbeat_period=interval
master_log_file='master_log_name'
master_log_pos=master_log_pos
channel_option:
for channel channel

实验环境:

Node1:192.168.3.100  5.7.9   Master
Node2:192.168.3.101  5.7.9   Slave
Node3:192.168.3.102  5.7.9   Master   数据库N3,表t3
三台服务器均使用的是基于事务的模式,即show variables like 'gtid_mode';  结果为ON
【Node3 Master】
create database N3;
use N3
create table t3(id int,c1 varchar(10),c3 varchar(10),primary key (id));
show create table t3;
insert into t3 values(1,'aa','bb'),(2,'cc','dd');
select * from t3;
create user dba@'192.168.3.%' identified by '123456';    #创建复制用户
grant replication slave on *.* to dba@'192.168.3.%';     #为用户赋权
【Node2 Slave】
change master to
master_host='192.168.3.102',
master_user='dba',
master_password='123456',
master_auto_position=1 for channel 'N3';
show slave status \G
start slave for channel 'n3';
show slave status \G
错误,因为Node1和Node3都建有dba用户,所以出错,以下是解决方法:
stop slave;
use mysql
select user,host form user;
drop user dba@'192.168.3.%';
start slave;
show slave status \G    #正常,此时有两条记录,对应两个Master
show databases;  #此时复制正常

管理视图的变化:

【Node2 Slave】
use performance_schema;
show tables like 'replication%';
select * from replication_applier_configuration;  #显示两行
select * from replication_applier_status;  #显示两行
select * from replication_applier_status_by_coordinator \G
select * from replication_connection_configuration \G     #显示两行
select * from replication_connection_status \G     #显示两行

第5章 如何使用多线程复制

解决延时问题,在MySQL5.6中就已提供,但是一个线程仅能针对一个数据库。5.7中进行了增强,不再一个线程只能针对一个数据库。

使用:
在Slave服务器上停止所有链路的复制
set global slave_parallel_type='logical_clock';  #别一种类型是‘database’即5.6版本中的类型
set global slave_parallel_workers=4;    #设置并发的工作线程数量
start slave;

实际配置:

多线程复制只需要在slave中配置就可以了
show variables like 'slave_parallel%';
stop slave;
set global slave_parallel_type='logical_clock';
set global slave_parallel_workers=4;
start slave;
show processlist;
show slave status \G
视图查看:
use performance_schema
select * from replication_applier_status_by_coordinator;  #以前是空,现在有两条记录,控制器
select * from replication_applier_status_by_worker;   #8行,每行为一个线程

转载请注明:轻风博客 » MySQL5.7复制功能实战,基于事务的复制,多源复制和多线程复制配置

喜欢 (0)or分享 (0)