现有数据库配置主从同步
环境说明
现在测试的架构是主库1的work1和主库2的work2,进行多源复制到从库3中,而且忽略系统库mysql库。
主库操作
- 从主库导出要同步的数据库
#从主库导出数据库
mysqldump -uroot -p'******' -h10.2.0.5 -P3306 --triggers -R --single-transaction --no-autocommit --master-data=2 -q -e --databases work1 > work1.sql
mysqldump -uroot -p'******' -h10.2.0.6 -P3306 --triggers -R --single-transaction --no-autocommit --master-data=2 -q -e --databases work2 > work2.sql
- 主库上创建同步用户,并授权访问要同步的数据库
#在主库授权,已做过的可以忽略
mysql -uroot -p'******' -h10.2.0.5 -P3306
grant replication slave on *.* to 'rep'@'%' identified by '123123';
mysql -uroot -p'******' -h10.2.0.6 -P3306
grant replication slave on *.* to 'rep'@'%' identified by '123123';
然后,把主库导出的这俩sql文件导入到目的从库环境,只要数据不冲突,都可以导进去。
理论上,多源复制要禁止一切同名数据库的存在,不然就不是多源复制了。
从库操作
- 导入从主库导出的数据库
# 导入数据到从库
mysql -uroot -p'******' -h10.2.0.7 -P3306
>create database work1
>use work1
>source work1.sql
>create database work2
>use work2
>source work2.sql
- 配置多源复制环境
旧模式是要确定pos位置,新模式则是要设置GTID的编号
#看以下sql的备份文件
more work1.sql
-- GTID state at the beginning of the backup
--
SET @@GLOBAL.GTID_PURGED='3edae34c-6299-11e6-95cd-8038bc0c67be:1-6758,
4cdc2a74-6299-11e6-95ce-008cfaf595bc:1-38813008';
--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.001284', MASTER_LOG_POS=3954096;
可以看到gtid和pos值,后面我们拿来用就可以了
- 修改从库配置文件
#在从库的my.cnf配置文件中添加配置项,需要重启mysql实例
vim my.cnf
[mysqld]
master_info_repository=TABLE
relay_log_info_repository=TABLE
replicate_wild_do_table=work1.%
replicate_wild_do_table=work2.%
read-only # 只读
#5.6以上参数,并行复制线程数
slave_parallel_workers = 4
#5.7新参数,并行复制模式选择,5.6没用
#slave_parallel_type = LOGICAL_CLOCK
#当然也可以在线实现设置,目的就是把主从配置信息改为记录到表
mysql>SET GLOBAL master_info_repository = 'TABLE';
mysql>SET GLOBAL relay_log_info_repository = 'TABLE';
mysql>change replication filter REPLICATE_IGNORE_DB=(mysql) ;
需要特别注意replicate_wild_do_table这个参数,这个参数的意思是只执行某个库或某个表的同步语句,其他库和表都不处理,从而达到选择性复制业务库的目的,这就不会有无用的数据了,也不会互相干扰。官方文档解析只能一个参数标记一个库,而且这个参数是全局通用,也就是说多源复制下,所有源频道都通用这个配置。
开启只读read-only就不用多说了,多源复制一般就只有读的需求,就不要让他们有写库的可能了。
并发复制多线程slave_parallel_workers是5.6,5.7新出的功能,能有效加快复制的效率,特别5.7是支持事务并发复制的,速度相当可观,这里设置了每个复制连接有4个并发线程。
而slave_parallel_type是选择并发复制方式,默认是为了兼容5.6以库模式的并发复制,这里是改成5.7新出的以组提交事务的方式并发复制,并发效果更佳,但是要特别注意如果主从服务器数据库版本不一致的话,最好还是不要改,因为只有mysql5.7是默认开启组提交功能的。
- 正式配置多源复制
#登录进从库数据库
mysql -uroot -p'******' -h10.2.0.7 -P3306
#先清空所有主从结构的记录
reset slave all;
#配置阿里云的数据库,这是GTID模式
change master to
master_host='10.2.0.5',
master_user='rep',
master_password='123123',
master_port=3306,
MASTER_AUTO_POSITION = 1
FOR CHANNEL 'al_RDS';
#配置自建的数据库,这是GTID模式
change master to
master_host='10.2.0.6',
master_user='rep',
master_password='123123',
master_port=3306,
MASTER_AUTO_POSITION = 1
FOR CHANNEL 'me_mysql';
#重置GTID值
reset master;
#设置GTID值
SET @@GLOBAL.GTID_PURGED='09cb91bf-2669-11e7-8b70-00163e0835ff:1-486646,3edae34c-6299-11e6-95cd-8038bc0c67be:1-6758,
4cdc2a74-6299-11e6-95ce-008cfaf595bc:1-38813008';
需要特别注意的两点是,多源复制提供了channel的标识,区分了不同的源频道,所以配置的时候就需要加上指定频道名称FOR CHANNEL 'al_RDS';这样。
而GTID的值和replicate_wild_do_table参数一样,默认是全局的配置,让源频道各取所需,所以,我们的gtid值,应该是所有*.sql文件的gtid值的合集,用‘,’号分隔,最终就出现我这个要设置这么多GTID的情况。
然后都配置完成了,就可以启动了,启动和关闭都可以指定特定的源频道,相当方便,下面列举一下命令。
#启动/关闭所有源频道
start/stop slave;
#启动/关闭单一的源频道
start/stop slave for channel 'al_RDS';
#当然重置也是可以单独频道的
#RESET SLAVE FOR CHANNEL 'al_RDS';
#查看状态也是可以单独的,不指定就是全部了
#show slave status for channel 'al_RDS';
然后,看看状态,show slave status看看。
#在从库上执行命令
mysql -uroot -p'******' -h10.2.0.7 -P3306
mysql> show slave status\G
其中Replicate_Wild_Do_Table,Executed_Gtid_Set是全局通用,两边都有,印证了我说的参数是全局的。
然后各自的Retrieved_Gtid_Set是不同的,他们都自行选择了,相当智能。
再看到Channel_Name就是他们不同的频道名字了。
然后可以看到,
Slave_IO_Running和Slave_SQL_Running的双yes,
Master_Log_File=Relay_Master_Log_File,
Read_Master_Log_Pos=Exec_Master_Log_Pos,
Seconds_Behind_Master为0,
所以现在是同步的。