一、什么是多源复制

MySQL 5.7发布后,在复制方面有了很大的改进和提升。比如开始支持多源复制(multi-source)以及真正的支持多线程复制了。多源复制可以使用基于二进制日志的复制或者基于事务的复制。下面我们说一说如何配置基于二进制日志的多源复制。

首先,我们要清楚几种常见的复制模式:

  1. 一主一从
  2. 一主多从
  3. 级联复制
  4. multi-master

MySQL 5.7 之前只能支持一主一从,一主多从或者多主多从的复制。如果想实现多主一从的复制 只能使用mariadb,但是mariadb又与官方的mysql版本不兼容。

MySQL 5.7 开始支持了多主一从的复制方式也就是多源复制。MySQL 5.7 版本相比之前的版本,无论是功能还是性能还是安全等方面都已经有了不少的提升。

首先我们要清楚multi-master OR multi-source 复制不是一样的。multi-master复制通常是环形的复制,可以在任意的主机上将数据复制给其他的主机。如图:

multi-source 是不同的。简单的说,多源复制就是将多个主库同步到一个从库,从而增加从的利用率,节省了机器。如图:

二、多源复制的使用场景

数据分析部门会需要各个业务部门的部分数据做数据分析,这个时候就可以使用到多源复制把各个主数据库的数据复制到统一的数据库中

在从服务器进行数据的汇总,如果我们的主服务器进行了分库分表的操作,为了实现后期的一些数据的统计功能,往往要把数据汇总在一起在进行统计

在从服务器对所有主服务器的数据进行备份,在MySQL 5.7之前每个主服务器都需要一台从服务器,这样很容易造成资源的浪费,同时也加大了DBA的维护成本,但MySQL 5.7引入的多源复制,可以把多个主服务器的数据同步到一台从服务器进行备份。

三、多源复制的必要条件

不管是使用基于二进制日志的复制或者基于事务的复制,要开启多源复制功能必须要在从库上设置master-info-repository AND relay-log-info-repository 这两个参数。

这两个参数是用来存储同步信息的,可以设置的值为FILE和TABLE,默认是FILE。比如master-info就保存在master.info文件中,relay-log-info保存在relay-log.inf文件中服务器如果意外关闭,正确的relay-log-info没有来的及更新带relay-log.info文件,这样就会造成数据的丢失。

为了数据更加安全,通常设置为TABLE。这些表都是innodb类型的,支持事务。相对文件存储安全得多。在MySQL库下可以看到这两个表的信息,分别是mysql.slave_master_info AND mysql.slave_relay_log_info

这两个参数也是可以动态调整的。

SET GLOBAL master_info_repository = 'TABLE';

SET GLOBAL relay_log_info_repository = 'TABLE';

如果要启用enhanced multi-threaded slave(多线程复制),可以设置一下参数

slave-parallel-type=LOGICAL_CLOCK

slave-parallel-workers=8

relay_log_recovery=ON

如果SLAVE已经为开启状态,那么需要首先关闭SLAVE(stop slave;)

四、配置多源复制

4.1:环境准备

hostname

IP

mysql

dev-master-01

192.168.1.131

master

dev_node-01

192.168.1.132

master

dev-node-02

192.168.1.133

slave

4.2:安装MySQL

  具体的安装步骤在这里:https://www.cnblogs.com/zhujingzhi/p/9609861.html 你可以选择你想用的安装方式进行安装

4.3:配置配置文件my.cnf

  1.   修改192.168.1.131和192.168.1.132下面的/etc/my.cnf文件,修改如下:记得修改配置参数中的server-id(192.168.1.131为1,那么192。168.1.132就得是2,每台服务器中的这个id不能一样,切记!!!)

[mysqld]
# 指定端口 不指定默认3306
#port=5603 # mysql数据存放路径
datadir=/var/lib/mysql # mysql socker文件存放路径
socket=/var/lib/mysql/mysql.sock # 创建符号链接(建议禁用符号链接,以防止各种安全风险。开启将参数的值设置为1)
symbolic-links=0 # 错误日志存放路径
log-error=/var/log/mysqld.log # 启动pid文件存放路径
pid-file=/var/run/mysqld/mysqld.pid # 设置主从的时候的唯一ID 每台主机的ID不可重复
server-id=1 # #打开日志(主机需要打开),这个mysql-bin也可以自定义,这里也可以加上路径,如:/home/www/mysql_bin_log/mysql-bin
log-bin=mysql-bin # 设定mysql的复制模式(STATEMENT ROW MIXED)
binlog_format=mixed # 绕过密码验证可直接使用root登录(用于修改密码)
#skip-grant-tables=1 # 启动服务器来禁用主机名缓存
skip-host-cache # 如果这个参数设为OFF,则MySQL服务在检查客户端连接的时候会解析主机名;如果这个参数设为ON,则MySQL服务只会使用IP,在这种情况下,授权表中的Host字段必须是IP地址或localhost。
skip-name-resolve # 网络传输时单个数据包的大小
max_allowed_packet = 500M # 设置数据库的时间
default-time-zone = '+8:00' # 内部内存临时表的最大内存
tmp_table_size=200M # MySQL服务器用来作普通索引扫描、范围索引扫描和不使用索引而执行全表扫描这些操作所用的缓存大小。
join_buffer_size = 32M # 每个会话执行排序操作所分配的内存大小。
sort_buffer_size = 1M # 每个客户端线程和连接缓存和结果缓存交互,每个缓存最初都被分配大小为net_buffer_length的容量,并动态增长,直至达到max_allowed_packet参数的大小
net_buffer_length = 8K # 为每个线程对MyISAm表执行顺序读所分配的内存。如果数据库有很多顺序读,可以增加这个参数,默认值是131072字节。
read_buffer_size = 512K # 这个参数用在MyISAM表和任何存储引擎表随机读所使用的内存。
read_rnd_buffer_size = 32M # 在REPAIR TABLE、CREATE INDEX 或 ALTER TABLE操作中,MyISAM索引排序使用的缓存大小。
myisam_sort_buffer_size = 256M # 设置客户端的并发连接数量
max_connections = 8000 # mysql关闭非交互连接前的等待时间,单位是秒
wait_timeout = 604800 # Mysql关闭交互连接前的等待时间,单位是秒
interactive_timeout = 604800 # 设定远程用户必须回应PORT类型数据连接的最大时间
connect_timeout = 30 # 如果客户端尝试连接的错误数量超过这个参数设置的值,则服务器不再接受新的客户端连接。可以通过清空主机的缓存来解除服务器的这种阻止新连接的状态,通过FLUSH HOSTS或mysqladmin flush-hosts命令来清空缓存。
max_connect_errors = 30000 # mysql关闭连接前的等待时间,单位是秒
interactive_timeout = 86400 # 慢查询的时间设置,单位为秒
long_query_time = 20 # mysql服务缓存以重用的线程数
thread_cache_size = 120 # 为查询结果所分配的缓存
query_cache_size = 256M # 如果一个事务需要的内存超过这个参数,就会报错
max_heap_table_size=2097152000

  2.  修改192.168.1.133也就是从库的/etc/my.cnf 配置参数,配置如下:(记得修改server-id为3,不能和其他服务器id一样,切记!!!)

[mysqld]
# 指定端口 不指定默认3306
#port=5603 # mysql数据存放路径
datadir=/var/lib/mysql # mysql socker文件存放路径
socket=/var/lib/mysql/mysql.sock # 创建符号链接(建议禁用符号链接,以防止各种安全风险。开启将参数的值设置为1)
symbolic-links=0 # 错误日志存放路径
log-error=/var/log/mysqld.log # 启动pid文件存放路径
pid-file=/var/run/mysqld/mysqld.pid # 设置主从的时候的唯一ID 每台主机的ID不可重复
server-id=1 # #打开日志(主机需要打开),这个mysql-bin也可以自定义,这里也可以加上路径,如:/home/www/mysql_bin_log/mysql-bin
log-bin=mysql-bin # 设定mysql的复制模式(STATEMENT ROW MIXED)
binlog_format=mixed # 绕过密码验证可直接使用root登录(用于修改密码)
#skip-grant-tables=1 # 启动服务器来禁用主机名缓存
skip-host-cache # 如果这个参数设为OFF,则MySQL服务在检查客户端连接的时候会解析主机名;如果这个参数设为ON,则MySQL服务只会使用IP,在这种情况下,授权表中的Host字段必须是IP地址或localhost。
skip-name-resolve # 网络传输时单个数据包的大小
max_allowed_packet = 500M # 设置数据库的时间
default-time-zone = '+8:00' # 内部内存临时表的最大内存
tmp_table_size=200M # MySQL服务器用来作普通索引扫描、范围索引扫描和不使用索引而执行全表扫描这些操作所用的缓存大小。
join_buffer_size = 32M # 每个会话执行排序操作所分配的内存大小。
sort_buffer_size = 1M # 每个客户端线程和连接缓存和结果缓存交互,每个缓存最初都被分配大小为net_buffer_length的容量,并动态增长,直至达到max_allowed_packet参数的大小
net_buffer_length = 8K # 为每个线程对MyISAm表执行顺序读所分配的内存。如果数据库有很多顺序读,可以增加这个参数,默认值是131072字节。
read_buffer_size = 512K # 这个参数用在MyISAM表和任何存储引擎表随机读所使用的内存。
read_rnd_buffer_size = 32M # 在REPAIR TABLE、CREATE INDEX 或 ALTER TABLE操作中,MyISAM索引排序使用的缓存大小。
myisam_sort_buffer_size = 256M # 设置客户端的并发连接数量
max_connections = 8000 # mysql关闭非交互连接前的等待时间,单位是秒
wait_timeout = 604800 # Mysql关闭交互连接前的等待时间,单位是秒
interactive_timeout = 604800 # 设定远程用户必须回应PORT类型数据连接的最大时间
connect_timeout = 30 # 如果客户端尝试连接的错误数量超过这个参数设置的值,则服务器不再接受新的客户端连接。可以通过清空主机的缓存来解除服务器的这种阻止新连接的状态,通过FLUSH HOSTS或mysqladmin flush-hosts命令来清空缓存。
max_connect_errors = 30000 # mysql关闭连接前的等待时间,单位是秒
interactive_timeout = 86400 # 慢查询的时间设置,单位为秒
long_query_time = 20 # mysql服务缓存以重用的线程数
thread_cache_size = 120 # 为查询结果所分配的缓存
query_cache_size = 256M # 如果一个事务需要的内存超过这个参数,就会报错
max_heap_table_size=2097152000 # mysql5.7 多源复制从库加的配置参数
master-info-repository = table # 这个参数是必须的
relay-log-info-repository = table # 这个参数是必须的
report-port = 3306
report-host = 192.168.1.131
replicate-do-db = master1
replicate-do-db = master2
replicate_wild_do_table=master1.%
replicate_wild_do_table=master2.%

4.4:重启数据库并且授权

重新启动mysql服务
systemctl restart mysqld 升级mysql授权表
mysql_upgrade -uroot -p ==========================主库执行SQL=========================
以下的执行都是在192.168.1.131和192.168.1.132的mysql中执行sql语句 登录192.168.1.131和192.168.1.132的mysql
mysql -uroot -p 创建mysql的主从授权用户:
grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '2017123'; 刷新生效
FLUSH PRIVILEGES; ==========================从库执行SQL=========================
登录192.168.1.133的mysql执行sql语句:
CHANGE MASTER TO MASTER_HOST='192.168.1.131',
MASTER_USER='slave',
MASTER_PORT=3306,
MASTER_PASSWORD='2017123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1 FOR CHANNEL 'master1'; CHANGE MASTER TO MASTER_HOST='192.168.1.132',
MASTER_USER='slave',
MASTER_PORT=3306,
MASTER_PASSWORD='2017123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1 FOR CHANNEL 'master2'; 全部显示sql语句执行ok,然后查看主从的状态:
show slave status\G; 如果要查看单一信道的复制的详细状态,可以使用以下命令:
SHOW SLAVE STATUS FOR CHANNEL 'master1'\G;

  4.5:检查测试

在主库(192.168.1.131)实例创建一些数据。
create database master1;
use master1;
CREATE TABLE `test1` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
insert into test1 values(1,1); 在主库(192.168.1.132)实例创建一些数据。
create database master2;
use master2;
CREATE TABLE `test2` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
insert into test2 values(1,1); 在从库(192.168.1.133)实例检查数据是否成功复制。
select * from master1.test1;
select * from master2.test2; 列出所有的复制信道的复制状态概况:
select * from performance_schema.replication_applier_status_by_worker; 在 performance_schema 库中,提供了复制相关的一些视图,可供查看复制相关的信息。
use performance_schema;
show tables like '%repl%'; 这些表里分别有多源通道的配置信息和多源通道的状态信息,另外还有连接配置信息和连接状态信息,如果配置了多线程复制的话,还会有多线程配置信息和多线程状态信息。

五、一些其他的注意点

初次配置耗时较长,需要将各个 master 的数据 dump 下来,再 source 到 slave 上。

需要考虑各 master 数据增长频率,slave 的数据增长频率是这些数据的总和。如果太高,会导致大量的磁盘IO,造成数据更新延迟,最严重的是会影响正常的查询。

如果多个主数据库实例中存在同名的库,则同名库的表都会放到一个库中;

如果同名库中的表名相同且结构相同,则数据会到一起;如果结构不同,则先建的有效。

MySQL多源复制(八)的更多相关文章

  1. MySQL系列详解十:MySQL多源复制演示-技术流ken

    前言 多源复制即多主一从结构,多个主服务器端的数据都会同步到后端一个从服务器上面.至于为什么要做多源复制下面的总结很到位. 1.灾备作用:将各个库汇总在一起,就算是其他库都挂了(整个机房都无法连接了) ...

  2. MySQL 多源复制(Mulit-Source Replication)

    MySQL多源复制方案        看复制源Master_1的同步状态:SHOW SLAVE STATUS FOR CHANNEL 'Master_1'\G 查看复制源Master_2的同步状态:S ...

  3. (转)MySQL多源复制

    原文:https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html MySQL多源复制概述 MySQL多源复制使复制从接受 ...

  4. MySQL多源复制

    MySQL多源复制 1. 配置多源复制 1.1 配置环境如下 1.2 从库的重要参数配置 1.3 在Master上导出需要同步的数据库 1.4 在master上创建复制账号 1.5 备份数据导入 1. ...

  5. 基于Docker搭建MySQL多源复制环境

    MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制.基于组提交的并行复制.在线修改Replication Filter.GTID增强.半同步复制增强等. 多源复制:多源复制加入了一 ...

  6. MySQL多源复制【转】

    什么是多源复制? 首先,我们需要清楚 multi-master 与multi-source 复制不是一样的. Multi-Master 复制通常是环形复制, 你可以在任意主机上将数据复制给其他主机. ...

  7. mysql多源复制安装

    多源复制的意思是多主一从. 多源复制的前提是必须要开启GTID模式. master1 :192.168.1.110 master2 :192.168.1.111 slave :192.168.1.15 ...

  8. MySQL 5.7.9多源复制报错修复

    版本:5.7.9 用5.7.9的版本搭建MySQL多源复制测试环境 开发说复制出现问题,上去看了一下: mysql> show slave status\G******************* ...

  9. MySQL 5.7 多源复制实践

    多源复制使用场景 数据分析部门会需要各个业务部门的部分数据做数据分析,这个时候就可以用到多源复制把各个主数据库的数据复制到统一的数据库中. 在从服务器进行数据汇总,如果我们的主服务器进行了分库分表的操 ...

随机推荐

  1. MySQL的left on 【zt】

    MySQL的left on [zt] (2008-11-03 17:27:30) 转载▼ 标签:  it 分类: 学习笔记 MySQL多表连接查询Left Join,Right Join php开源嘛 ...

  2. 20145226夏艺华 《Java程序设计》第8周学习总结

    教材学习内容总结 学习目标 了解NIO 会使用Channel.Buffer与NIO2 会使用日志API.国际化 会使用正则表达式 了解JDK8增强功能 第14章 NIO与NIO2 14.1 认识NIO ...

  3. 2018.10.16 NOIP模拟 华莱士(并查集)

    传送门 按照题意模拟维护最小的环套树森林就行了. 然而考试的时候naivenaivenaive瞎写了一个错误的贪心. 代码

  4. 2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)

    传送门 虚树入门题? 好难啊. 在学习别人的写法之后终于过了. 这道题dp方程很好想. 主要是不好写. 简要说说思路吧. 显然最优值只能够从子树和父亲转移过来. 于是我们先dfs一遍用儿子更新父亲,然 ...

  5. hdu-1181(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1181 思路:bfs,就是每次找到匹配麻烦一点,注意如果结尾和开头相同,就不算. #include< ...

  6. 12) maven-compiler-plugin

    The Compiler Plugin is used to compile the sources of your project. At present the default source se ...

  7. Win窗口坐标二维坐标与OpenGl的世界坐标系的之间的相互转换

    Win窗口坐标二维坐标与OpenGl的世界坐标系的转换 几何处理管线擅长于使用视图和投影矩阵以及用于裁剪的视口把顶点的世界坐标变换为窗口坐标. 但是,在有些情况下,需要逆转这个过程.一种常见的情形是: ...

  8. hdu 1300 Deck

    题目 分析:对于n张卡片的最佳摆法,我们只需要在n-1张卡片的摆法下面加一张边缘与桌檐重合的卡片,并将所有卡片一起向桌檐外移动.对于一种最佳摆法,其中心一定在桌檐上,所以一定符合杠杆原理,支点是桌檐. ...

  9. 使用工厂方法配置bean的两种方式

    1.使用静态工厂方法: 对应的配置.xml文件: 2.通过实例工厂的方法来配置bean: 对应的xml文件:

  10. 软件工程作业 - 实现WC功能(java)

    项目地址:https://github.com/yogurt1998/WordCount 要求 基本要求 -c 统计文件字符数(实现) -w 统计文件单词数(实现) -l 统计文件行数(实现) 扩展功 ...