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

  因为差不多有一年半没有专门搞技术为主了,顺带回顾下。

  这就涉及到多个主库数据同步到不分库分表的从库共查询和管理类系统使用。在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 + 1022 #建议不要同步ddl(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146,1022)
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.00 sec) MySQL [(none)]> SET GLOBAL relay_log_info_repository = 'TABLE';
Query OK, 0 rows affected (0.00 sec) -- 注:不同于设置全局变量,所有这些通过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='',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1834 FOR CHANNEL 'Master_3307';
Query OK, 0 rows affected, 2 warnings (0.03 sec) MySQL [(none)]> CHANGE MASTER TO MASTER_HOST='172.18.1.97',MASTER_PORT=3308,MASTER_USER='repl', MASTER_PASSWORD='',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=7484 FOR CHANNEL 'Master_3308';
Query OK, 0 rows affected, 2 warnings (0.01 sec) MySQL [(none)]> start slave for channel 'Master_3307';
Query OK, 0 rows affected (0.00 sec) MySQL [(none)]> start slave for channel 'Master_3308';
Query OK, 0 rows affected (0.01 sec) MySQL [(none)]> show slave status for channel 'Master_3307'\G;
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: 172.18.1.97
Master_User: repl
Master_Port: 3307
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1834
Relay_Log_File: slave-relay-bin-master_3307.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_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: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1834
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 2003
Last_IO_Error: error connecting to master 'repl@172.18.1.97:3307' - retry-time: 60 retries: 1
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: 180703 08:23:54
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB: (ta_base,ta),(ta_1,ta),(ta_2,ta)
Channel_Name: master_3307
Master_TLS_Version:
1 row in set (0.00 sec) ERROR: No query specified MySQL [(none)]> show slave status for channel 'Master_3308'\G;
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: 172.18.1.97
Master_User: repl
Master_Port: 3308
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 7484
Relay_Log_File: slave-relay-bin-master_3308.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000002
Slave_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: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 7484
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 2003
Last_IO_Error: error connecting to master 'repl@172.18.1.97:3308' - retry-time: 60 retries: 1 #这里是因为后来网断了,前面忘了截图下来
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: 180703 08:23:58
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB: (ta_base,ta),(ta_1,ta),(ta_2,ta)
Channel_Name: master_3308
Master_TLS_Version:
1 row in set (0.00 sec) ERROR: No query specified MySQL [(none)]> exit
Bye

其他注意点

  • mysql仅支持实例级别设置计数器的步长,通过auto_increment_increment参数控制,这样分库分表的时候,自增表的auto_increment就需要区分开从1还是2开始。
  • 在mysql 8.0之前,global参数在重启之后就会失效,所以对于可以动态修改的全局参数,需要同时修改my.cnf配置文件确保重启后保持一致。
  • 如果主库是双节点,还需要有个监控程序监控主库,便于宕机后自动切换到另外一个节点,具体实现根据基于日志点位、GTID的不同而不同(有需求可留站内信,可提供同时监控并自动重启rabbitmq、es、tomcat、spring boot、mysql复制、redis、zk、otter manager的守护程序)。

参考

https://blog.csdn.net/qustdjx/article/details/26937325/
http://yoshinorimatsunobu.blogspot.com/2013/10/making-full-table-scan-10x-faster-in.html
https://www.cnblogs.com/zhoujinyi/p/5704567.html
MySQL 5.7并行复制实现原理与调优
https://www.oschina.net/translate/showdown-mysql-8-vs-postgresql-10
https://aws.amazon.com/cn/about-aws/whats-new/2017/12/amazon-aurora-with-mysql-compatibility-speeds-query-processing-with-hash-join-and-batched-scans/
https://blog.csdn.net/chenhaifeng2016/article/details/77530569

mysql 5.7多源复制(用于生产库多主库合并到一个查询从库)的更多相关文章

  1. MySQL 5.7 多源复制实践

    多源复制使用场景 数据分析部门会需要各个业务部门的部分数据做数据分析,这个时候就可以用到多源复制把各个主数据库的数据复制到统一的数据库中. 在从服务器进行数据汇总,如果我们的主服务器进行了分库分表的操 ...

  2. mysql 5.7 多源复制 原创

    一从两主:多源复制 每台mysql 服务器都需要加my.cnf要加两个参数才可以在GTID多源复制 master-info-repository=TABLE relay-log-info-reposi ...

  3. MySQL多源复制(八)

    一.什么是多源复制 MySQL 5.7发布后,在复制方面有了很大的改进和提升.比如开始支持多源复制(multi-source)以及真正的支持多线程复制了.多源复制可以使用基于二进制日志的复制或者基于事 ...

  4. mysql5.7 安装和多源复制实践

    MySQL 5.7发布后,在复制方面有了很大的改进和提升.比如开始支持多源复制(multi-source)以及真正的支持多线程复制了.多源复制可以使用基于二进制日子的复制或者基于事务的复制.下面我们说 ...

  5. (转)MySQL多源复制

    原文:https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html MySQL多源复制概述 MySQL多源复制使复制从接受 ...

  6. MySQL多源复制【转】

    什么是多源复制? 首先,我们需要清楚 multi-master 与multi-source 复制不是一样的. Multi-Master 复制通常是环形复制, 你可以在任意主机上将数据复制给其他主机. ...

  7. MySQL5.7多主一从(多源复制)同步配置

    MySQL5.7多主一从(多源复制)同步配置(抄袭) 原文地址:https://my.oschina.net/u/2399373/blog/2878650 多主一从,也称为多源复制,数据流向: 主库1 ...

  8. mysql 从库落后主库太多优化

    有时候为了避免master.info和中继日志崩溃,在容忍额外的fsync()带来的开销,推荐设置sync_master_info = 1sync_relay_log = 1sync_relay_lo ...

  9. MySQL灾备恢复在线主从复制变成主主复制及多源复制【转】

    生产主主复制(A<--->B),和灾备主从复制(B--->C).当生产出现问题时,数据写入切换到灾备数据库,待生产恢复后,将灾备回写到生产.步骤如下: 1.灾备与生产其中一台建立主主 ...

随机推荐

  1. centos 打包报错Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.

    参考: https://blog.csdn.net/salonzhou/article/details/8990237https://stackoverflow.com/questions/23358 ...

  2. centos7及服务器端安装python2.7.13, setuptools, pip

    1. 安装python2.7.13 因为涉及到安装到服务器,所以可能不能直接在usr/bin及usr/local/bin下安装,所以本文详解安装在自定义目录下. 下载安装包: $ wget https ...

  3. php 提取多维数组指定列

    前言:有时候在开发中会遇到这样的问题,我们需要把有规律的多维数组按照纵向(列)取出,有下面的方法可用: 我们将拿下面的数组来处理: 1 $arr = array( 2 '0' => array( ...

  4. hiho #1014 : Trie树(模板)

    Trie树 [题目链接]Trie树 &题意: 输入 输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英 ...

  5. jsp重新打开一个新的页面

    有以下一种实现方式: 1.target="_blank” <a href="document.html" target="_blank"> ...

  6. Hessian---java远程通讯 (zhuan)

    http://blog.csdn.net/harderxin/article/details/22669383 (zhuan)

  7. hive-drop-import-delims选项对oracle的clob无效

    工作过程中发现了用sqoop将oracle中的数据导入到hive时,会因为oracle中类型为clob的字段中存在换行时,会造成hive的数据错位.即使加上了 --hive-drop-import-d ...

  8. 准备mysql-connector-java

    下载mysql-connector-java:https://mvnrepository.com/artifact/mysql/mysql-connector-java 导入mysql-connect ...

  9. Boss Bo (主席树)

    主要想法:假设给你足够时间,那么就可以对每个点建议一颗线段树来查询了,但是需要将点全部按照某个特定的序列存进线段树,如代码是以树的深搜顺序作为指定顺序,这样以来我们既可以将数据查询分成诺干个区间进行查 ...

  10. arc 092D Two Sequences

    题意: 给出两个长度N相同的整数序列A和B,有N^2种方式从A中选择一个数Ai,从B中选择一个数Bj,让两个数相加,求这N^2个数的XOR,即异或. 思路: 暴力的求显然是会超时的,因为是异或,就考虑 ...