目录:
【0】实验需求
级联复制,201为主库,202为从库/同时为203的主库,203为202的从库
【1】实验环境
级联:A->B->C
实践思路:
(1)直接拿A的xtrabackup的全备到 B和C 还远即可
(2)然后设置gtid_purged,最后change master 即可;
【2】操作
【2.0】配置文件 my.cnf
【2.1】在主库201创建复制用户
【2.2】在主库201创建测试数据
【2.3】备份与还原
【2.4】构建级联主从复制
【2.5】核验
【3】多主一从
正文:
【0】实验需求
级联复制,201为主库,202为从库/同时为203的主库,203为202的从库
一般建议2级级联,如上描述,不建议更多层次。
【1】实验环境
操作系统:CentOS 7.5
数据库版本:MySQL 5.7.24
数据库架构:主从复制,基于主库搭建3个从库,采用Xtrabackup + GTID + 无损同步复制
A:主库IP:192.168.1.201 port:3306
B:主库/从库IP:192.168.1.202 port:3306
C:从库IP:192.168.1.203 port:3306
级联:A->B->C
简单思路:
(1)B用A的全备初始化,然后B先作为从库连上主库A。
(2)等B至少产生一个gtid事务后,停止B的 io线程,然后全备B 以初始化C。
(3)C用B的全备来初始化后,再配置B->C的主从
实践思路:
(1)直接拿A的xtrabackup的全备到 B和C 还远即可
(2)然后设置gtid_purged,最后change master 即可;
【2】操作
【2.0】配置文件 my.cnf
#replication_new log_bin=/mysql/log/3306/mysql-bin #开启binlog log_bin_index=/mysql/log/3306/mysql-bin.index binlog_format=row binlog_rows_query_log_events=on max_binlog_size=2048 bind-address=0.0.0.0 server_id=2013306 #从库务必记得修改 expire_logs_days=7 #超过7天的binlog清理 innodb_support_xa=1 binlog_cache_size=1M log_bin_trust_function_creators=1 #同步存储过程、函数、触发器 innodb_flush_log_at_trx_commit=1 sync_binlog=1 transaction-isolation=read-committed #slave parameter 如果是从库,务必放开 #relay_log=/mysql/log/3306/relaylog/mysql-relay.log #read_only=1 #slave-parallel-type=LOGICAL_CLOCK #slave-parallel-workers=4 #master_info_repository=table #master_info 会记录到 mysql.slave_master_info #relay_log_info_repository=table #relay_log 会记录到,mysql.slave_relay_log_info #relay_log_recovery=1 #slave_skip_errors=ddl_exist_errors #slave_preserve_commit_order=1 #5.7的增强半同步 #如果是5.7,参数前面加上loose_,如下列,如果是5.6 则直接使用 rpl_semi_sync_master_enabled=1 之类的就好了。 #我这里是5.7就直接做增强半同步了(loseless Semisynchronous ) plugin_dir=/mysql/app/mysql/lib/plugin/ plugin_load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so loose_rpl_semi_sync_master_enabled=1 #MySQL开启主的半同步复制(rpl_semi_sync_master_enabled) loose_rpl_semi_sync_slave_enabled=1 #MySQL5.6开启从的半同步复制 loose_rpl_semi_sync_master_timeout=5000 #超时5秒,切回异步 rpl_semi_sync_master_wait_for_slave_count=1 #至少收到1个slave发会的ack rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL 5.7的方法,AFTER_SYNC(default value,增强半同步) & AFTER_COMMIT(传统半同步) #GTID mode gtid_mode=on enforce_gtid_consistency=1 log-slave-updates=1
【2.1】在主库201创建复制用户
create user 'rpl'@'192.168.1.%' identified by '123456'; grant replication slave on *.* to 'rpl'@'192.168.1.%'; flush privileges; select user,host from mysql.user;
【2.2】在主库201创建测试数据
-- 【2.2.1】构造test库和test库下的test1,test2,test3表。test4表用于模拟业务一直在运行 create database test; use test; create table test1(id int); insert into test1 values(1); create table test2(id int); insert into test2 values(2); create table test3(id int); insert into test3 values(3); commit; create table test4(id int); insert into test4 values(4); commit; -- 【2.2.2】构造存储过程sp_test4来循环插入test4表,模拟业务运行 use test; drop procedure if exists sp_test4; delimiter $$ create procedure sp_test4() begin declare n int; set n=11; while(n<=20) do insert into test.test4 values(n); commit; set n=n+1; end while; end $$ delimiter ; -- 【2.2.3】构造事件,来调度sp_test4过程 use test; set global event_scheduler=1; delimiter $$ create event if not exists event_test4 on schedule every 5 second on completion preserve enable do begin call sp_test4(); end $$ delimiter ; -- 为了防止测试数据量累计导致卡顿,我这里5小时做一次truncate delimiter $$ create event if not exists event_truncate_test4 on schedule every 5 hour on completion preserve enable do begin truncate table test.test4; end $$ delimiter ;
【2.3】备份与还原
#在主库A:201 innobackupex --defaults-file=/etc/my.cnf -uroot -p123456 --no-timestamp /mysql/backup/full.bak
#在从库B/C:202,203
scp -r [email protected]:/mysql/backup/full.bak /mysql/backup/
innobackupex --apply-log --user-memory=800M /mysql/backup/full.bak #应用redo/undo
mv data data1
mkdir data
innobackupex --defaults-file=/etc/my.cnf --copy-back /mysql/backup/full.bak/ #复制还原
chown -R mysql:mysql /mysql
chmod -R 755 /mysql
【2.4】构建级联主从复制
#从xtrabackup备份中的,info文件 or binlog_info文件中找到 gtid;
stop slave;
reset master;
reset slave all;
set session sql_log_bin=0; set global gtid_purged='de853101-b165-11e9-900a-000c291f4171:1-1697'; set session sql_log_bin=1; change master to master_host='192.168.1.202', master_user='rpl', master_password='123456', master_auto_position=1;
#核验主从,在从库执行
show slave status\G
show processlist;
select count(1) from test.test4;
【2.5】核验
#在主库A:201 执行
create database test1;
create table test1.test1(id int);
insert into test1.test1 values(1);
commit;
select * from test1.test1;
#核验三个库
select * from test1.test1;
【3】多主一从
【3.1】实验环境
操作系统:CentOS 7.5
数据库版本:MySQL 5.7.24
数据库架构:主从复制,基于主库搭建3个从库,采用Xtrabackup + GTID + 无损同步复制
A:主库IP:192.168.1.201 port:3306
B:主库IP:192.168.1.202 port:3306
C:从库IP:192.168.1.203 port:3306\
A服务器之复制 test库,B服务器之复制test1库
【3.2】主从库参数 my.cnf
#【3.2.1】A服务器参数额外配置 binlog-do-db=test #binlog只把该库的操作记录到binlog,每一行一个数据库,多个数据库需要另起行 binlog-ignore-db=sys #表示忽略某个数据库,除了这个数据库之外都复制,每一行一个数据库,多个数据库需要另起行 binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema #【3.2.2】B服务器参数额外配置 binlog-do-db=test1 #binlog只把该库的操作记录到binlog,每一行一个数据库,多个数据库需要另起行 binlog-ignore-db=sys #表示忽略某个数据库,除了这个数据库之外都复制,每一行一个数据库,多个数据库需要另起行 binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema #【3.2.3】C服务器参数额外配置 replicate_do_db=test replicate_do_db=test1 replicate_wild_do_table=test.% replicate_wild_do_table=test1.% replicate_ignore_db=mysql replicate_ignore_db=sys replicate_ignore_db=information_schema replicate_ignore_db=performance_schema
【3.3】配置主从(channel)
#在从库C操作 #核心就是channel 加频道,以便可以接收多个主库的复制 stop slave; reset master; reset slave all; change master to master_host='192.168.1.201', master_port=3306, master_user='rpl', master_password='123456', master_auto_position=1 for channel 'master_201'; change master to master_host='192.168.1.202', master_port=3306, master_user='rpl', master_password='123456', master_auto_position=1 for channel 'master_202';
【3.4】关于channel的管理与维护
【3.4.1】关于channel 的常规操作 show slave for 'master_201'\G -- 查看单个channel 的状态 stop slave for channel 'master_201'; -- 停止单个channel的同步 start slave for channel 'master_202'; -- 开始单个channel的同步 reset slave all for channel 'master_201'; -- 重置单个channel -- 如果是关于全部的,那么和正常的主从一样 stop slave; reset slave all; show slave status\G -- 跳过一个channel 的报错 show slave status for channel 'master_201'\G -- 处理办法,先停止所有的channel(stop slave;),处理错误,接着开启报错所在的 channel ,最后开启所有的channel -- 启用GTID 模式时 stop slave; -- stop slave for channel 'master_201'; set session gtid_next='de853101-b165-11e9-900a-000c291f4171:1-1697';
begin;
commit;
set session gtid_next='automatic';
start slave;
-- 未启用GTID模式时
stop slave; -- stop slave for channel 'master_201';
set global sql_slave_skip_counter=N --N为数字,表示跳过N个事件
start slave;
【3.4.2】监控通道channel 信息,在performance_schema 增加了一些 replication 的监控表;
use performance_schema;
show tables like 'replicat%';
select * from performance_schema.replication_connection_status\G