canal消费binlog异常排查

news2024/11/13 13:39:18

canal简介

canal是一款优秀的订阅MySQL binlog的中间件,在MySQL异构数据到其它存储平台领域非常的实用好用。而且在数据表的迁移中也可以用canal订阅,然后将更新实时同步到新表。

原理

canal部署后伪装为一个MySQL slave节点向DB发起同步binlog请求,DB将binlog发送给slave,canal解析转成一系列事件交给用户处理。insert、update、delete等DML事件,并且可以获取到SQL执行前后的原数据信息。

  1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
  2. mysql master收到dump请求,开始推送binary log给slave(也就是canal)
  3. canal解析binary log对象(原始为byte流)

canal部署后是一个server,此时我们新建工程连接server消费canal给我们推来的event就是client。我们通过canal提供的API轻松应用binlog转化的event,并提取数据同步到其他存储。

HA机制,canal为了避免单点当然可以部署集群实现HA。但是为了避免多个canal和DB建立链接同时解析binlog并推给下游消费,同时只能有1个canal运行,依靠的是CA的zookeeper实现。

大致步骤:

  1. canal server要启动某个canal instance时都先向zookeeper进行一次尝试启动判断 (实现:创建EPHEMERAL节点,谁创建成功就允许谁启动)
  2. 创建zookeeper节点成功后,对应的canal server就启动对应的canal instance,没有创建成功的canal instance就会处于standby状态
  3. 一旦zookeeper发现canal server A创建的节点消失后,立即通知其他的canal server再次进行步骤1的操作,重新选出一个canal server启动instance.
  4. canal client每次进行connect时,会首先向zookeeper询问当前是谁启动了canal instance,然后和其建立链接,一旦链接不可用,会重新尝试connect.

Canal Client的方式和canal server方式类似,也是利用zookeeper的抢占EPHEMERAL节点的方式进行控制。

在华润中的实际应用

在我们需求中领导需要查看多维度复杂的报表,MySQL就无法满足近实时的且多维度的复杂查询,我们引入了Elasticsearch来满足需求。那么MySQL数据异构到ES,就是使用的canal实现。

问题表象和排查

某一天下午,正在高高兴兴编码,突然被一声粗糙的喊声拉出了思绪。“这怎么发送MQ超时了?链接不上MQ啦”一个同事日常的没过脑的喊叫。定睛一看原来是canal-client在消费binlog时发送给MQ的消息报错了。于是先入为主的去排查了mq,发现namesrv、broker都没有宕机或重启。查了canal-client也没有宕机重启。于是怀疑是网络通信问题,查了2个小时没有收获...

期间为了尽快恢复数据同步,重启了canal-client,就恢复了mq数据同步。这里也丢失了第一现场。通过mq发送消息监控,是大约在2.4号1.54分就没有消息发送了,应该就是这个时间有故障。后来在日志平台查询1.54~2点的canal-client日志,发现了问题根因。

close the connection to remote address[] result: true

在1.54.37秒canal消费binlog线程发生了一个未知错误,导致线程死亡。在日志上可看到此时间点后没有消费binlog日志,在mq发送监控上也符合1.54分左右没有发送消息流量。这个错误信息在代码中查找,找到出处。是一个消费canal-server发送过来的event事件的消费线程,也是驱动整个消费程序的线程。

这段代码是这样的,start函数是canal-client启动后和server连接上调用的函数。会启动一个消费线程一直执行process函数,在函数内做具体的event事件分发并消费。线程注册了未捕获异常handler以便在线程发生异常时能回调通知用户,做一些补偿或记录。这个handler中打印的就是日志中出现的异常语句,所以可以肯定消费线程出现了异常导致退出。

至于出现了什么异常?似乎是io错误,读取到流的结尾。检查了canal-server是部署在201机器上,且pod在1天前部署过。看日志是2.4 1:59分启动的,和canal-client的消费线程异常时间比较吻合。canal-server在1.54分左右因201机器出现内存爆满,导致k8s对201机器上的pod进行驱逐,然后1.59分重启。canal-client没有重新连接上canal-server,因为消费线程在遇到长连接断开后,进入handler中没有做特殊处理,就打了日志就退出了。

问题到这里已经查明原因了,但是为了更严谨,还是选择在本地用代码模拟复现这个场景。看看线程是不是进入到未捕获异常handler就会退出。

问题复现

运行下面的代码,main线程启动了一个t线程,t线程会一直执行HomeWork任务,直到i>100抛出异常。观察如果t线程抛出异常后还能继续打印日志,代表t线程即使在run中抛出异常也能继续运行,反之证明t线程已经退出消亡了。其实还有其他手段可证明,例如用jstack、visualVM等监控工具观察t线程。但这个实验是最快最低成本的。

/** * @author Joseph * @since 2024/2/4 */

public class ThreadExceptionTest {

    protected static Thread.UncaughtExceptionHandler handler = (t, e) -> System.out.println("error="+e.getMessage());    
    
    public static void main(String[] args) {
        Thread t = new Thread(new HomeWork());        
        t.setUncaughtExceptionHandler(handler);        
        t.start();        
        while (true) {
            System.out.println("MainThread running");            
            try {
                Thread.sleep(5000);            
            } catch (InterruptedException e) {
                throw new RuntimeException(e);            
            }
        }
    }

    static class HomeWork implements Runnable {
        @Override        
        public void run() {
            int i = 0;            
            while (true) {
                System.out.println(i);                
                if (i++ >= 100) {
                    throw new RuntimeException("thread dead");                
                }
                try {
                    Thread.sleep(10);                
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);                
                }
            }
        }
    }
}

总结

在生产上遇到了canal同步es数据突然中断的问题,初步查看是发现MQ没有继续发送消息同步数据了。随着排查深入发现是K8S的pod节点内存不够导致的驱逐pod,canal-server被重启,canal-client和server断开连接,消费线程遇到异常没有进行合适的处理,打了错误日志退出消亡。

随着排查问题,学习了canal能够解析MySQL binlog的原理,是通过MySQL提供的协议伪装成slave节点向master拉取binlog并自己解析转化为一系列insert、update、delete等DML事件,再提供给用户消费。还学习了canal通过zookeeper的强CA机制实现多节点的HA机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Istio下载及安装

Istio 是一个开源的服务网格,用于连接、管理和保护微服务。以下是下载并安装 Istio 的步骤。 官网文档:https://istio.io/latest/zh/docs/setup/getting-started/ 下载 Istio 前往Istio 发布页面下载适用于您的操作系统的安装文件,或者自动…

系统架构-面向对象

有对象和没对象一样,鉴于今天中秋节 所以明天姐姐我就恢复单身了,忍这几个小时也没关系,一点不重要了

『功能项目』伤害数字UI显示【53】

我们打开上一篇52眩晕图标显示的项目, 本章要做的事情是在Boss受到伤害时显示伤害数字 首先打开Boss01预制体空间在Canvas下创建一个Text文本 设置Text文本 重命名为DamageUI 设置为隐藏 编写脚本:PlayerCtrl.cs 运行项目 本章做了怪物受伤血量的显示UI…

iOS 18 新功能:控制中心大變身!控制項目自由選配

蘋果於 Apple iOS 18 中為控制中心帶來大改變,變得更具有擴充性,而且將支援第三方應用的控制按鈕,中心內的組件大小也可調節。如今 iOS 18 正式上線,我們就可以試試控制中心不同項目自由選配帶來的效果。 組件可在三尺寸之間調整 …

十五、谷粒商城- 报错汇总

🌻🌻目录🌻🌻 一、谷粒商城- 分布式基础&环境搭建(1)1.1 项目构建完clean报错1.2 idea安装插件报错 二、谷粒商城- 快速开发之Spring Cloud Alibaba(2)2.1 配置完renren-fast 启…

园林建筑物类型检测系统源码分享

园林建筑物类型检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

Simulink仿真理想二极管模型

Simulink仿真理想二极管模型 二极管的伏安特性曲线测量 可通过实验的方法测量得到二极管(Diode)的外部特性,即伏安特性曲线,图(a)为二极管正向特性测试电路,P区接电源的正极,N区接电源的负极,这种接法称为PN结正向偏…

python贪吃蛇游戏项目源码【免费】

使用Pygame库实现的贪吃蛇游戏。Pygame是一个用于创建视频游戏的Python模块集合,它提供了图形和声音库,使游戏开发变得容易。 初始化设置 屏幕大小 (SCREEN_WIDTH, SCREEN_HEIGHT): 定义了游戏窗口的宽度和高度。方格大小 (SIZE): 定义了游戏中每个小方…

【Linux基础】冯诺依曼体系结构操作系统的理解

目录 前言一,冯诺依曼体系1. 为什么有内存结构?2. 对硬件中数据流动的再理解 二,操作系统(Operator System)1. 概念2. 操作系统结构的层状划分3. 操作系统对硬件管理的理解4. 用户与操作系统的关系的理解5. 系统调用和库函数的关系6. 为什么要有操作系统…

深入解析 Cursor:AI 驱动的编程工具与应用示例

慢慢理解世界,慢慢更新自己。 随着人工智能(AI)技术的发展,编程工具也在不断进化,力求为开发者提供更加智能化的辅助体验。Cursor 就是这样一款结合 AI 技术的编程工具,它不仅能够帮助开发者快速编写、优化…

mimd 公平收敛在相图中的细节

aimd 的收敛已经说腻了,我曾经画了好几次相图。有朋友希望我能画一个 mimd 相图,我就再画一个稍微详细的。 下面相图收敛到稳定点的前提异步 mimd: 之所以要异步,举个例子,在执行 gx 时,要确保 y 已经执…

关于一道逻辑思维训练题的理解(手表、闹钟、标准时间的骗局)

说有一块手表,比闹钟每时慢30秒,而闹钟比标准时间每时快30秒,那么,这块手表是准时的么 ? 这道题就是个带时间刻度的四维骗局 就是个文字游戏 接下来我们来分析一下,为什么说它是个骗局,简直与…

Leetcode 缺失的第一个正整数

题目意思是找出第一个没出现的最小正整数。 Explanation: Move Numbers to Correct Positions: The idea is to place each number in its corresponding index. For example, 1 should be at index 0, 2 should be at index 1, and so on. This is done using a while loop t…

道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路

道路裂缝,坑洼,病害数据集 包括无人机视角,摩托车视角,车辆视角 覆盖道路所有问题 一共有八类16000张 1到7依次为: [横向裂缝, 纵向裂缝, 块状裂缝, 龟裂, 坑槽, 修补网状裂缝, 修补裂缝, 修补坑槽] 道路病害(如裂缝、…

【C++】—— list 模拟实现

【C】—— list 模拟实现 1 list 基础结构2 默认构造3 迭代器3.1 整体框架3.2 成员函数3.3 begin() 与 end() 的实现3.4 operator-> 的实现3.5 const 迭代器3.5.1 const 迭代器为什么命名 const_iterator3.5.2 const 迭代器的实现3.5.3 合并两个迭代器 4 源码 1 list 基础结…

“RISCV+AI”

概述 设计方案 主要有两种设计方案。 RISCV核ASIC RISCV核是标准的基于RISCV指令集的CPU设计,ASIC部分通常是基于RISCV自带的向量扩展指令集构建的向量处理器,或是自定义的矩阵计算单元。 根据CPUAI ASIC部件的接口可以分为紧耦合和松耦合的设计1。 …

OpenCVHaar级联器实现人脸捕捉和微笑检测

概念 Haar 级联分类器是由多个简单分类器组成的复杂分类器,每个简单分类器都由 Haar 特征训练得到。Haar 级联器因其简单和快速而被应用于某些场景。OpenCV 提供多种预训练的 Haar 特征级联分类器,其已经在大量图像上进行了训练,并且针对特定…

【Ubuntu】虚拟机安装USB摄像头ROS驱动 usb_cam(最新方法)

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

宝塔Linux部署 Vue + Spring Boot + MySQL + Redis

服务器安装宝塔 不同的服务器操作系统对应着不同的安装命令。这里我用的是centos8.6,所以安装命令是 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 注意安装宝塔面板时&#xff0…

如何在uni-app中使用原子化 CSS——UnoCSS

原文地址:原文链接 一、前言 UnoCSS是一个即时的原子化 CSS 引擎,旨在灵活和可扩展。核心是不拘一格的,所有的 CSS 工具类都是通过预设提供的。 那么,UnoCSS 与其他框架的有何不同之处呢? UnoCSS 由 Windi CSS 团队…