MySQL双主双从 + 多源复制配置
Posted 盛夏温暖流年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL双主双从 + 多源复制配置相关的知识,希望对你有一定的参考价值。
本文主要介绍 mysql 数据库的双主双从架构, 其中主从同步采用多源复制的机制。
一. 数据库架构介绍
本次搭建的 MySQL 数据库架构图如下所示:
其中,master1 和 master2 是两台主库,负责数据增删改操作。
这两台主库的主从关系为互为主从,且在 Haproxy 中配置 master1 是主库,master2 是备库,正常情况下 master1 提供数据增删改操作,master2 作为备份库实时同步 master1 的数据更新,一旦主库 master1 出现异常,Haproxy 将会切换到备库 master2 继续提供数据增删改操作。
slave1 和 slave2 是两台从库,且配置了只读属性,负责系统数据读取操作。
两台从库 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_Running 和 Slave_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双主双从 + 多源复制配置的主要内容,如果未能解决你的问题,请参考以下文章