数据人成长交流的一站式服务平台

网站首页 > 数据编程 正文

实战:MySQL 5.7多源复制单slave 多master

nandi88 2024-10-01 00:20:55 数据编程 4 ℃



说明:学习该文档你需提前具备的能力:MySQL 5.7.17源码安装经验

MySQL 5.7版本之前的最常见的复制方式,一主一从或者一主多从的架构

MySQL 5.7之后就可以实现多主一从的复制:

多主单从架构好处:

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

二、如果我们想在从服务器时时对主服务器的数据进行备份,在MySQL 5.7之前每一个主服务器都需要一个从服务器,这样很容易造成资源浪费,同时也加大了DBA的维护成本,但MySQL 5.7引入多源复制,可以把多个主服务器的数据同步到一个从服务器进行备份。

需要注意的地方:

master 复制到slave上不能有同名的库,比如master 1 上面有test库 如果test2上也有test库那么复制到slave那么将会出错。

环境准备:

DB:MySQL 5.7.17

OS:Centos 6.7x64

规划

hostname 依据你自己的规划,IP 也已经你的规划,OS 是6.7 我这里因为用的是公司剩余的老机器所以IP 和 hostname 都未做变更,但是网络是互相打通的。

其他配置

关闭iptables

【命令】

[root@ Zabbixdb] /etc/init.d/iptables stop

[root@ Zabbixdb]chkconfig iptables off

[root@ Zabbixdb]chkconfig --list|grep iptables

iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off

主机EvunMonitor:

[root@ EvunMonitor] /etc/init.d/iptables stop

[root@ EvunMonitor]chkconfig iptables off

[root@ EvunMonitor]chkconfig --list|grep iptables

iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off

主机oracle12c:

[root@ oracle12c] /etc/init.d/iptables stop

[root@ oracle12c]chkconfig iptables off

[root@ oracle12c]chkconfig --list|grep iptables

iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off

关闭selinux

修改/etc/selinux/config

【命令】

主机zabbixdb、EvunMonitor、oracle12c

[root@ Zabbixdb] sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

[root@ EvunMonitor] sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

[root@ oracle12c] sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

重启服务器:

【命令】

主机zabbixdb、EvunMonitor、oracle12c

[root@ Zabbixdb] reboot

[root@ EvunMonitor]reboot

[root@ oracle12c] reboot

安装MySQL:

安装文档详细见:mysql 5.7.17源码安装.pdf

三台机器全部安装好mysql

修改my.cnf

【命令】

[zabbixdb] more /etc/my.cnf

max_connections=3000

lower_case_table_names=1

innodb_buffer_pool_size=24576M

log-bin=binlog

server_id=1

binlog_format=ROW

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

general_log=on

gtid_mode=ON

enforce_gtid_consistency = ON

[EvunMonitor] more /etc/my.cnf

innodb_buffer_pool_size=8589934592

max_connections=3000

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

log-bin=binlog

server_id=2

binlog_format=ROW

general_log=on

gtid_mode=on

enforce_gtid_consistency = ON

[oracle12c] more /etc/my.cnf

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

log-bin=binlog

server_id=3

binlog_format=ROW

general_log=on

gtid_mode=on

enforce_gtid_consistency = ON

重启mysql server

【命令】

[zabbixdb] /etc/init.d/mysqld restart

[EvunMonitor] /etc/init.d/mysqld restart

[oracle12c] /etc/init.d/mysqld restart

初始化准备:

在Zabbixdb(master1)EvunMonitor(master2)上创建数据库 模拟生产环境原有数据

【命令】

[zabbixdb]mysql -uroot -p

mysql>create database zabbixdb;

mysql>use zabbixdb;

mysql>create table zab(age int);

mysql>insert into zab values(1);

[EvunMonitor]mysql -uroot -p

mysql>create database evunmonitor;

mysql>use evunmonitor;

mysql>create table evun(age int);

mysql>insert into evun values(2);

在Zabbixdb(master1)EvunMonitor(master2) 上 导出我们刚才创建的数据库 要拿发送到slave上去初始化数据。(这里使用mysqldump 是因为数据量少如果是几十G 几百G的化那么使用xtrabackup 或者mysqlEB 更可行)

【命令】

[zabbixdb]mysqldump -uroot -ppassword --master-data=2 --single-transaction --databases --add-drop-database zabbixdb >zabbixdb.sql

[zabbixdb] scp zabbixdb.sql root@10.86.87.161:/opt

[EvunMonitor]mysqldump -uroot -ppassword --master-data=2 --single-transaction --databases --add-drop-database evunmonitor >evunmonitor.sql

[EvunMonitor] scp evunmonitor.sql root@10.86.87.161:/opt

搭建主从结构:

创建复制账号:

【命令】

[zabbixdb] grant replication slave on *.* to 'repl'@'10.86.87.161' identified by 'repl';

[EvunMonitor] grant replication slave on *.* to 'repl'@'10.86.87.161' identified by 'repl';

导入刚才备份数据入slave库:

在导入前先修改MySQL存储master-info和relay-info的方式,即从文件存储改为表存储,在my.cnf里添加以下选项:

master_info_repository=TABLE

relay_log_info_repository=TABLE

[oracle12c] more /etc/my.cnf

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

log-bin=binlog

server_id=3

binlog_format=ROW

general_log=on

gtid_mode=on

enforce_gtid_consistency = ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

【命令】

[oracle12c] mysql -uroot -ppassword <zabbixdb.sql;

[oracle12c]mysql -uroot -ppassword

mysql>reset master #没有这一步后面再导入会出错因为启用了GTID 模式。

[oracle12c] mysql -uroot -ppassword <evunmonitor.sql

分别找出zabbixdbEvunMonitor的binlog位置和Pos位置:

【命令】

[root@oracle12c 15:51:24]$cat zabbixdb.sql |grep " CHANGE MASTER"

-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=759;

[root@oracle12c 15:51:32]$cat evunmonitor.sql |grep " CHANGE MASTER"

-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=782;

同步操作:

登录Slave进行同步操作,分别change master到两台Master服务器,后面以FOR CHANNEL 'CHANNEL_NAME'区分。

【命令】

[root@oracle12c 15:51:32]mysql -uroot -ppassword

mysql>CHANGE MASTER TO MASTER_HOST='10.86.86.72', MASTER_USER='repl', MASTER_PASSWORD='repl',MASTER_LOG_FILE='binlog.000003',MASTER_LOG_POS=759 FOR CHANNEL 'zabbixdb';

Query OK, 0 rows affected, 2 warnings (0.05 sec)

mysql>CHANGE MASTER TO MASTER_HOST='10.86.93.191',MASTER_USER='repl', MASTER_PASSWORD='repl',MASTER_LOG_FILE='binlog.000003',MASTER_LOG_POS=782 FOR CHANNEL 'EvunMonitor';

Query OK, 0 rows affected, 2 warnings (0.06 sec)

启动复制进程有两种方式:直接start slave 和启动单个复制源的方式

【命令】

[root@oracle12c 16:01:20]mysql -uroot -ppassword

mysql>start slave;

单个启动

mysql>start slave for channel 'zabbixdb';

mysql>start slave for channel 'EvunMonitor';

查看状态:

正常启动后,可以查看同步的状态:

执行SHOW SLAVE STATUS FOR CHANNEL 'zabbixdb'\G

执行SHOW SLAVE STATUS FOR CHANNEL 'EvunMonitor'\G

验证:

【命令】

[zabbixdb@root]#mysql -uroot -ppassword

mysql> use zabbixdb;

mysql> insert into zab values(3);

Query OK, 1 row affected (0.07 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

[root@EvunMonitor ~]# mysql -uroot -ppassword

mysql> use evunmonitor;

mysql> insert into evun values(4);

Query OK, 1 row affected (0.02 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

到slave 上去验证:

Database changed

mysql> select * from zabbixdb.zab;

+------+

| age |

+------+

| 1 |

| 3 |

+------+

2 rows in set (0.00 sec)

mysql> select * from evunmonitor.evun;

+------+

| age |

+------+

| 2 |

| 4 |

+------+

2 rows in set (0.00 sec)

最近发表
标签列表