MySQL级联复制中的数据同步(第二篇)

今天解决了两个蛮有意思的MySQL问题,简单分享出来。

首先是昨天说的级联复制的情况,因为架构做了调整,我们要删除其中的一个中继节点(新加坡节点),而直接使用北京节点去连接北美的节点。

更多的信息可以参考。

MySQL级联复制中的数据同步(r11笔记第20天)

大体的架构方式如下:

如此一来,为了避免重建从库,而且没有GTID的情况下,我们可以统一规划一下偏移量,平滑迁移。

实现后的架构图如下:

看起来还是比较简单,但是偏移量真是一个比较琐碎细致的活儿。在此也感谢我的同事程振,我们一起讨论了实现的方式和细节。

大体来说,目前的北京节点的延迟较大,所以大体的思路就是停止新加坡节点的slave,(当然要保证slave的read_master_log_pos和Exec_Master_Log_Pos要追平)也可以直接停止io_thread(stop
slave io_thread),或者stop slave,让北京节点去追平GAP,然后直接平滑切换到北美的节点上。

北京节点(slave)和新加坡节点(master)的偏移量情况如下:

北京(slave) 新加坡(master)
>show slave  status\G > show master  status\G
Master_Log_File:  binlog.000408 File: binlog.000408
Read_Master_Log_Pos:  129590180 Position: 675358376
Relay_Log_File:  mysql-relay-bin.002263 Binlog_Do_DB: 
Relay_Log_Pos:  25551626 Binlog_Ignore_DB: 
Relay_Master_Log_File:  binlog.000408

北京节点要去新加坡节点读取数据变化,得追平GAP,可以看出延迟已经很大了。

这里有一点很容易弄混淆,那就是新加坡节点(slave)的偏移量。

新加坡(slave)
> show  slave status\G
Master_Log_File:  binlog.000621
Read_Master_Log_Pos:  287660027
Relay_Log_File:  mysql-relay-bin.002070
Relay_Log_Pos:  287660170
Relay_Master_Log_File:  binlog.000621

北京节点要追平的偏移量是675358376而非287660027

过了些时间,总算是追平了,和预期的一样,是追平到了675358376

数据如下:

北京(slave) 新加坡(master)
>show slave status\G > show master  status\G
Master_Log_File:  binlog.000408 File: binlog.000408
Read_Master_Log_Pos:  675358376 Position: 675358376
Relay_Log_File:  mysql-relay-bin.002281 Binlog_Do_DB: 
Relay_Log_Pos:  414747263 Binlog_Ignore_DB: 
Relay_Master_Log_File:  binlog.000408

这个时候问题就来了,北美的slave节点已经接受数据变化,偏移量肯定在增长,而这个时候一个重要的参考依旧就是新加坡slave节点的偏移量信息。从下面可以看出偏移量已经有了重大的差别,如果没有参考基础就无从开始设置。

新加坡(slave) 北美从库(master)
> show  slave status\G > show master  status\G
Master_Log_File:  binlog.000621 File: binlog.000621
Read_Master_Log_Pos:  287660027 Position: 344035385
Relay_Log_File:  mysql-relay-bin.002070 Binlog_Do_DB: 
Relay_Log_Pos:  287660170 Binlog_Ignore_DB: 
Relay_Master_Log_File:  binlog.000621

接下来就是北京节点的重头戏了。开始使用change master来修改

stop slave;
CHANGE MASTER TO  MASTER_HOST='xxxx',
 MASTER_USER='repl_new',        
 MASTER_PASSWORD='xxxx',    
 MASTER_PORT=3306,        
 master_log_file='binlog.000621',
 master_log_pos=287660027;
start slave;

如上的两个重要参数就取自新加坡的从节点信息。

然后start slave之后,就可以看到偏移量开始大幅度提升。

Read_Master_Log_Pos: 288885733

很快就追平了北美从库(master)的偏移量

查看北美从库(master)的信息

北美slave节点
> show master status\G
File: binlog.000621
Position: 348627763
Binlog_Do_DB:
Binlog_Ignore_DB:

如此一来一个看似复杂的平滑迁移过程就完成了。昨天我蛮有深意的给出下面的一个级联复制图.

整个过程操作顺利完成之后,也让我对GTID这个很不错的特性更加渴望。手工来分析判断,真是很让人费神。

时间: 2024-09-25 17:04:24

MySQL级联复制中的数据同步(第二篇)的相关文章

MySQL级联复制中数据同步

    最近开发的同事反馈了一个问题,说有一台北京节点的MySQL数据库数据延迟太大,想让我们帮忙看看怎么解决.     这个问题一下子让我想起了之前"水深火热"的日子,因为这是一套MySQL级联复制的环境.这么做的目的也是为了能够方便数据查询和统计任务,看起来虽好,但是老是有一些不可控因素.    北美使用AWS在北美,都是实时的业务数据,考虑了灾备和读写分离使用了一主一从的架构,新加坡节点2是一个中继节点,也使用了AWS,可以看到新加坡节点是北美节点的从库,但是北京的主库. 北京节

Mysql服务器的主辅数据同步

Mysql服务器的主辅数据同步 例题:将A服务器作为主服务器(Master),B1和B2为辅服务器(Slave), 怎么来将主服务器的数据同步到辅服务器呢,下面我们来看. Master: 修改配置文件:/etc/my.cnf [root@localhost ~]# vim /etc/my.cnf [mysqld] log-bin=binlog log-bin-index=binlog.index sync_binlog=0 server_id = 1 重启mysql:  www.bitsCN.c

如何为goldengate的数据库中保证数据同步的情况下为表加列

问题描述 如何为goldengate的数据库中保证数据同步的情况下为表加列 数据库现在做GOLDENGATE,DML同步了部分表,现在在source端,需要同步的表中加一列,在target表中也加一列,该如何操作才能保证加列的过程中数据同步且不丢失

mysql中将textbox中的数据修改传给datatable语句出现问题

问题描述 mysql中将textbox中的数据修改传给datatable语句出现问题 解决方案 ...->rows->default[0]->default[1]... 解决方案二: 不能直接对Rows[x][y]赋值,它是只读的,要更新或插入应该用update和insert,不能直接改

mysql 5.5中的半同步复制

先来看下MYSQL异步复制的概念:   异步复制:MySQL本身支持单向的.异步的复制.异步复制意味着在把数据从一台机器拷贝到另一台机器时有一个延时 – 最重要的是这意味着当应用系统的事务提交已经确认时数据并不能在同一时刻拷贝/应用到从机.通常这个延时是由网络带宽.资源可用性和系统负载决定的.然而,使用正确的组件并且调优,复制能做到接近瞬时完成.      当主库有更新的时候,主库会把更新操作的SQL写入二进制日志(Bin log),并维护一个二进制日志文件的索引,以便于日志文件轮回(Rotat

MySQL 传统复制中常见故障处理和结构优化案例分析

虽然MySQL5.7 的主从复制已经很稳定了,但在备库可读写的情况下,总是会出现部分数据不一致的情况,例如常见的1062.1032和1050错误.下面就介绍下这类报错的常见处理方法和常见主从复制结构的调整. 环境描述 1.mysql 5.7 以上, 2.binlog format 是row格式(5.7默认) 3.传统复制(生产强烈推荐使用gtid) 4.log-bin , log_slave_updates 开启 5.复制结构:101:3306> 103:3306 > 104:3306 常见主

如何将SQLServer2005中的数据同步到Oracle中

有时由于项目开发的需要,必须将SQLServer2005中的某些表同步到Oracle数据库中,由其他其他系统 来读取这些数据.不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现.假设我们 这边(SQLServer2005)有一个合同管理系统,其中有表contract 和contract_project是需要同步到一个 MIS系统中的(Oracle9i)那么,我们可以按照以下几步实现数据库的同步. 1.在Oracle中建立对应的contract和 contract_proj

让Word和Excel表格中的数据同步更新

在Word文档编辑时,需要用到Excel工作表中的数据资料,但是当word和Excel中某一个数据发生改变后,我们就不得不寻找对应的部分来修改,如果涉及的数据量较大,那工作的强度也会大大提升.其实,Word和Excel提供了能让两者数据同步的方法,并且简单易行. Step1:复制段落 打开Word文档和要引用该Word数据的Excel工作表,然后在word中回个车,这时显示两个段落标记.选取这两个段落标记,然后复制. Step2:粘贴链接 切换到Excel编辑窗口,鼠标右键单击数据栏,选择选择性

从MySQL数据库表中检索数据

在<用MySQL创建数据库和数据库表>文章中,我们如何创建一个数据库和数据库表,并知道如何向数 据库表中添加记录. 那么我们如何从数据库表中检索数据呢? 1.从数据库表中检索信息 实际上,前面我们已经用到了SELECT语句,它用来从数据库表中检索信息. select语句格式一般为: SELECT 检索关键词 FROM 被检索的表 WHERE 检索条件(可选) 以前所使用的" * "表示选择所有的列.下面继续使用我们在上篇文章中创建的表 mytable. 2.查询所有数据: