热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql同一库多源复制_mysql5.7多源复制(用于生产库多主库合并到一个查询从库)...

目前我们使用的是主从分库分表的系统架构,主库有N个分库,从库为多个slave做负载均衡,所以数据库端的架构是下面这样的:这就

目前我们使用的是主从+分库分表的系统架构,主库有N个分库,从库为多个slave做负载均衡,所以数据库端的架构是下面这样的:

20180703211723702912.png

这就涉及到多个主库数据同步到不分库分表的从库共查询和管理类系统使用。在mysql 5.6以及之前的版本中,没有原生的解决方法,除非使用mariadb分支,在mysql 5.7之后支持多源复制,除了使用原生的多源复制之外,还有一个选择,就是使用案例开源的otter/canal。如果只是N个库合并到一个库的,我们使用mysql原生的复制,因为无论从稳定性还是运维成本、系统要求的角度,mysql复制都合理的多。对于需要特殊处理比较多的或者目标库为oracle的,我们使用otter/canal。文本讲述mysql多源的搭建。下一文中,我们会讲述完整的otter环境搭建并进行简单的性能测试。

首先安装mysql 5.7,推荐使用percona server,相关参数优化推荐等请参考mysql安装以及配置参数优化。

因为环境限制,两个主节点在同一台机器,从节点另外一台机器。

172.28.1.97 3307 主1

172.28.1.97 3308 主2

10.20.24.89 3308 从

同时172.28.1.97 3308 主2有三个database,ta_1,ta_2,ta_base,均同步到从库的ta库。

和mysql一主一从复制相比,多源复制加入了一个叫做Channel的概念, 每一个Channel都是一个独立的Slave,都有一个IO_THREAD和SQL_THREAD。原理和普通复制一样。我们只需要对每一个Master执行Change Master 语句,只需要在每个语句最后使用For Channel来进行区分。多源复制和正常主从其他的配置都一样,基本上主库开下binlog、server-id不一样就可以了,只有下列额外限制:

master-info-repository必须为TABLE

relay-log-info-repository必须为TABLE

以FOR CHANNEL ‘CHANNEL_NAME‘区分不同的master。

首先参考mysql单机版安装mysql 5.7安装与参数优化,下列为slave直接相关的参数,在/etc/my.cnf中额外或者修改下列参数:

master-info-repository=TABLE

relay-log-info-repository=TABLE

# replicate-rewrite-db 多库同步到单库,库名重写,其他的replicate-*会在replicate-rewrite-db评估后执行,多个映射的话,配置文件中包含多行即可,这个设计好傻,为啥不逗号或者分号分隔呢。如果同时有多个replicate*过滤器,先评估数据库级别的、然后表级别的;先评估do,后评估ignore(也就是在白名单或者不在黑名单的模式)。比如,主库多个分库合并到从库一个库

replicate-rewrite-db=ta_base->ta

replicate-rewrite-db=ta_1->ta

replicate-rewrite-db=ta_2->ta

sync_relay_log=1

relay_log_recovery=1

slave-parallel-type=LOGICAL_CLOCK

slave-parallel-workers=16 #具体值多少合适需要性能测试得到,一般cpu数量即可

server-id = 2

replicate-do-db # 如果只要同步某些库

replicate-ignore-db #如果只需要不同步某些库

slave-skip-errors=ddl_exist_errors #建议不要同步ddl

log_slave_updates=ON(GTID模式必须开始log_slave_updates,对性能有一定影响,Mysql 5.7之后从节点可以不开启binlog)

skip-slave-start=false #默认false,也就是server重启的时候会自动启动slave,不建议修改

启动mysql服务器。

MySQL [(none)]> SET GLOBAL master_info_repository = ‘TABLE‘;

Query OK,0 rows affected (0.00sec)

MySQL[(none)]> SET GLOBAL relay_log_info_repository = ‘TABLE‘;

Query OK,0 rows affected (0.00sec)--注:不同于设置全局变量,所有这些通过change master修改的信息都有存储在performance_schema的replication相关表中,重启后不会失效,复制连接信息存储在performance_schema库的replication_connection_configuration表中,IO线程当前状态在replication_connection_status。SQL线程的配置和状态分别在replication_applier_configuration和replication_applier_status表。

所有这些通过change/replication修改的信息都有存储在performance_schema的replication相关表中,重启后会失效,一定要同时保存到配置文件中

MySQL[(none)]> CHANGE MASTER TO MASTER_HOST=‘172.18.1.97‘,MASTER_PORT=3307,MASTER_USER=‘repl‘, MASTER_PASSWORD=‘123456‘,MASTER_LOG_FILE=‘mysql-bin.000001‘,MASTER_LOG_POS=1834 FOR CHANNEL ‘Master_3307‘;

Query OK,0 rows affected, 2 warnings (0.03sec)

MySQL[(none)]> CHANGE MASTER TO MASTER_HOST=‘172.18.1.97‘,MASTER_PORT=3308,MASTER_USER=‘repl‘, MASTER_PASSWORD=‘123456‘,MASTER_LOG_FILE=‘mysql-bin.000002‘,MASTER_LOG_POS=7484 FOR CHANNEL ‘Master_3308‘;

Query OK,0 rows affected, 2 warnings (0.01sec)

MySQL[(none)]> start slave for channel ‘Master_3307‘;

Query OK,0 rows affected (0.00sec)

MySQL[(none)]> start slave for channel ‘Master_3308‘;

Query OK,0 rows affected (0.01sec)

MySQL[(none)]> show slave status for channel ‘Master_3307‘\G;*************************** 1. row ***************************Slave_IO_State: Connectingtomaster

Master_Host:172.18.1.97Master_User: repl

Master_Port:3307Connect_Retry:60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos:1834Relay_Log_File: slave-relay-bin-master_3307.000001Relay_Log_Pos:4Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: Connecting

Slave_SQL_Running: Yes

Replicate_Do_DB: ta

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno:0Last_Error:

Skip_Counter:0Exec_Master_Log_Pos:1834Relay_Log_Space:154Until_Condition: None

Until_Log_File:

Until_Log_Pos:0Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master:NULLMaster_SSL_Verify_Server_Cert: No

Last_IO_Errno:2003Last_IO_Error: error connectingto master ‘repl@172.18.1.97:3307‘ - retry-time: 60 retries: 1Last_SQL_Errno:0Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id:0Master_UUID:

Master_Info_File: mysql.slave_master_info

SQL_Delay:0SQL_Remaining_Delay:NULLSlave_SQL_Running_State: Slave hasread all relay log; waiting formore updates

Master_Retry_Count:86400Master_Bind:

Last_IO_Error_Timestamp:180703 08:23:54Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position:0Replicate_Rewrite_DB: (ta_base,ta),(ta_1,ta),(ta_2,ta)

Channel_Name: master_3307

Master_TLS_Version:1 row in set (0.00sec)

ERROR: No query specified

MySQL[(none)]> show slave status for channel ‘Master_3308‘\G;*************************** 1. row ***************************Slave_IO_State: Connectingtomaster

Master_Host:172.18.1.97Master_User: repl

Master_Port:3308Connect_Retry:60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos:7484Relay_Log_File: slave-relay-bin-master_3308.000001Relay_Log_Pos:4Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: Connecting

Slave_SQL_Running: Yes

Replicate_Do_DB: ta

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno:0Last_Error:

Skip_Counter:0Exec_Master_Log_Pos:7484Relay_Log_Space:154Until_Condition: None

Until_Log_File:

Until_Log_Pos:0Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master:NULLMaster_SSL_Verify_Server_Cert: No

Last_IO_Errno:2003Last_IO_Error: error connectingto master ‘repl@172.18.1.97:3308‘ - retry-time: 60 retries: 1 #这里是因为后来网断了,前面忘了截图下来Last_SQL_Errno:0Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id:0Master_UUID:

Master_Info_File: mysql.slave_master_info

SQL_Delay:0SQL_Remaining_Delay:NULLSlave_SQL_Running_State: Slave hasread all relay log; waiting formore updates

Master_Retry_Count:86400Master_Bind:

Last_IO_Error_Timestamp:180703 08:23:58Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position:0Replicate_Rewrite_DB: (ta_base,ta),(ta_1,ta),(ta_2,ta)

Channel_Name: master_3308

Master_TLS_Version:1 row in set (0.00sec)

ERROR: No query specified

MySQL[(none)]> exitBye

其他注意点

mysql仅支持实例级别设置计数器的步长,通过auto_increment_increment参数控制,这样分库分表的时候,自增表的auto_increment就需要区分开从1还是2开始。

在mysql 8.0之前,global参数在重启之后就会失效,所以对于可以动态修改的全局参数,需要同时修改my.cnf配置文件确保重启后保持一致。



推荐阅读
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • 什么是网关服务器初学linux服务器开发时,我们的服务器是很简单的,只需要一个程序完成与客户端的连接,接收客户端数据,数据处理,向客户端发送数据。但是在处理量很大的情况下,一 ... [详细]
  • PartI:取经处: http:www.ramkitech.com201210tomcat-clustering ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
  • 目录Atlas介绍Atlas部署Atlas基本管理Atlas结合MHA故障恢复读写分离建议Atlas介绍Atlas是由Qihoo360Web平台部基础架构团队开发维护的一个基于My ... [详细]
  • php网站设计实验报告,php网站开发实训报告
    本文目录一览:1、php动态网站设计的关键技术有哪些软件,及搭建步骤需要哪些页面,分别完成 ... [详细]
  • Nginxgaodaima.comnginx属于七层架构,支持的是http协议,本身对tcp协议没有支持。所以不能代理mysql等实现负载均衡。但是lvs这个东西不熟悉,主要是公司 ... [详细]
  • 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)【下载本文PDF进行阅读】设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践。在经过多年的软件开发实践之后,回过头 ... [详细]
  • Kubernetes(k8s)基础简介
    Kubernetes(k8s)基础简介目录一、Kubernetes概述(一)、Kubernetes是什么(二& ... [详细]
author-avatar
叶子已经不是木头的了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有