阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL 5.7多源复制配置详解

181次阅读
没有评论

共计 8412 个字符,预计需要花费 22 分钟才能阅读完成。

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 复制通常是环形的复制,可以在任意的主机上将数据复制给其他的主机。如图:

MySQL 5.7 多源复制配置详解

 

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

MySQL 5.7 多源复制配置详解

 

多源复制的使用场景

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

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

在从服务器对所有主服务器的数据进行备份,在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;)

配置多源复制

环境准备:

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

安装MySQL 5.7 版本:

可参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html

MySQL 5.7 软件包下载地址:https://dev.mysql.com/downloads/repo/yum/

下载yum 源 rpm 安装包:wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

安装yum 源:yum localinstall mysql57-community-release-el7-11.noarch.rpm

检查mysql 源是否安装成功:yum repolist enable | grep “mysql.*-community.*”

 安装MySqL:yum install mysql-community-server

 启动MySQL 服务:systemctl start mysqld

 查看MySQL 的启动状态:systemctl status mysqld

 设置开机自启:systemctl enable mysqld —-> systemctl daemon-reload

 修改root 默认密码(这里出现了一些小问题)下面做问题的阐述

在修改密码的过程中出现了和官网上说法不一致的问题

官网的说法:

mysql 安装完成后,在 /var/log/mysqld.log 文件中给 root 生成一个默认的密码,通过下面的方式可以找到 root 的默认密码,然后登录 mysql 进行修改:

找密码:grep ‘temporary password’ /var/log/mysqld.log

登录mysql:mysql -uroot -p

修改密码:ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘MyNewPass4!’

注意:MySQL 的 validate_password 插件默认安装。这将要求密码至少包含一个大写字母,一个小写字母,一位数字和一个特殊字符,并且总密码长度至少为 8 个字符。

我自己遇到的问题:

使用官方提供的找密码的命令根本就在mysqld.log 文件中找不到默认的密码,只能想办法自己解决 mysql 的密码的问题了 尝试了一些 mysql5.7 之前的版本的修改密码的方法但是还是不可行,但是最后还是想到了一种相当简单的方法:

 修改 /etc/my.cnf 在[mysqld] 下面添加 skip-grant-tables=1 这一行配置 让 mysql 启动的时候不对密码进行验证

 重启mysqld 服务:systemctl restart mysqld

 使用root 用户登录到 mysql:mysql -uroot

 切换到mysql 数据库:use mysql;

 更新user 表:UPDATE user SET authentication_string = PASSWORD(‘sycx_2009abc’) WHERE user = ‘root’;

 使修改后生效:FLUSH PRIVILEGES;

 退出mysql,编辑 /etc/my.cnf 文件 注释掉 skip-grant-tables=1

 重启mysqld 服务,再用新密码登录即可

配置多源复制:

上面我们已经把MySQL 5.7 版本的 mysql 安装成功了 现在我们只要修改 my.cnf 配置文件重启 mysql 验证多源复制即可。步骤如下:

 修改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.%

3、重新启动 mysql 服务:systemctl restart mysqld

4、升级 mysql 授权表:mysql_upgrade -uroot -p

5、登录 192.168.1.131 和 192.168.1.132 的 mysql:mysql -uroot -p

6、以下的执行都是在 192.168.1.131 和 192.168.1.132 的 mysql 中执行 sql 语句

创建 mysql 的主从授权用户:grant replication slave on *.*  to ‘slave’@’192.168.1.%’ identified by ‘2017123’;

刷新生效:FLUSH PRIVILEGES;

7、登录 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’;

8、全部显示 sql 语句执行 ok,然后查看主从的状态:

执行sql 语句:show  slave  status\G;

如果要查看单一信道的复制的详细状态,可以使用以下命令:

SHOW SLAVE STATUS FOR CHANNEL ‘master1’\G;

9、在主库 (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);

10、在主库 (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);

11、在从库 (192.168.1.133) 实例检查数据是否成功复制。

select * from master1.test1;
 
select * from master2.test2;

12、列出所有的复制信道的复制状态概况:

select * from performance_schema.replication_applier_status_by_worker;

13、在 performance_schema 库中,提供了复制相关的一些视图,可供查看复制相关的信息。

use performance_schema;
 
show tables like ‘%repl%’;

这些表里分别有多源通道的配置信息和多源通道的状态信息,另外还有连接配置信息和连接状态信息,如果配置了多线程复制的话,还会有多线程配置信息和多线程状态信息。

其它一些需要注意的点:

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

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

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

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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计8412字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中