概念介绍说明:
在实际企业应用环境中,可能出现下图情况;会有多个企业系统场景,并且每个业务场景会构建不同主从架构,实现网站架构的解耦;
当业务相互独立拆分后,的确读写方面来说,都能感觉到有大量的备份,相比所有业务汇总在一起时,并发效率和性能都有大幅提升;
以上的业务架构设计,相当于进行垂直拆分;但是当需要进行数据信息统一查询分析时,变的非常困难,将会出现数据库孤岛问题;
早期架构上解决此问题,只能采取将所有业务数据汇总到一个到的数据库中,使数据分析工作变得很麻烦,并没有什么自动化解决方案;
当前有了比较好的解决思路,是利用数据中台技术,可以更好的将不同业务数据进行整合:
- 便于进行数据节点统一管理
- 便于进行数据信息统一分析(关注)
在mysql应用过程中,为了实现数据中台构建,可以将所有业务的主库数据信息,汇总到一个从库中,即实现多源复制功能(5.7+);
实现多源复制,会对不同业务主库有一定的性能影响,并且对于多源复制的目标从库,并不会做写操作,只用于做数据分析使用;

功能应用实践:
① 主从多源复制功能实现环境:
为了实现多源复制的主从同步,需要准备好主从架构环境:
| 主机角色 | 主机名称 | 地址信息 |
|---|---|---|
| 主库服务器 | 192.168.30.101 | 3306 |
| 主库服务器 | 192.168.30.102 | 3306 |
| 从库服务器 | 192.168.30.103 | 3306 |
对原有数据库服务环境清理:(基于GTID环境构建)
# 在所有主从节点均进行清理操作:
[root@master ~]# pkill mysqld
[root@master ~]# rm -rf /data/3306/*
[root@master ~]# rm -rf /data/binlog/*
[root@master ~]# \mv /etc/my.cnf /tmp
[root@master ~]# mkdir -p /data/3306/data /data/binlog
[root@master ~]# chown -R mysql.mysql /data/*
-- 所有数据库主从节点均进行以上清理操作;
# 主库db01配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
server_id=51
socket=/tmp/mysql.sock
log_bin=/data/binlog/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
secure-file-priv=/tmp
innodb_flush_method=O_DIRECT
-- 这个参数控制着innodb数据文件及redo log的打开、刷写模式
-- 参考资料:https://blog.csdn.net/h106140873/article/details/125701485
slow_query_log=ON
slow_query_log_file=/data/3306/data/db01-slow.log
long_query_time=0.1
log_queries_not_using_indexes
-- 生成慢日志信息功能配置参数
master_info_repository=TABLE
-- 将master_info信息以表方式记录
relay_log_info_repository=TABLE
-- 将relay_log_info信息以表方式记录
[client]
socket=/tmp/mysql.sock
[mysql]
prompt=db01 [\\d]>
-- 数据库命令提示符设置,可以参考官方设置:https://dev.mysql.com/doc/refman/8.0/en/mysql-commands.html
socket=/tmp/mysql.sock
EOF
# 主库db02配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
server_id=52
socket=/tmp/mysql.sock
log_bin=/data/binlog/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
secure-file-priv=/tmp
innodb_flush_method=O_DIRECT
slow_query_log=ON
slow_query_log_file=/data/3306/data/db02-slow.log
long_query_time=0.1
log_queries_not_using_indexes
master_info_repository=TABLE
relay_log_info_repository=TABLE
[client]
socket=/tmp/mysql.sock
[mysql]
prompt=db02 [\\d]>
socket=/tmp/mysql.sock
EOF
# 主库db03配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
server_id=53
socket=/tmp/mysql.sock
log_bin=/data/binlog/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
secure-file-priv=/tmp
innodb_flush_method=O_DIRECT
slow_query_log=ON
slow_query_log_file=/data/3306/data/db03-slow.log
long_query_time=0.1
log_queries_not_using_indexes
master_info_repository=TABLE
relay_log_info_repository=TABLE
[client]
socket=/tmp/mysql.sock
[mysql]
prompt=db03 [\\d]>
socket=/tmp/mysql.sock
EOF
# 进行数据库所有节点初始化操作
[root@master ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
[root@master-02 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
[root@master-03 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
# 启动数据库所有节点服务
[root@master ~]# /etc/init.d/mysqld start
[root@master-02 ~]# /etc/init.d/mysqld start
[root@master-03 ~]# /etc/init.d/mysqld start
② 主从多源复制重构主从环境
# 重构主从关系-主库操作
db01 [(none)]>set sql_log_bin=0;
db01 [(none)]>create user repl@'192.168.30.%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.01 sec)
db01 [(none)]>grant replication slave on *.* to repl@'192.168.30.%';
Query OK, 0 rows affected (0.00 sec)
db01 [(none)]>set sql_log_bin=1;
-- 两个主库上创建主从复制用户信息,并且不要产生创建用户日志信息,因为多个主节点可能用户信息不一致,会导致同步异常
# 重构主从关系-从库操作
db03 [(none)]>change master to
master_host='192.168.30.101',
master_user='repl',
master_password='123456',
master_auto_position=1 for channel 'Master_1';
db03 [(none)]>change master to
master_host='192.168.30.102',
master_user='repl',
master_password='123456',
master_auto_position=1 for channel 'Master_2';
db03 [(none)]> start slave for channel 'Master_1';
db03 [(none)]> start slave for channel 'Master_2';
③ 主从多源复制监控信息查看
db03 [(none)]> show slave status for channel 'Master_1'\G
db03 [(none)]> show slave status for channel 'Master_2'\G
-- 多源主从状态监控信息分别查看,重点关注Channel_Name信息和IO SQL线程状态
db03 [(none)]> use performance_schema;
db03 [(none)]> select * from replication_connection_configuration\G
db03 [(none)]> select * from replication_connection_status where channel_name='master_1'\G
db03 [(none)]> select * from replication_connection_status where channel_name='master_2'\G
-- 多源主从状态监控信息汇总查看,或进行单独查看
db03 [(none)]> select * from performance_schema.replication_applier_status_by_worker\G;
-- 多源主从复制线程工作情况查看,了解即可
④ 主从多源复制数据信息过滤
如果多个主库之间存在相同的数据表信息,在进行多源复制时,需要进行过滤处理,避免汇总在从库中产生数据不一致的情况;
db03 [(none)]> change replication filter replicate_wild_do_table=('db1.%') channel "Master_1";
db03 [(none)]> change replication filter replicate_wild_do_table=('db2.%') channel "Master_2";