我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL级联复制的同步问题(一)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL级联复制的同步问题(一)

今天碰到一个有些奇怪的问题,有一套环境,在主从复制的时候有一些问题。
大体的流程设计如下:
MySQL级联复制的同步问题(一)
三个节点位于三个不同的区域,因为节点1和节点3之间的网络存在问题,所以走了节点2来中转,由此可见延迟是难免的,但是延迟不能太大。最终的数据还是要通过节点3来做统计分析查询。这套环境的数据量不大,但是数据变更貌似是比较频繁。早上开发的同事反馈,节点同步感觉延迟很大,想让我帮忙看看到底是哪里出了问题。
查看节点1,节点2没有延迟,问题就出在节点2到节点3的延迟。
在节点3中查看slave状态:
> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host:xxxx
                  Master_User: repl
                  Master_Port: 3307
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 16186388
               Relay_Log_File: relay-bin.000004
                Relay_Log_Pos: 13599457
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
...
                   Last_Errno: 1032
                   Last_Error: Could not execute Delete_rows event on table test_mbi.test_dist_online; Can't find record in 'test_dist_o
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 13599294
              Relay_Log_Space: 16304336
              Until_Condition: None
...
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 1032
               Last_SQL_Error: Could not execute Delete_rows event on table test_mbi.test_dist_online; Can't find record in 'test_dist_o
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 23307
                  Master_UUID: 189a00c4-16a3-11e6-a678-06c76b65c01e
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:
           Master_Retry_Count: 86400
1 row in set (0.00 sec)
发现在日志应用中出现了1032的错误,即删除的数据在从库中找不到。一般来看这类问题,感觉好像说小也小,那skip一下吧,发现这个不是权宜之计,因为skip了这个问题之后接着又碰到了同样的问题,所以反反复复修改skip本身就是一件隔靴挠痒的事情,而且实际上数据已经不一致了。
因为需求紧迫,时间又比较紧张,数据的延迟较大,所以简单评估之后发现还是重建从库。
当然这个步骤就很常规了。我也简单列举一下:
因为是多实例的场景,所以使用了如下的命令来导出:
 /opt/mysql/bin/mysqldump -S /data2/bmbidb/mysql.sock --single-transaction --master-data=2  -B  test_ad test_mbi test_sys_mgr  |gzip > test.sql.gz
然后在各种网络层面周旋,总算是把这个dump从节点2拷贝到了从库环境节点3
然后在节点3停止slave,开始导入数据:
gunzip < test.sql.gz | /opt/mysql/bin/mysql  --socket=/home/bmbidb/mysql.sock --port=3307
start slave
接着开始change master,当然这个时候对于MASTER_LOG_FILE,MASTER_LOG_POS可以通过dump来得到这些信息
 gunzip < tes.sql.gz | head -50
会发现下面这么一段内容:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=241903809;
这就是需要我们关注的地方,然后直接使用即可。
 CHANGE MASTER TO MASTER_HOST='xxxx',MASTER_USER='repl',MASTER_PASSWORD='xxxx',MASTER_PORT=3307,MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=241903809,MASTER_CONNECT_RETRY=10;
这样从库的设置就完成了。    
然后在下午的晚些时间又碰到了类似的问题,这可让我很纠结了,不可能一出现这种情况我就重建从库吧。
排除了很多潜在的原因,包括sync_binlog,表结构差异,节点中的数据库权限,表的存储引擎等。貌似还是没有找到要领。
通过mysqlbinlog去解析relay日志,依旧是无功而返。
/opt/mysql/bin/mysqlbinlog  -vv relaylog.05     --base64-output decode-rows > relay05.tmp
所以这个问题还是很让人纠结的。
在同事的协助下,暂时使用了一个临时方案先来过渡。对于这类的DML操作如果数据不存在,可以选择忽略,即设置slave_exec_mode为IDEMPOTENT,而默认职位STRICT
> set global slave_exec_mode='IDEMPOTENT';
Query OK, 0 rows affected (0.00 sec)
> stop slave;set global sql_slave_skip_counter=1;start slave;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
修改完成后,这类问题暂时告一段落,还需要找到根本的原因。这种情况下比对了部分的数据,没有发现其他的数据冲突,但是解决方案也需要一个合理的解释。我们下一篇来继续聊聊这个,应该会有一个答复。



免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL级联复制的同步问题(一)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL 半同步复制的实现

目录一、半同步复制介绍二、搭建半同步复制2.1 安装半同步插件2.2 启用半同步复制三、配置半同步复制四、监控半同步复制一、半同步复制介绍mysql基础复制有三种模式:异步复制/同步复制/半同步复制,3种模式各有利弊,下面对各种复制模式的
MySQL 半同步复制的实现
2024-09-04

递归查询在数据复制中的同步问题

递归查询在数据复制中的同步问题是指在分布式系统或数据库系统中,为了保持数据的一致性和完整性,需要对数据进行复制和同步数据不一致:在数据复制过程中,由于网络延迟、节点故障等原因,可能导致数据在不同副本之间存在不一致的情况。这种不一致可能导致查
递归查询在数据复制中的同步问题
2024-09-08

一文详解Elasticsearch和MySQL之间的数据同步问题

Elasticsearch中的数据是来自于Mysql数据库的,因此当数据库中的数据进行增删改后,Elasticsearch中的数据,索引也必须跟着做出改变。本文主要来和大家探讨一下Elasticsearch和MySQL之间的数据同步问题,感兴趣的可以了解一下
2023-05-16

编程热搜

目录