MySQL双主双从 + 多源复制配置

Posted 盛夏温暖流年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL双主双从 + 多源复制配置相关的知识,希望对你有一定的参考价值。

本文主要介绍 mysql 数据库的双主双从架构, 其中主从同步采用多源复制的机制。

一. 数据库架构介绍

本次搭建的 MySQL 数据库架构图如下所示:
在这里插入图片描述
其中,master1master2 是两台主库,负责数据增删改操作。

这两台主库的主从关系为互为主从,且在 Haproxy 中配置 master1 是主库,master2 是备库,正常情况下 master1 提供数据增删改操作,master2 作为备份库实时同步 master1 的数据更新,一旦主库 master1 出现异常,Haproxy 将会切换到备库 master2 继续提供数据增删改操作。

slave1slave2 是两台从库,且配置了只读属性,负责系统数据读取操作。

两台从库 slave1 和 slave2 的主库都为 master1 和 master2,且在 Haproxy 中配置 slave1 和 slave2 为负载均衡模式,提供系统数据读取操作。

二. 数据库环境准备和安装

1.环境准备

mysql版本:5.7

操作系统:CentOS 6

双主双从架构,需要4台服务器:

服务器名称服务器ip说明
master1服务器10.200.0.201提供数据增删改操作的主库
master2服务器10.200.0.202实时同步 master1 数据更新的备份库
slave1服务器10.200.0.203负载均衡模式,提供系统数据读取操作
slave2服务器10.200.0.204负载均衡模式,提供系统数据读取操作

2.安装步骤

下载mysql 安装包

https://download.csdn.net/download/j1231230/18546367

解压 tar 包

tar xvf mysql-5.7.16-1.el6.x86_64.rpm-bundle.tar

安装组件,按次序一个一个安装

yum install -y libaio.x86_64 numactl.x86_64 perl-JSON.noarch perl-Time-HiRes.x86_64
rpm -ivh mysql-community-common-5.7.16-1.el6.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.16-1.el6.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-devel-5.7.16-1.el6.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-libs-compat-5.7.16-1.el6.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-client-5.7.16-1.el6.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-embedded-5.7.16-1.el6.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-embedded-devel-5.7.16-1.el6.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-server-5.7.16-1.el6.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-test-5.7.16-1.el6.x86_64.rpm --nodeps --force

启动服务

service mysqld start

获取初始密码

cat /var/log/mysqld.log | grep "temporary password"

运行 mysql –uroot –p ,输入初始密码登录后重新设置密码

mysql> SET password='Beauty1234@';

三. 数据库配置

1. master1 配置(10.200.0.201)

编辑 mysql 配置文件

vi /etc/my.cnf 

添加如下配置

user                    =mysql
port                    =3306
tmpdir                  =/tmp
log-bin                 =master-bin
log-bin-index           =master-bin.index
relay-log               =master-relay-bin
relay-log-index         =master-relay-bin.index
auto-increment-increment= 2 #自增步长,根据需要修改
auto-increment-offset   =1 #自增起始值(偏移量),根据需要修改
server-id               =1

保存后,重启 mysql

service mysqld restart

创建复制用户,并为用户授权

mysql> CREATE USER 'repl_user'@'localhost' IDENTIFIED BY 'Beauty1234@';
mysql> GRANT REPLICATION SLAVE ON *.* to 'repl_user'@'10.200.0.202' identified by 'Beauty1234@';
mysql> GRANT REPLICATION SLAVE ON *.* to 'repl_user'@'10.200.0.203' identified by 'Beauty1234@';
mysql> GRANT REPLICATION SLAVE ON *.* to 'repl_user'@'10.200.0.204' identified by 'Beauty1234@';

配置主机之间的互相复制(将 master2 配置为 master1 的主)

mysql> CHANGE MASTER TO MASTER_HOST='10.200.0.202',MASTER_PORT=3306,MASTER_USER='repl_user',MASTER_PASSWORD='Beauty1234@';
mysql> START SLAVE;

2. master2 配置(10.200.0.202)

编辑 mysql 配置文件

vi /etc/my.cnf 

添加如下配置

user                    =mysql
port                    =3306
tmpdir                  =/tmp
log-bin                 =slave-log-bin
log-bin-index           =slave-log-bin.index
relay-log-index         =slave-relay-bin.index
relay-log               =slave-relay-bin
auto-increment-increment=2  #自增步长,根据需要修改
auto-increment-offset   =2  #起始值(偏移量),根据需要修改
server-id               =2

保存后,重启 mysql

service mysqld restart

创建复制用户,并为复制用户授权

mysql> CREATE USER 'repl_user'@'localhost' IDENTIFIED BY 'Beauty1234@';
mysql> GRANT REPLICATION SLAVE ON *.* to 'repl_user'@'10.200.0.201' identified by 'Beauty1234@';
mysql> GRANT REPLICATION SLAVE ON *.* to 'repl_user'@'10.200.0.203' identified by 'Beauty1234@';
mysql> GRANT REPLICATION SLAVE ON *.* to 'repl_user'@'10.200.0.204' identified by 'Beauty1234@';

配置主机之间的互相复制(将 master1 配置为 master2 的主)

mysql> CHANGE MASTER TO MASTER_HOST='10.200.0.201',MASTER_PORT=3306,MASTER_USER='repl_user',MASTER_PASSWORD='Beauty1234@';
mysql> START SLAVE;

3. slave1 配置(10.200.0.203)

编辑 mysql 配置文件

vi /etc/my.cnf 

添加如下配置

server-id=3
relay-log=mysql-relay
user=mysql
port=3306
tmpdir=/tmp
#多源复制
master_info_repository=TABLE
relay_log_info_repository=TABLE

保存后,重启 mysql

service mysqld restart

配置 slave1 的多源复制

mysql> CHANGE MASTER TO MASTER_HOST='10.200.0.201',MASTER_PORT=3306,MASTER_USER='repl_user',MASTER_PASSWORD='Beauty1234@' for channel 'master1';
mysql> CHANGE MASTER TO MASTER_HOST='10.200.0.202',MASTER_PORT=3306,MASTER_USER='repl_user',MASTER_PASSWORD='Beauty1234@' for channel 'master2';
mysql> START SLAVE for channel 'master1';
mysql> START SLAVE for channel 'master2';

4. slave2 配置(10.200.0.204)

编辑 mysql 配置文件

vi /etc/my.cnf 

添加如下配置

server-id=4
#启用中继日志
relay-log=mysql-relay
user=mysql
port=3306
tmpdir=/tmp
#多源复制
master_info_repository=TABLE
relay_log_info_repository=TABLE

保存后,重启 mysql

service mysqld restart

配置 slave2 的多源复制

mysql> CHANGE MASTER TO MASTER_HOST='10.200.0.201',MASTER_PORT=3306,MASTER_USER='repl_user',MASTER_PASSWORD='Beauty1234@' for channel 'master1';
mysql> CHANGE MASTER TO MASTER_HOST='10.200.0.202',MASTER_PORT=3306,MASTER_USER='repl_user',MASTER_PASSWORD='Beauty1234@' for channel 'master2';
mysql> START SLAVE for channel 'master1';
mysql> START SLAVE for channel 'master2';

四. 数据库配置测试

运行以下命令查看运行状态

mysql> show slave status\\G;

重点查看 Slave_IO_RunningSlave_SQL_Running 的状态,如果有 no,则说明存在问题。

问题描述

配置 master1 和 master2 的复制用户授权时,一个手抖直接在两个主上都执行了同样的语句,但是当时已经设置了主从复制, master1 和 master2 就发生了冲突, 导致主从同步状态出现异常。

解决方案

master1 和 master2 上都执行以下语句:

stop slave; 
#表示跳过一步错误,数字可变
set global sql_slave_skip_counter =1;
start slave;

slave1 和 slave2 上都执行以下语句:

stop slave for channel 'master1';
set global sql_slave_skip_counter=1;
start slave for channel 'master1';

stop slave for channel 'master2';
set global sql_slave_skip_counter=1;
start slave for channel 'master2';

以上是关于MySQL双主双从 + 多源复制配置的主要内容,如果未能解决你的问题,请参考以下文章

mysql双主双从负载均衡方案

mysql搭建主从复制(一主一从,双主双从)

Mycat实现MySQL主从复制和读写分离(双主双从)

MySQL主从复制搭建之一主一从双主双从搭建

mycat双主双从主从,主从复制和读写分离实现

keepalived双主双从配置