mysql5.7多源复制(用于生产库多主库合并到一个查询从库)(代码片段)

太白的技术博客 太白的技术博客     2022-11-21     295

关键词:

  目前我们使用的是主从+分库分表的系统架构,主库有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=\'123456\',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=\'123456\',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

mysql5.7主从复制

两台服务器主:192.168.0.101从:192.168.0.1081.主库配置1.1创建用户并授权GRANTREPLICATIONSLAVE,RELOAD,SUPERON*.*TO‘backup‘@‘192.168.0.108‘IDENTIFIEDBY‘abcd1234‘;1.2修改my.cnf文件vi/etc/my.cnf--------------server_id=101log-bin= 查看详情

mysql5.7主从复制-异步复制搭建

 两台服务器,系统是Redhat6.5,MySQL版本是5.7.18。1、在主库上,创建复制使用的用户,并授予replicationslave权限。这里创建用户repl,可以从IP为10.10.10.210的主机进行连接。grantreplicationslaveon*.*to‘repl‘@‘10.10.10.210‘identifiedby‘my... 查看详情

mysql5.7选择性同步--几个不推荐在生产环境用的参数(代码片段)

...仅是测试,极不推荐生产环境中用以下参数。测试版本:MySQL5.7.26说明:图中最后的都是从库的结论。比如a库的表不执行binlog指的是从库中a库中不会执行主库中binlog中的xx记录。1binlog-do-db1.1binlog_format=ROW主库配置文件my.cnf设置:... 查看详情

mysql5.7开启增强半同步复制(代码片段)

...制环境要提前搭建好,然后再开启mysql增强半同步环境:mysql5.7.26主从异步复制早已部署好。1.加载plugin插件建议master和slave上全部执行(考虑到MHA的主从自动切换的环境)在主库安装semisync_master.so和semisync_slave.so插件:mysql>INSTA... 查看详情

mysql5.7.26做主从复制配置(代码片段)

一、首先两台服务器安装好mysql数据库环境参照linuxrpm方式安装mysql5.1https://www.cnblogs.com/sky-cheng/p/10564604.html二、主库master上创建主从复制账号mysql>grantreplicationslave,replicationclienton*.*to‘repl‘@‘%‘identifiedby‘[email 查看详情

mysql5.7主从复制简单环境搭建以及开启半同步复制等配置(代码片段)

准备两台mysql服务器环境参考https://blog.csdn.net/qq_42303467/article/details/122137696配置主库ip192.168.95.130修改/etc/下的my.cnf文件vim/etc/my.cnfmy.cnf配置如下#Foradviceonhowtochangesettingspleasesee#http://dev.mysql.com/do 查看详情

mysql5.7主从同步gtid(代码片段)

...从库不能比主库版本高建议5.7centos7默然安装mariadb,安装mysql5.7参考如下链接文档:centos7安装mysql5.7:https://juejin.im/post/5c088b066fb9a049d4419985(转载)一、主库配置1、更改主库/etc/ 查看详情

6:多源复制的实现

MySQL多源复制允许复制slave同时从多个源接收事务。可以使用多源复制将多个服务器备份到一个服务器,合并表碎片,并将来自多个服务器的数据合并到一个服务器。多源复制在应用事务时不实现任何冲突检测或解决,如果需要... 查看详情

mysql5.7主从复制简单环境搭建以及开启半同步复制等配置(代码片段)

准备两台mysql服务器环境参考https://blog.csdn.net/qq_42303467/article/details/122137696配置主库ip192.168.95.130修改/etc/下的my.cnf文件vim/etc/my.cnfmy.cnf配置如下#Foradviceonhowtochangesettingspleasesee#http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html... 查看详情

mysql5.7主从复制简单环境搭建以及开启半同步复制等配置(代码片段)

准备两台mysql服务器环境参考https://blog.csdn.net/qq_42303467/article/details/122137696配置主库ip192.168.95.130修改/etc/下的my.cnf文件vim/etc/my.cnfmy.cnf配置如下#Foradviceonhowtochangesettingspleasesee#http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html... 查看详情

mha高可用集群详解

一、什么是MHA传统的主从复制如果主库宕机,其余从库不会自动的代替主库继续工作,这样就不能保证业务的高可用,而MHA就是一个mysql主从复制高可用的解决方案,当主库宕机后,MHA能在1-30秒实现故障检测和故障自动转移,选... 查看详情

:复制(代码片段)

设计数据密集型应用第五章:复制与可能出错的东西比,'不可能’出错的东西最显著的特点就是:一旦真的出错,通常就彻底玩完了。——道格拉斯·亚当斯(1992)文章目录设计数据密集型应用第五章&... 查看详情

linux下安装mysql多实例作为数据备份服务器实现多主到一从多实例的备份

...版本【一定要是源码版本】2、按以下代码键入LINUX命令行复制代码代码如下:[注]添加mysql组和用户#groupaddmysql#useradd-gmysqlmysql[注]解包到/usr/local#tar-xzfmysql-standard-4.1.9-pc-linux-gnu-i686.tar.gz-C/usr/local[注]建立软链接,方便操作(此处给... 查看详情

三台mysql5.7服务器互作主从配置案例(代码片段)

一、架构三台msyql服务器221,222,223,每台服务器开两个实例,3306作为主库,3307作为另外一台服务器的从库二、每台服务器安装双实例参照:https://www.cnblogs.com/sky-cheng/p/10919447.html进行双实例安装三、每台服务器的3306实例创建一个... 查看详情

mysql5.7复制的一个小bug-xa事务

参考技术A线上一个5.7从库复制中断:查询具体报错:第一感觉很奇怪,为什么会rollback失败呢?于是根据gtid去对应的主库binlog去看了下,并没有任何rollback语句:看下本地的relaylog,找到这个事务的gtid到这里,这个relaylog日志文... 查看详情

生产环境可用mysql5.7.23安装全过程(代码片段)

生产环境安装5.7.23全过程先执行initialization.sh优化脚本详情见Linux在安装mysql前,需要先查看一下是否清空了系统自带了mysql我们这里需要删除系统自带了mysqllib我们先把mysql放置在/opt下先上传与线上版本一致的[[email protected]opt... 查看详情

一次多源数据库主从不同步的情况

...nbsp;背景:主库上通过navicat导入csv文件,然后改名。导致多源数据库不同步。 报警信息:登陆多源库查看:(猜测原因:navicat内部做了封装)  查看主库对应点的binlog:mysqlbinlog --base64-output=decode-rows-vv-dgoods--start-posi... 查看详情

mysql组复制技术实现与数据库性能测试工具

...机上面测试,仅供参考。系统:CentOS7.3虚机:2核4G版本:MySQL5.7技术架构MySQLGroupReplication(简称MGR)是官方推出的高可用解决方案,原生复制技术,基于插件的方式工作。其中singleprimarymode单主模式只有一个读写,其余都是只读... 查看详情