1、概述
以下是多源复制的架构图(来自2015 OOW的ppt)
本文档实验的架构图:
2、所需软件
3、MySQL软件的安装(在四台服务器上都装上MySQL5.7.9数据库软件)
3.1、查询服务器上是否已经安装mysql
[root@master ~]#rpm -aq | grep mysql
mysql-server-5.1.66-2.el6_3.x86_64
mysql-libs-5.1.66-2.el6_3.x86_64
mysql-devel-5.1.66-2.el6_3.x86_64
qt-mysql-4.6.2-25.el6.x86_64
mysql-5.1.66-2.el6_3.x86_64
3.2、先卸载旧的版本
rpm -e mysql --nodeps --allmatches (不理会依赖关系,删除所有上一步查出来的mysql)
[root@master ~]#rpm -e mysql-server-5.1.66-2.el6_3.x86_64 --nodeps --allmatches
[root@master ~]#rpm -e mysql-libs-5.1.66-2.el6_3.x86_64 --nodeps --allmatches
[root@master ~]#rpm -e mysql-devel-5.1.66-2.el6_3.x86_64 --nodeps --allmatches
[root@master ~]#rpm -e qt-mysql-4.6.2-25.el6.x86_64 --nodeps --allmatches
[root@master ~]#rpm -e mysql --nodeps --allmatches
[root@master ~]#rpm -aq | grep mysql
3.3、安装软件
rpm -ivfmysql-community-libs-compat-5.7.9-1.el6.x86_64.rpm
rpm -ivfmysql-community-libs-5.7.9-1.el6.x86_64.rpm
rpm -ivfmysql-community-common-5.7.9-1.el6.x86_64.rpm
rpm -ivfmysql-community-client-5.7.9-1.el6.x86_64.rpm
rpm -ivfmysql-community-embedded-5.7.9-1.el6.x86_64.rpm
rpm -ivfmysql-community-embedded-devel-5.7.9-1.el6.x86_64.rpm
rpm -ivfmysql-community-server-5.7.9-1.el6.x86_64.rpm
rpm -ivfmysql-community-devel-5.7.9-1.el6.x86_64.rpm
rpm -ivfmysql-community-libs-5.7.9-1.el6.x86_64.rpm
rpm -ivfmysql-community-test-5.7.9-1.el6.x86_64.rpm
3.4、MySQL 5.7.9修改密码
service mysqldstart
查看密码
sudo grep'temporary password' /var/log/mysqld.log
进入mysql,修改密码
setpassword=password(‘Apexapex@123’);
3.5、开启mysql的3306端口号,给root用户授权,用于远程访问
3.5.1、开启mysql端口号及关闭Selinux
/sbin/iptables-I INPUT -p tcp --dport 3306 -j ACCEPT
/sbin/iptables-I INPUT -p udp --dport 3306 -j ACCEPT
/etc/rc.d/init.d/iptablessave
/etc/rc.d/init.d/iptablesrestart
关闭Selinux
sed -i'/SELINUX/s/enforcing/disabled/' /etc/selinux/config
3.5.2、给root用户授权,使远程客户端才能够连接过来
GRANT ALLPRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Apexapex@123' WITH GRANT OPTION;
4、主备复制配置步骤如下(master与slave配置)
4.1、修改主服务器的配置文件
vi /etc/my.cnf
在[mysqld]下添加以下内容
log_bin=/var/lib/mysql/mysql-bin
server-id = 67
gtid_mode=ON
enforce_gtid_consistency=ON
4.2、修改备服务器slave
vi /etc/my.cnf
在[mysqld]下添加以下内容
log_bin=/var/lib/mysql/mysql-bin
server-id = 68
master_info_repository=TABLE
relay_log_info_repository=TABLE
gtid_mode=ON
enforce_gtid_consistency=ON
4.3、重启两台服务器的mysql
/etc/init.d/mysqlrestart
4.4、在主服务器上建立帐户并授权slave
# mysql -u root-p
Enter password:
GRANTREPLICATION SLAVE ON *.* TO apexsoft@'%' IDENTIFIED BY 'Apexapex@123';
GRANT REPLICATIONSLAVE ON *.* TO rep@'%' IDENTIFIED BY 'Apexapex@123';
flushprivileges;
4.5、配置备服务器slave
CHANGE MASTER TOMASTER_HOST = '192.168.1.67', MASTER_PORT = 3306,MASTER_USER = 'apexsoft',MASTER_PASSWORD = 'Apexapex@123',MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master1';
启动备服务器复制功能
mysql>start slave;
4.6、检查备服务器复制功能状态
mysql> show slavestatus\G;
注:Standby_IO及Standby_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
以上操作过程,主备服务器配置完成。
4.7、主备服务器测试
主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:
mysql> create database apex_db;
Query OK, 1 rowaffected (0.00 sec)
mysql> useapex_db;
Database changed
mysql> create table apex_tb(id int(3),name char(10));
Query OK, 0 rowsaffected (0.00 sec)
mysql> insertinto apex_tb values(001,' apex ');
Query OK, 1 rowaffected (0.00 sec)
mysql> showdatabases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|apex_db |
| mysql |
|test |
+--------------------+
4rows in set (0.00 sec)
备服务器Mysql查询:
mysql> show databases;
+--------------------+
|Database |
+--------------------+
|information_schema |
| apex_db |
|mysql |
|test |
+--------------------+
4rows in set (0.00 sec)
mysql> use apex_db
Database changed
mysql> select* from apex_tb; //可以看到在主服务器上新增的具体数据
+------+------+
|id | name |
+------+------+
| 1 | apex |
+------+------+
1row in set (0.00 sec)
5、节点master1配置
5.1、修改主服务器master1
vi /etc/my.cnf
在[mysqld]下添加以下内容
log_bin=/var/lib/mysql/mysql-bin
server-id = 66
port=3306
gtid_mode=ON
enforce_gtid_consistency=ON
5.2、在主服务器上建立帐户并授权给multiple
# mysql -u root-p
Enter password:
mysql> GRANTREPLICATION STANDBY ON *.* TO apexsoft1@'%' IDENTIFIED BY '123456';
mysql>flushprivileges;
6、节点multiple(多源复制到的节点)配置
6.1、修改multiple的配置文件
vi /etc/my.cnf
在[mysqld]下添加以下内容
log_bin=/var/lib/mysql/mysql-bin
server-id = 69
master_info_repository=TABLE
relay_log_info_repository=TABLE
gtid_mode=ON
enforce_gtid_consistency=ON
6.2、配置multiple服务器
CHANGE MASTER TOMASTER_HOST = '192.168.1.66', MASTER_PORT = 3306,MASTER_USER = 'apexsoft1',MASTER_PASSWORD = 'Apexapex@123',MASTER_AUTO_POSITION = 1 FOR CHANNEL'master1';
CHANGE MASTER TOMASTER_HOST = '192.168.1.67', MASTER_PORT = 3306,MASTER_USER = 'rep',MASTER_PASSWORD = 'Apexapex@123',MASTER_AUTO_POSITION = 1 FOR CHANNEL'master2';
start slave forchannel ‘master1’;
start slave forchannel ‘master2’;
show slavestatus\G;
7、关于多源复制常见问题
7.1、主键冲突解决方法
7.1.1、方法一:在multiple上取消唯一性约束、主键约束
可能产生的后果是,在multiple上进行查询时,不走主键的索引,查询效率变慢。
7.1.2、方法二:在master与master1上对同一库或同一表上分别取不同的名字
7.2、增加标志位来显示属于哪个库同步过来的
方法一:在建表时,直接增加一列来标识属于哪台数据库。
方法二:在master与master1上对同一库或同一表上分别取不同的名字,同步到multiple后,通过建立视图增加一列来标识属于哪一个库。如 t2表与t3表:
create viewTview as select id,name, 't2' as 'SIGN' from t2 union select id,name, 't3' as'SIGN' from t3;
7.3、过滤功能
在单台的情况(没有主从的情况),可以在该台数据库上使用过滤条件;
在主从架构的情况,如果在主库使用过滤条件,也会把备库进行过滤的,所以不能在主库使用过滤。可以考虑以下两种方法:
方法一:
可以在备库上使用过滤条件,然后让备库把数据同步到multiple上。整个架构就变成这样了。
方法二:
在mutilple数据库上使用过滤条件,这种情况的过滤实质是这样的。每个源库都有把数据传到mutiple数据库,存储为中继日志,只是在mutiple端没有使用sql thread去解析,执行这些语句而已,还是占用了网络带宽,影响源库的性能。