1、概述

以下是多源复制的架构图(来自2015 OOW的ppt)

Mysql多源复制_第1张图片


本文档实验的架构图:

Mysql多源复制_第2张图片

2、所需软件

Mysql多源复制_第3张图片

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上。整个架构就变成这样了。

Mysql多源复制_第4张图片


方法二:

在mutilple数据库上使用过滤条件,这种情况的过滤实质是这样的。每个源库都有把数据传到mutiple数据库,存储为中继日志,只是在mutiple端没有使用sql thread去解析,执行这些语句而已,还是占用了网络带宽,影响源库的性能。

7.4、多源到底能支持多少个源呢