返回首页
当前位置: 主页 > 网络编程 > Php实例教程 >

MySQL 5.7多源复制实现实践教程

时间:2017-06-23 12:15来源:知行网www.zhixing123.cn 编辑:麦田守望者

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

什么是多源复制

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

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

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

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

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

MySQL

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

多源复制

多源复制使用场景

  • 数据分析部门会需要各个业务部门的部分数据做数据分析,这个时候就可以用到多源复制把各个主数据库的数据复制到统一的数据库中。
  • 在从服务器进行数据汇总,如果我们的主服务器进行了分库分表的操作,为了实现后期的一些数据统计功能,往往需要把数据汇总在一起再统计。
  • 在从服务器对所有主服务器的数据进行备份,在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

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

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;)。

配置多源复制

环境准备

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

MySQL

安装MySQL

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

  • 从MySQL官方网站下载APT源
$ 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软件源并更新
$ dpkg -i mysql-apt-config_0.8.6-1_all.deb
$ apt-get update
  • 安装MySQL Server和MySQL Client
$ apt-get install mysql-server mysql-client
  • 启动MySQL Server
$ service mysql start
  • 检查MySQL Server是否成功启动
$ 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] 段中添加以下两行:

$ vim /etc/mysql/mysql.conf.d/mysqld.cnf

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

MySQL主服务器配置片断

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

$ 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从服务器配置片断

$ 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服务器
$ service mysql restart
  • 创建具有复制权限的用户

在两台 MySQL Master 上创建

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

顶一下
(0)
0%
踩一下
(0)
0%
标签(Tag):数据库 MYSQL mysql数据库
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
猜你感兴趣