MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制、基于组提交的并行复制、在线修改Replication Filter、GTID增强、半同步复制增强等。

多源复制:多源复制加入了一个叫做Channel的概念, 每一个Channel都是一个独立的Slave,都有一个IO_THREAD和SQL_THREAD。原理和普通复制一样。我们只需要对每一个Master执行Change Master 语句,只需要在每个语句最后使用For Channel来进行区分。由于复制的原理没有改变,在没有开启GTID的时候Master的版本可以是MySQL5.5、5.6、5.7。并且从库需要master-info-repositoryrelay-log-info-repository设置为table,否则会报错:

ERROR 3077 (HY000): To have multiple channels, repository cannot be of type FILE; Please check the repository configuration and convert them to TABLE.

这里需要注意:从的版本若是5.7.x~5.7.13,主的版本不能是MySQL5.5,因为MySQL5.5没有server_uuid函数。该问题在MySQL5.7.13里修复(Bug #22748612)。

部署三个MySQL实例

MySQL5.5镜像:https://www.cnblogs.com/wshenjin/p/9585696.html

MySQL5.7镜像:https://www.cnblogs.com/wshenjin/p/10100949.html

环境

[root@Docker_Machine_192.168.31.130 ~]# mkdir -p  mysql5.5_master1/data  mysql5.5_master2/data  mysql5.7_slave/data
[root@Docker_Machine_192.168.31.130 ~]# chown mysql:mysql -R mysql5.5_master* mysql5.7_slave1

slave的配置文件:

server-id=3
#rep
log_slave_updates = 1
master_info_repository=TABLE
relay_log_info_repository=TABLE
replicate_wild_ignore_table=mysql.%

不管是使用基于二进制日志的复制或者基于事务的复制,要开启多源复制功能,必须需要在从库上设置master_info_repository和relay_log_info_repository两个参数为’TABLE’(在mysql库下可以看见这两个表信息),是用来存储同步信息的,可以设置的值为’FILE’和’TABLE’,默认是FILE。为’FILE’时,会生成master.info 和 relay-log.info两个文件,如果是’TABLE’,信息就会存在mysql.slave_relay_log_info和mysql.slave_master_info两个表中。

GLOBAL master_info_repositoryGLOBAL relay_log_info_repository这两个值可以动态调整:

mysql> SET GLOBAL master_info_repository = 'TABLE';
mysql> SET GLOBAL relay_log_info_repository = 'TABLE';

启动两个master实例:

[root@Docker_Machine_192.168.31.130 ~]# docker run -itd -v /data/dokcer/docker_local_volume/mysql5.5_master1/data/:/data/database/mysql/ -v /data/dokcer/docker_local_volume/mysql5.5_master1/my.cnf:/etc/my.cnf  --network=net_bridge_192.168.2.0 --ip=192.168.2.101 --name=mysql5.5_master1 volumes/my_percona_server:v5.5.61.2
[root@Docker_Machine_192.168.31.130 ~]# docker run -itd -v /data/dokcer/docker_local_volume/mysql5.5_master2/data/:/data/database/mysql/ -v /data/dokcer/docker_local_volume/mysql5.5_master2/my.cnf:/etc/my.cnf --network=net_bridge_192.168.2.0 --ip=192.168.2.102 --name=mysql5.5_master2 volumes/my_percona_server:v5.5.61.2

启动一个slave实例

[root@Docker_Machine_192.168.31.130 ~]# docker run -itd -v /data/dokcer/docker_local_volume/mysql5.7_slave/data/:/data/database/mysql/ -v /data/dokcer/docker_local_volume/mysql5.7_slave/my.cnf:/etc/my.cnf  --network=net_bridge_192.168.2.0 --ip=192.168.2.100 --name=mysql5.7_slave  me/my_percona_server:5.7.23.24

建立主从

两个主库上对从库进行主从授权

mysql> grant replication slave , replication client on *.* to slave@192.168.2.100 identified by 'slave#123';
Query OK, 0 rows affected (0.00 sec) mysql> flush privileges ;
Query OK, 0 rows affected (0.00 sec) mysql> quit
Bye

从主库上导数据和查看**master status **就忽略了

从库建立主从

mysql> change master to  master_host='192.168.2.101', master_port=3306, master_user='slave', master_password='slave#123', master_log_file='mysql-bin.000004', master_log_pos=357 for channel 'master1';
Query OK, 0 rows affected, 2 warnings (0.05 sec) mysql> change master to master_host='192.168.2.102', master_port=3306, master_user='slave', master_password='slave#123', master_log_file='mysql-bin.000004', master_log_pos=357 for channel 'master2';
Query OK, 0 rows affected, 2 warnings (0.04 sec)

多源复制的相关操作:

查看单个channel的状态:

mysql> show slave status for channel 'master1'\G

停止单个channel的同步:

mysql> stop slave for channel 'master1';

开启单个channel的同步:

mysql> start slave for channel 'master1';

重置单个channel:

mysql> reset slave all for channel 'master1';

查看所有channel:

mysql> show slave status\G

停止所有channel:

mysql> stop slave;

开启所有channel:

mysql> start slave;

监控

监控:系统库performance_schema增加了一些replication的监控表:

mysql> use performance_schema
Database changed
mysql> show tables like 'replicat%';
+-------------------------------------------+
| Tables_in_performance_schema (replicat%) |
+-------------------------------------------+
| replication_applier_configuration |###查看各个channel是否配置了复制延迟
| replication_applier_status |###查看各个channel是否复制正常(service_state)以及事务重连的次数
| replication_applier_status_by_coordinator |###查看各个channel是否复制正常,以及复制错误的code、message和时间
| replication_applier_status_by_worker |###查看各个channel是否复制正常,以及并行复制work号,复制错误的code、SQL和时间
| replication_connection_configuration |###查看各个channel的连接配置信息:host、port、user、auto_position等
| replication_connection_status |###查看各个channel的连接信息
| replication_group_member_stats |###
| replication_group_members |###
+-------------------------------------------+

Replication Filter

在线过滤mysql库:

先关闭sql线程,要是在多源复制中,是关闭所有channel的sql thread。

mysql> stop slave sql_thread;
Query OK, 0 rows affected (0.01 sec) mysql> CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB=(mysql); mysql> start slave sql_thread;
Query OK, 0 rows affected (0.04 sec)

若要还原,stop slave sql_thread,然后置空REPLICATE_IGNORE_DB即可。

Replication Filter的语法:

CHANGE REPLICATION FILTER filter[, filter][, ...]

filter:
REPLICATE_DO_DB = (db_list)
| REPLICATE_IGNORE_DB = (db_list)
| REPLICATE_DO_TABLE = (tbl_list)
| REPLICATE_IGNORE_TABLE = (tbl_list)
| REPLICATE_WILD_DO_TABLE = (wild_tbl_list)
| REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list)
| REPLICATE_REWRITE_DB = (db_pair_list) db_list:
db_name[, db_name][, ...] tbl_list:
db_name.table_name[, db_table_name][, ...]
wild_tbl_list:
'db_pattern.table_pattern'[, 'db_pattern.table_pattern'][, ...] db_pair_list:
(db_pair)[, (db_pair)][, ...] db_pair:
from_db, to_db

不过这个配置还是要写到配置文件中,不然重启mysqld就没了

基于Docker搭建MySQL多源复制环境的更多相关文章

  1. 基于Docker搭建MySQL主从复制

    摘要: 本篇博文相对简单,因为是初次使用Docker,MySQL的主从复制之前也在Centos环境下搭建过,但是也忘的也差不多了,因此本次尝试在Docker中搭建. 本篇博文相对简单,因为是初次使用D ...

  2. 基于 Docker 搭建 MySQL 主从复制

    本篇博文相对简单,因为是初次使用Docker,MySQL的主从复制之前也在Centos环境下搭建过,但是也忘的也差不多了,因此本次尝试在Docker中搭建. 根据网上教程走还是踩了一些坑,不过所幸最终 ...

  3. Linux系统环境基于Docker搭建Mysql数据库服务实战

    开放端口规划: mysql-develop:3407 mysql-test: 3408 mysql-release: 3409 ps: 1.不推荐使用默认端口-3306,建议自定义端口 2.如果采用阿 ...

  4. 基于Docker的MySql

    MySQL Server安装教程 考虑到实际情况需要经常使用MySQL,为了方便大家能够快速基于Docker搭建MySQL这里以Linux下为例 进行说明,对于Windows用户来说直接通过查看官网H ...

  5. 基于Docker的Mysql主从复制搭建

    来源:https://www.cnblogs.com/songwenjie/p/9371422.html?tdsourcetag=s_pctim_aiomsg   为什么基于Docker搭建? 资源有 ...

  6. 基于Docker搭建大数据集群(一)Docker环境部署

    本篇文章是基于Docker搭建大数据集群系列的开篇之作 主要内容 docker搭建 docker部署CentOS 容器免密钥通信 容器保存成镜像 docker镜像发布 环境 Linux 7.6 一.D ...

  7. (转)基于keepalived搭建MySQL的高可用集群

    基于keepalived搭建MySQL的高可用集群  原文:http://www.cnblogs.com/ivictor/p/5522383.html MySQL的高可用方案一般有如下几种: keep ...

  8. Docker搭建MySQL的PXC集群

    原文:Docker搭建MySQL的PXC集群 一.简介 PXC属于一套近乎完美的mysql高可用集群解决方案,相比那些比较传统的基于主从复制模式的集群架构MHA和MM+keepalived,galer ...

  9. 基于Docker搭建大数据集群(六)Hive搭建

    基于Docker搭建大数据集群(六)Hive搭建 前言 之前搭建的都是1.x版本,这次搭建的是hive3.1.2版本的..还是有一点细节不一样的 Hive现在解析引擎可以选择spark,我是用spar ...

随机推荐

  1. Day8 函数指针做函数参数

    课堂笔记 课程回顾         多态 virtual关键字 纯虚函数 virtual func() = 0;         提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...

  2. VS 错误: 未找到与约束contractname Microsoft.VisualStudio.Utilities.IContentTypeRegistryService

    今天突然停电,vs重启的时候就出现了问题,最开始是提示如图1所示的错误,开始觉得可能这提示不重要,也就关闭不在提醒了,结果,vs启动是启动了,项目也开启了,但是生成的时候,依旧就报了图1的错 图1 去 ...

  3. mysql 命令行 备份 恢复数据

    找到mysql启动位置 whereis mysql 备份指定数据库 包括表结构和数据 使用命令mysqldump 数据库名 -u 用户名 -p > 存储文件路径 [root@izm5e16gjd ...

  4. 解决vscode更新后Ext Js插件无法使用问题

    解决方案来至于https://www.sencha.com/forum/showthread.php?471410-Bug-in-VS-Code-Plugin-since-VS-Code-Update ...

  5. ux.form.field.Year 只能选年的时间扩展

    效果如图,亲测6.2.1版本可用,用法同时间选择控件 //只选择年的控件 Ext.define('ux.picker.Year', { extend: 'Ext.Component', alias: ...

  6. vue---import的几种表现形式

    在使用vue开发项目的时候,很多使用会import很多模块,或者组件,下面说下import的几种表现形式: 例如:我在 src / api / table.js import request from ...

  7. springCloud之配置中心学习

    调试了好久,中与在地址栏输入http://localhost:9004/liyong-test/ms-dev.properties,奇迹出现了,终于可以访问我的配置中心了.这次也是碰运气,并没有觉得会 ...

  8. Codeforces Round #498 (Div. 3)

    被虐惨了,实验室里数十位大佬中的一位闲来无事切题(二,然后出了5t,当然我要是状态正常也能出5,主要是又热又有蚊子什么的... 题都挺水的.包括F题. A: 略 B: 找k个最大的数存一下下标然后找段 ...

  9. metasploit 常用命令备忘

    metasploit 常用命令备忘    MSFconsole Commands-------------------------------------24show exploits 查看所有exp ...

  10. 判断网页请求与FTP请求

    实例说明 在访问Internet网络时,经常涉及到很多访问协议,其中最明显.最常用的就是访问页面的http协议.访问ftp服务器的FTP协议等.