首页 > 其他分享 >故障解析丨Clone节点导致主从故障

故障解析丨Clone节点导致主从故障

时间:2023-10-25 10:25:49浏览次数:31  
标签:00 TRANSACTION LAST Clone greatsql 节点 故障 test 主从

1.背景概述

在一次主从复制架构中,由于主节点binlog损坏,导致从节点无法正常同步数据,只能重做从节点;因此使用MySQL 8.0.17开始提供的clone技术进行恢复,恢复后的2天都发生了主从报错数据冲突。

通过解析binlog发现,同一时刻主从节点都在执行同一条语句,因此询问业务是否在主从节点都执行了定时任务,业务回复定时任务只在主节点执行。

最后排查发现,克隆后的从节点的定时任务也会是开启的状态,因此同一时刻,主从节点同时执行定时任务,导致主从报错,最终将从节点的定时任务关闭后解决此问题。

2.问题复现

本次测试基于 GreatSQL 8.0.32-24

greatsql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.32-24 |
+-----------+
1 row in set (0.00 sec)

1.搭建一套主从架构

2.创建event

greatsql> create database test;
greatsql> use test;
greatsql> CREATE TABLE `test` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `now` datetime DEFAULT NULL COMMENT '时间',
 PRIMARY KEY (`id`)
);

greatsql> CREATE EVENT event_test 
ON SCHEDULE EVERY 1 MINUTE
ON COMPLETION PRESERVE 
ENABLE 
COMMENT '每隔1分钟向test表插入记录'
DO INSERT INTO test VALUES(NULL, now());

3.查看event状态

主节点,默认情况下event状态为 ENABLED

greatsql> show events;
+------+------------+---------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| Db  | Name    | Definer | Time zone | Type    | Execute at | Interval value | Interval field | Starts        | Ends | Status  | Originator | character_set_client | collation_connection | Database Collation |
+------+------------+---------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| test | event_test | root@%  | SYSTEM   | RECURRING | NULL    | 1        | MINUTE     | 2023-10-12 17:11:14 | NULL | ENABLED |      1 | utf8mb4        | utf8mb4_unicode_ci  | utf8mb4_unicode_ci |
+------+------------+---------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)

从节点,默认情况下event状态为 SLAVESIDE_DISABLED

greatsql> show events;
+------+------------+---------+-----------+-----------+------------+----------------+----------------+---------------------+------+--------------------+------------+----------------------+----------------------+--------------------+
| Db  | Name    | Definer | Time zone | Type    | Execute at | Interval value | Interval field | Starts        | Ends | Status       | Originator | character_set_client | collation_connection | Database Collation |
+------+------------+---------+-----------+-----------+------------+----------------+----------------+---------------------+------+--------------------+------------+----------------------+----------------------+--------------------+
| test | event_test | root@%  | SYSTEM   | RECURRING | NULL    | 1        | MINUTE     | 2023-10-12 17:11:14 | NULL | SLAVESIDE_DISABLED |      1 | utf8mb4        | utf8mb4_unicode_ci  | utf8mb4_unicode_ci |
+------+------------+---------+-----------+-----------+------------+----------------+----------------+---------------------+------+--------------------+------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)

4.查看数据

greatsql> select * from test.test;
+----+---------------------+
| id | now                 |
+----+---------------------+
|  1 | 2023-08-08 16:00:39 |
|  2 | 2023-08-08 16:01:39 |
|  3 | 2023-08-08 16:02:39 |
+----+---------------------+
3 rows in set (0.00 sec)

5.从节点进行克隆

# 安装克隆插件,主从节点都需要

greatsql> install plugin clone soname 'mysql_clone.so';

# 从节点进行clone

greatsql> set global clone_valid_donor_list='172.17.137.162:6001';

greatsql> clone instance from root@'172.17.137.162':6001 identified by 'greatsql';

6.重新建立主从复制

greatsql> change master to master_user='root',master_password='greatsql',master_host='172.17.137.162',master_port=6001,master_auto_position=1;
Query OK, 0 rows affected, 7 warnings (0.04 sec)

greatsql> start slave;
Query OK, 0 rows affected, 1 warning (0.04 sec)

7.查看主从状态

greatsql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.17.137.162
                  Master_User: root
                  Master_Port: 6001
                Connect_Retry: 60
              Master_Log_File: binlog.000001
          Read_Master_Log_Pos: 2959
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 395
        Relay_Master_Log_File: binlog.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 1062
                   Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction 'e8bf88f9-2acd-11ee-a98a-00163e605c74:8' at master log binlog.000001, end_log_pos 2606. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2307
              Relay_Log_Space: 1242
              Until_Condition: None
               Until_Log_File: 
greatsql> select * from performance_schema.replication_applier_status_by_worker limit 1\G
*************************** 1. row ***************************
                                           CHANNEL_NAME: 
                                              WORKER_ID: 1
                                              THREAD_ID: NULL
                                          SERVICE_STATE: OFF
                                      LAST_ERROR_NUMBER: 1062
                                     LAST_ERROR_MESSAGE: Worker 1 failed executing transaction 'e8bf88f9-2acd-11ee-a98a-00163e605c74:8' at master log binlog.000001, end_log_pos 2606; Could not execute Write_rows event on table test.test; Duplicate entry '5' for key 'test.PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 2606
                                   LAST_ERROR_TIMESTAMP: 2023-08-08 16:03:39.033240
                               LAST_APPLIED_TRANSACTION: 
     LAST_APPLIED_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP: 0000-00-00 00:00:00.000000
    LAST_APPLIED_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP: 0000-00-00 00:00:00.000000
         LAST_APPLIED_TRANSACTION_START_APPLY_TIMESTAMP: 0000-00-00 00:00:00.000000
           LAST_APPLIED_TRANSACTION_END_APPLY_TIMESTAMP: 0000-00-00 00:00:00.000000
                                   APPLYING_TRANSACTION: e8bf88f9-2acd-11ee-a98a-00163e605c74:8
         APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP: 2023-08-08 16:02:45.795753
        APPLYING_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP: 2023-08-08 16:02:45.795753
             APPLYING_TRANSACTION_START_APPLY_TIMESTAMP: 2023-08-08 16:03:39.032510
                 LAST_APPLIED_TRANSACTION_RETRIES_COUNT: 0
   LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_NUMBER: 0
  LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_MESSAGE: 
LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP: 0000-00-00 00:00:00.000000
                     APPLYING_TRANSACTION_RETRIES_COUNT: 0
       APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_NUMBER: 0
      APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_MESSAGE: 
    APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP: 0000-00-00 00:00:00.000000
1 row in set (0.00 sec)

可以看到从节点报错发生了主键冲突。

8.查看从节点定时任务状态

当前从节点定时任务状态为 ENABLED

greatsql> show events;
+------+------------+---------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| Db  | Name    | Definer | Time zone | Type    | Execute at | Interval value | Interval field | Starts        | Ends | Status  | Originator | character_set_client | collation_connection | Database Collation |
+------+------------+---------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| test | event_test | root@%  | SYSTEM   | RECURRING | NULL    | 1        | MINUTE     | 2023-08-08 15:58:45 | NULL | ENABLED |      1 | utf8mb4        | utf8mb4_unicode_ci  | utf8mb4_unicode_ci |
+------+------------+---------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+---------------------+----------------------+--------------------+
1 row in set (0.00 sec)

可以看到由于从节点的定时任务也执行了,从节点写入数据,导致主键冲突。

9.故障解决

greatsql> alter event event_test DISABLE;
Query OK, 0 rows affected (0.01 sec)

关闭从节点的定时任务event,然后跳过主键冲突的报错,最后重新启动主从复制。

3.总结

1.如果主库有定时任务,通过clone的方式搭建从库,在从库恢复之后需要关闭定时任务,避免主从同时执行定时任务导致主从故障。

2.克隆时,如果捐赠节点有主从复制信息,则克隆后的接收节点也会克隆此复制信息,并在克隆完成自动重启实例后,自动启动复制;避免此问题可以在接收节点的配置文件中增加 skip-slave-start,避免节点重启后自动启动复制。


Enjoy GreatSQL

标签:00,TRANSACTION,LAST,Clone,greatsql,节点,故障,test,主从
From: https://www.cnblogs.com/greatsql/p/17786467.html

相关文章

  • [不好分类]仿照语雀故障分析内部一起故障处理的过程
    近期公司发生一起信息系统故障。尝试分析一下。时间线10月18日8:24用户提报MES系统收付关系有误,无法获取进出厂班量。9:12管理员答复,核查一下。10月19日21:00芳烃、烯烃、塑料等车间反馈班量采集错误。22:59管理员答复,发现约5个装置的进出厂收付关系丢失。第二日会核实后......
  • 语雀故障与反思,顺便再领半年会员!
    23日语雀的故障相信大部分人都已经知道了,官方发布的公告是这样的:10月23日语雀出现重大服务故障,且持续7个多小时才完全恢复,给用户使用造成极大不便,对此我们深感抱歉。经过复盘,我们在这里向大家进一步说明故障原因、修复过程和改进措施。故障原因及处理过程:10月23日下......
  • 【Azure App Service】App Service设置访问限制后,使用git clone代码库出现403报错
    问题描述在AppService中,为AppService配置了访问限制,结果导致在克隆AppService的代码时候,遇见403错误。  问题解答因为在使用gitcloneAppService的应用代码时,使用的URL地址为https://***.scm.chinacloudsites.cn/***.git,它是通过公网访问,并且会根据设定的访问限制......
  • Redis-cluster群集操作步骤(主从切换、新增、删除主从节点)
    1.进入集群客户端任意选一个redis节点,进入redis所在目录cd/redis所在目录/src/./redis-cli-h本地节点的ip-predis的端口号-a密码[root@mysql-db01~]#redis-cli-h10.0.0.51-p637910.0.0.51:6379> 2.查看集群中各个节点状态集群(cluster)clusterinfo......
  • Redis主从复制部署小结
    Redis主从搭建主从架构单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。主从数据同步原理全量同步主从第一次建立连接时,会执行全量同步,将master节点的所有数据都拷贝给slave节点,流程:这里有一个问题,master如何得知salve是第一......
  • jenkins安装部署、主从架构、slave镜像、K8S对接
    介绍CI/CD工具,自动化持续集成和持续部署,用于构建各种自动化任务。官方提供了docker镜像https://hub.docker.com/r/jenkins/jenkins使用Deployments部署镜像,然后通过暴露jenkins的8080端口(web端口)和50000端口(slave通信端口),另外容器启动后所有数据都是存储在容器内的/var/jenkin......
  • 掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具
    Kubernetes是一款管理容器化应用程序的强大工具。然而,与任何复杂的系统一样,使用它时也可能出错。当问题出现时,掌握有效的故障排除技术和工具非常重要。 本文将介绍以下步骤,助您了解事件收集的入门知识:检索最新事件使用Pod模拟问题在位于PV的Pod中存储事件 检索......
  • 掌握 Kubernetes 故障排除:有效维护集群的最佳实践和工具
    Kubernetes是一款管理容器化应用程序的强大工具。然而,与任何复杂的系统一样,使用它时也可能出错。当问题出现时,掌握有效的故障排除技术和工具非常重要。 本文将介绍以下步骤,助您了解事件收集的入门知识:检索最新事件使用Pod模拟问题在位于PV的Pod中存储事件 检索......
  • Redis 主从复制
    Redis有两种不同的持久化方式,Redis服务器通过持久化,把Redis内存中持久化到硬盘当中,当Redis宕机时,我们重启Redis服务器时,可以由RDB文件或AOF文件恢复内存中的数据。不过持久化后的数据仍然只在一台机器上,因此当硬件发生故障时,比如主板或CPU坏了,这时候无法重启服务器,有什么办法可以......
  • linux网络故障排查
    在日常使用中,经常会出现无法连通的情况,这个时候我们就需要找到问题出在哪里,这里面给各位提供一个生产环境排查网络故障的大体思路,一般情况下如果遇到网络故障,都是通过筛选的方式一点一点的确定问题所在,首先判断是本机的问题还是网络上其它设备的问题,如果同一网络环境中的其它主机......