MySQL多源复制(八)

一、什么是多源复制

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,造成数据更新延迟,最严重的是会影响正常的查询。

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

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

原文地址:https://www.cnblogs.com/zhujingzhi/p/9648186.html

时间: 2024-10-10 03:15:28

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

基于GTID的MySQL多源复制配置

多源复制的意义 1.可以在一个从库上对多个服务器的数据库进行汇总,或者对一个数据库的分库分表进行汇总. 2.集约使用从库服务器的硬件资源,毕竟弱一个数据库业务量较小确占用整个服务器资源是不经济的. 3.更方便的对个业务库进行数据备份,优化数据库备份脚本编写逻辑 拓补图 实施步骤 1.备份主库上的数据,考虑到gtid的问题建议只采用mysqldump程序进行备份 centos:#mysqldump --login-path=3306 \ #mysql官方工具都支持login-path快速登录   

mysql 多源复制

mysql5.7新特性多源复制很实用,方便对分库环境进行汇总,集中备份和数据统计分析. 我的实验环境3台机器,mysql版本:5.7.16 10.10.203.102 从库 10.10.203.93 主库 10.10.203.94 主库 操作步骤: (1)当一个从库是多源复制结构,那么master_info和relay_log_info不能用file方式来存储,必须使用table,它不支持file. 10.10.203.102 从库上操作 在配置文件中新增: [mysqld] master_in

MySQL多源复制搭建

1.1     实验概要 1.1.1  实验假设 本实验假设已经完成操作系统和MySQL安装部署. 1.1.2  实验目的 MySQL5.7的多源复制技术搭建部署,然后简单测试. 1.1.3  环境信息 操作系统 MySQL版本 服务器地址 服务器角色 Centos7 5.7.18 192.168.102.23 source 1 Centos7 5.7.18 192.168.102.24 source 2 Centos7 5.7.18 192.168.102.25 target 1.1.4  实

mysql多源复制详解

大家应该知道,mysql比起其他数据库,最大的特色是就是主从复制,不过5.7之前的版本最多就只支持一主多从的复制方式,对于一些统计类的需求,就需要跨库,这是比较麻烦的事情,以往只能交由数据库中间件(mycat等)去做这种事情,还有备份操作,也只能一个个库的用脚本去轮询或并发备份,不可谓不费时费力.然后,多源复制的概念出来了. 多源复制的概念最早是mariadb社区提出的,后来mysql官方积极引入到5.7的版本中来(5.6最新版也是没有这个功能的),percona就不说了,也是随后推出.这个功能

MySQL多源复制报错,在线更改relay_log_info_repository,master_info_repository参数【转】

设置多源复制时报错 ERROR 3077 (HY000): To have multiple channels, repository cannot be of type FILE; Please check the repository configuration and convert them to TABLE. 原理:多源复制加入了一个叫做Channel的概念, 每一个Channel都是一个独立的Slave,都有一个IO_THREAD和SQL_THREAD.原理和普通复制一样.我们只需要

MySQL 5.7.9多源复制报错修复

版本:5.7.9 用5.7.9的版本搭建MySQL多源复制测试环境 开发说复制出现问题,上去看了一下: mysql> show slave status\G*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 182.2.2.11     

6:多源复制的实现

MySQL多源复制允许复制slave同时从多个源接收事务.可以使用多源复制将多个服务器备份到一个服务器,合并表碎片,并将来自多个服务器的数据合并到一个服务器.多源复制在应用事务时不实现任何冲突检测或解决,如果需要,这些任务留给应用程序完成. 下面我们就来配置一个多源复制,多源复制这种拓扑至少需要两个masters和slaves. 服务器环境:192.168.1.2 (master1) 192.168.1.3 (new master) 192.168.1.4 (slave) 可以将多源复制拓扑中的

MySQL 5.7的多源复制

MySQL 5.7已经开始支持了多源复制,相信小伙们都很激动,MySQL 5.7之前只能实现一主一从.一主多从或者多主多从的复制,如果想实现多主一从的复制,只好使用MariaDB,但是MariaDB又与官方的MySQL版本不兼容的,在MySQL 5.7版本已经可以实现多主一从的复制了.MySQL 5.7版本相比之前的版本,无论在功能还是性能.安全等方面都已经提升了不少,值得大家去研究和使用. MySQL 5.7版本之前的最常见的复制方式,一主一从或者一主多从的架构: MySQL 5.7之后就可以

mysql第四篇文章~关于mysql的多源复制

一 场景需求 多源复制版本 5.7,目标主机5.6.21 4个DB机器的某些数据库需要数据汇总进行连表查询 二 进行搭建  1 导出相应的目的库     mysqldump -uuser -ppassword --master-data=2 --single-transaction --databases --add-drop-database dbname >dbname.sql  2 将相应的目的库导入到多源复制机器上     注意 5.6版本 需要先删除第一行,否则无法导入.     my