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

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

多主单从架构好处:
一、在从服务器进行数据汇总,如果我们的主服务器进行了分库分表的操作,为了实现后期的一些数据统计功能,往往需要把数据汇总在一起再统计。
二、如果我们想在从服务器时时对主服务器的数据进行备份,在MySQL 5.7之前每一个主服务器都需要一个从服务器,这样很容易造成资源浪费,同时也加大了DBA的维护成本,但MySQL 5.7引入多源复制,可以把多个主服务器的数据同步到一个从服务器进行备份。
需要注意的地方:
master复制到slave上不能有同名的库,比如master1上面有test库如果test2上也有test库那么复制到slave那么将会出错。
规划:
hostname 依据你自己的规划,IP 也已经你的规划,OS 是6.7 我这里因为用的是公司剩余的老机器所以IP 和 hostname 都未做变更,但是网络是互相打通的。
Hostname | OS | IP |
Zabbixdb(master1) | Centos 6.7 64位 | 10.86.86.72 |
EvunMonitor(master2) | Centos 6.7 64位 | 10.86.93.191 |
oracle12c(slave) | Centos 6.7 64位 | 10.86.87.161 |
mysql程序 | /usr/local/mysql |
Mydql 数据文件 | /data/mysqldb |
其他配置:
关闭iptables
【命令】
主机zabbixdb:
[root@ Zabbixdb] /etc/init.d/iptables stop
[root@ Zabbixdb]chkconfig iptables off
[root@ Zabbixdb]chkconfig --list|grepiptables
iptables 0:off1:off2:off3:off4:off5:off6:off
主机EvunMonitor:
[root@ EvunMonitor] /etc/init.d/iptablesstop
[root@ EvunMonitor]chkconfig iptables off
[root@ EvunMonitor]chkconfig --list|grepiptables
iptables 0:off1:off2:off3:off4:off5:off6:off
主机oracle12c:
[root@ oracle12c] /etc/init.d/iptables stop
[root@ oracle12c]chkconfig iptables off
[root@ oracle12c]chkconfig --list|grepiptables
iptables 0:off1:off2:off3:off4:off5:off6: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 replicationslave on *.* to 'repl'@'10.86.87.161' identified by 'repl';
[EvunMonitor] grant replicationslave 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
分别找出zabbixdb和EvunMonitor的binlog位置和Pos位置:
【命令】
[root@oracle12c 15:51:24]$catzabbixdb.sql |grep " CHANGE MASTER"
-- CHANGE MASTER TOMASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=759;
[root@oracle12c 15:51:32]$catevunmonitor.sql |grep " CHANGE MASTER"
-- CHANGE MASTER TOMASTER_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 TOMASTER_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 TOMASTER_HOST='10.86.93.191',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='binlog.000003',MASTER_LOG_POS=782 FOR CHANNEL 'EvunMonitor';
QueryOK, 0 rows affected, 2 warnings (0.06 sec)
启动复制进程有两种方式:直接startslave 和启动单个复制源的方式
【命令】
[root@oracle12c 16:01:20]mysql -uroot -ppassword
mysql>start slave;
单个启动
mysql>start slave forchannel 'zabbixdb';
mysql>start slave forchannel 'EvunMonitor';
查看状态:
正常启动后,可以查看同步的状态:
执行SHOW SLAVE STATUS FORCHANNEL 'zabbixdb'\G

执行SHOW SLAVE STATUS FORCHANNEL '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)
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!