MySQL 5.7 多源复制实践

MySQL 5.7 多源复制实践

 

Posted by Mike on 2017-06-21

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

什么是多源复制

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

1)一主一从
2)一主多从
3)级联复制
4)multi-mastermysql

MySQL 5.7 以前只能实现一主一从、一主多从或者多主多从的复制。若是想实现多主一从的复制,只能使用 MariaDB,可是 MariaDB 又与官方的 MySQL 版本不兼容。linux

MySQL 5.7 开始支持了多主一从的复制方式,也就是多源复制。MySQL 5.7 版本相比以前的版本,不管在功能仍是性能、安全等方面都已经有很多的提高。sql

首先,咱们须要清楚 multi-mastermulti-source 复制不是同样的。multi-master 复制一般是环形复制,你能够在任意主机上将数据复制给其余主机。数据库

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

多源复制使用场景安全

  • 数据分析部门会须要各个业务部门的部分数据作数据分析,这个时候就能够用到多源复制把各个主数据库的数据复制到统一的数据库中。服务器

  • 在从服务器进行数据汇总,若是咱们的主服务器进行了分库分表的操做,为了实现后期的一些数据统计功能,每每须要把数据汇总在一块儿再统计。多线程

  • 在从服务器对全部主服务器的数据进行备份,在MySQL 5.7以前每个主服务器都须要一个从服务器,这样很容易形成资源浪费,同时也加大了DBA的维护成本,但MySQL 5.7引入多源复制,能够把多个主服务器的数据同步到一个从服务器进行备份。

使用多源复制的必要条件

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

这两个参数是用来存储同步信息的,能够设置的值为 FILETABLE ,默认值是 FILE。好比 master-info 就保存在 master.info 文件中, relay-log-info 保存在 relay-log.info 文件中,若是服务器意外关闭,正确的 relay-log-info 没有来得及更新到 relay-log.info 文件,这样会形成数据丢失。

为了数据更加安全,一般设为 TABLE。这些表都是 innodb 类型的,支持事务。相对文件存储安全得多。在 MySQL 库下能够看见这两个表信息,分别是 mysql.slave_master_infomysql.slave_relay_log_info

这两个参数也是能够动态调整的。

1
2
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';

若是要启用 enhanced multi-threaded slave(多线程复制),能够设置如下参数

1
2
3
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
relay_log_recovery=ON

若是SLAVE已经为开启状态,那么须要首先关闭SLAVE(STOP SLAVE;)。

配置多源复制

环境准备

这里一共使用了三台机器,MySQL版本都为5.7.18。

机器名 IP地址 MySQL角色
dev-master-01 192.168.2.210 MySQL 主库
dev-node-01 192.168.2.211 MySQL 主库
dev-node-02 192.168.2.212 MySQL 从库

安装MySQL

MySQL安装比较简单,官方都有提供不一样系统的相应软件源。这里以 Ubuntu 16.04 系统为例:

  • 从MySQL官方网站下载APT源
1
$ wget https://dev.mysql.com/get/mysql-apt-config_0.8.6-1_all.deb

更多软件源可参考:http://dev.mysql.com/downloads/repo/apt/,若是是 CentOS/RHEL 系统可参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html

  • 安装MySQL软件源并更新
1
2
$ dpkg -i mysql-apt-config_0.8.6-1_all.deb
$ apt-get update
  • 安装MySQL Server和MySQL Client
1
$ apt-get install mysql-server mysql-client
  • 启动MySQL Server
1
$ service mysql start
  • 检查MySQL Server是否成功启动
1
2
3
4
5
6
7
8
9
10
11
12
$ service mysql status
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-06-12 17:16:09 CST; 32s ago
  Process: 10442 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
  Process: 10399 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 10446 (mysqld)
    Tasks: 27
   Memory: 190.8M
      CPU: 362ms
   CGroup: /system.slice/mysql.service
           └─10446 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

配置MySQL多源复制

  • 修改MySQL主配置文件

配置 MySQL 多源复制,主要是须要在 MySQL 从服务器的主配置文件 [mysqld] 段中添加如下两行:

1
2
3
4
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf

master-info-repository = table
relay-log-info-repository = table

MySQL主服务器配置片段

dev-master-01 为例,另外一台 Master 也是相似的配置方法。

1
2
3
4
5
6
7
8
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf

server-id = 1
log-bin = /var/log/mysql/mysql-bin
log_bin_index = /var/log/mysql/mysql-bin.index
expire_logs_days = 30
max_binlog_size  = 100M
binlog_format = ROW

MySQL从服务器配置片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf

server-id = 3
log-slave-updates = true
skip-slave-start = true
expire_logs_days = 30
max_binlog_size  = 100M
log-bin = /var/log/mysql/mysql-bin
relay-log = /var/log/mysql/relay-log
relay-log-index = /var/log/mysql/relay-log-index
relay-log-info-file = /var/log/mysql/relay-log.info
master-info-repository = table
relay-log-info-repository = table
report-port = 3306
report-host = 192.168.2.212
replicate-do-db = master1
replicate-do-db = master2
replicate_wild_do_table=master1.%
replicate_wild_do_table=master2.%

注:server-id 每台必须配置为不同,好比 dev-master-01 为1,dev-node-01 为2,dev-node-02 为3。这里没有给出所有配置,其它请根据实际状况自行配置。

  • 重启MySQL服务器
1
$ service mysql restart
  • 建立具备复制权限的用户

在两台 MySQL Master 上建立

1
2
mysql> grant replication slave on *.* to 'repl'@'192.168.2.%' identified by '000000';
mysql> flush privileges;
  • 从库分别链接至两个主库

MySQL 5.7 有了通讯渠道的概念,每个通讯渠道都是一个从服务器到主服务器得到二进制日志的连接。这意味着每一个通讯渠道都得有一个 IO_THREAD。对于每个主服务器,咱们须要运行不一样的 CHANGE MASTER 命令和FOR CHANNEL 这个参数来分别提供不一样通讯连接名字。

下面开始设置须要同步的源,同步两个主服务器的数据到从服务器上。

设置同步源到 Master1 (在 MySQL 从服务器上执行)

1
2
3
4
5
6
mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.210',
MASTER_USER='repl',
MASTER_PORT=3306,
MASTER_PASSWORD='000000',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1 FOR CHANNEL 'master1';

设置同步源到 Master2 (在 MySQL 从服务器上执行)

1
2
3
4
5
6
mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.211',
MASTER_USER='repl',
MASTER_PORT=3306,
MASTER_PASSWORD='000000',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1 FOR CHANNEL 'master2';

启动全部SLAVE

1
mysql> START SLAVE;

也能够单独启动须要同步的通道。

1
2
mysql> START SLAVE FOR CHANNEL 'master1';
mysql> START SLAVE FOR CHANNEL 'master2';

中止和 RESET 复制的命令也同 START 相似,能够操做全部的,也能够操做单个通道。

查看SLAVE信息

1
2
3
4
5
6
mysql> SHOW SLAVE STATUS\G

...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

确认 Slave_IO_RunningSlave_SQL_Running 两个参数都为 Yes 状态。

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

1
mysql> SHOW SLAVE STATUS FOR CHANNEL 'master1'\G;

测试多源复制

  • 在主库(dev-master-01)实例建立一些数据。
1
2
3
4
mysql> create database master1;
mysql> use master1;
mysql> CREATE TABLE `test1` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
mysql> insert into test1 values(1,1);
  • 在主库(dev-node-01)实例建立一些数据。
1
2
3
4
mysql> create database master2;
mysql> use master2;
mysql> CREATE TABLE `test2` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
mysql> insert into test2 values(1,1);
  • 在从库(dev-node-02)实例检查数据是否成功复制。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> select * from master1.test1;
+------+-------+
| id   | count |
+------+-------+
|    1 |     1 |
+------+-------+
1 row in set (0.00 sec)

mysql> select * from master2.test2;
+------+-------+
| id   | count |
+------+-------+
|    1 |     1 |
+------+-------+
1 row in set (0.00 sec)
  • 查看复制管理视图

列出全部的复制信道的复制状态概况:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> use performance_schema;
mysql> show tables like '%repl%';
+-------------------------------------------+
| Tables_in_performance_schema (%repl%)     |
+-------------------------------------------+
| replication_applier_configuration         |
| replication_applier_status                |
| replication_applier_status_by_coordinator |
| replication_applier_status_by_worker      |
| replication_connection_configuration      |
| replication_connection_status             |
| replication_group_member_stats            |
| replication_group_members                 |
+-------------------------------------------+
8 rows in set (0.00 sec)

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

其它一些须要注意的点

  • 初次配置耗时较长,须要将各个 master 的数据 dump 下来,再 source 到 slave 上。
  • 须要考虑各 master 数据增加频率,slave 的数据增加频率是这些数据的总和。若是过高,会致使大量的磁盘IO,形成数据更新延迟,最严重的是会影响正常的查询。
  • 若是多个主数据库实例中存在同名的库,则同名库的表都会放到一个库中;
  • 若是同名库中的表名相同且结构相同,则数据会到一块儿;若是结构不一样,则先建的有效。

参考文档

http://www.google.com
http://www.ywnds.com/?p=7154
http://blog.itpub.net/27808137/viewspace-1848036/
http://www.cnblogs.com/xuanzhi201111/p/5151666.html
https://dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html

相关文章
相关标签/搜索