MySQL多源复制(八)
一、什么是多源复制
MySQL 5.7发布后,在复制方面有了很大的改进和提升。比如开始支持多源复制(multi-source)以及真正的支持多线程复制了。多源复制可以使用基于二进制日志的复制或者基于事务的复制。下面我们说一说如何配置基于二进制日志的多源复制。
首先,我们要清楚几种常见的复制模式:
- 一主一从
- 一主多从
- 级联复制
- 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多源复制(八)的更多相关文章
- MySQL系列详解十:MySQL多源复制演示-技术流ken
前言 多源复制即多主一从结构,多个主服务器端的数据都会同步到后端一个从服务器上面.至于为什么要做多源复制下面的总结很到位. 1.灾备作用:将各个库汇总在一起,就算是其他库都挂了(整个机房都无法连接了) ...
- MySQL 多源复制(Mulit-Source Replication)
MySQL多源复制方案 看复制源Master_1的同步状态:SHOW SLAVE STATUS FOR CHANNEL 'Master_1'\G 查看复制源Master_2的同步状态:S ...
- (转)MySQL多源复制
原文:https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html MySQL多源复制概述 MySQL多源复制使复制从接受 ...
- MySQL多源复制
MySQL多源复制 1. 配置多源复制 1.1 配置环境如下 1.2 从库的重要参数配置 1.3 在Master上导出需要同步的数据库 1.4 在master上创建复制账号 1.5 备份数据导入 1. ...
- 基于Docker搭建MySQL多源复制环境
MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制.基于组提交的并行复制.在线修改Replication Filter.GTID增强.半同步复制增强等. 多源复制:多源复制加入了一 ...
- MySQL多源复制【转】
什么是多源复制? 首先,我们需要清楚 multi-master 与multi-source 复制不是一样的. Multi-Master 复制通常是环形复制, 你可以在任意主机上将数据复制给其他主机. ...
- mysql多源复制安装
多源复制的意思是多主一从. 多源复制的前提是必须要开启GTID模式. master1 :192.168.1.110 master2 :192.168.1.111 slave :192.168.1.15 ...
- MySQL 5.7.9多源复制报错修复
版本:5.7.9 用5.7.9的版本搭建MySQL多源复制测试环境 开发说复制出现问题,上去看了一下: mysql> show slave status\G******************* ...
- MySQL 5.7 多源复制实践
多源复制使用场景 数据分析部门会需要各个业务部门的部分数据做数据分析,这个时候就可以用到多源复制把各个主数据库的数据复制到统一的数据库中. 在从服务器进行数据汇总,如果我们的主服务器进行了分库分表的操 ...
随机推荐
- devexpress v14.2.3 发布
补丁而已. New Major Features in 14.2 What's New in VCL Products 14.2 Breaking Changes To learn about bre ...
- 2018.10.18 bzoj4105: [Thu Summer Camp 2015]平方运算(线段树)
传送门 线段树妙题. 显然平方几次就会循环(打表证明不解释). 然后所有环长度的lcmlcmlcm不大于70. 因此维护一下当前区间中的节点是否全部在环上. 不是直接暴力到叶子节点修改. 否则整体打标 ...
- hdu-1175(bfs+剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 思路:用bfs,注意要转弯的次数,次数大于两次就跳过. #include<iostream ...
- 马婕 2014年MBA,mpacc备考 报刊宣读2 美国对互联网的控制威胁着网络自由(转)
http://blog.sina.com.cn/s/blog_3e66af4601015qmk.html US controls threaten Internet freedom 美国对互联网的控制 ...
- spring 3.X与jdk 1.8不兼容
1.报错(部分) 2.解决 虽然Spring的jdk要求如下,但是spring 3与jdk1.8不兼容(使用的是spring 3.2) 在eclipse将jdk版本下调.这里将JDK调到1.7(在ec ...
- Android操作HTTP实现与服务器通信
(转自http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html) 本示例以Servlet为例,演示Android与Servlet ...
- 快速掌握Java中Lambda表达式的用法
Lambda表达式的作用: Lambda表达式的作用就是简化代码开发,让代码看起来更加简介.它是用来简化匿名内部类的.但是并不是所有的匿名内部类都能用Lambda表达式简化,Lambda表达式是有使用 ...
- hdu 2189 悼念512汶川大地震遇难同胞——来生一起走
题目 这道题用了,埃式筛选法和背包,我自己没有做出来,看了别人的代码,我也做不出来,特别是c[j]+=c[j-b[i]];弄了好久都没有弄懂. 这道题的解题思路:主要是先把150以内的所有素数找出来, ...
- hdu 5000 共存问题->背包
http://acm.hdu.edu.cn/showproblem.php?pid=5000 每只羊有n个属性 下面n个数字表示每个属性的值范围为[ 0, T[i] ] 对于羊圈里的a羊和b羊,若a羊 ...
- Difference between the Bill of distribution and sourcing rule.
https://forums.oracle.com/thread/936768 This is from a users guide Oracle Supply Chain Planning ...