MYSQL 同步到ES 如何设计架构保持一致性

news2024/9/24 11:27:58

简单使用某个组件很容易,但是一旦要搬到生产上就要考虑各种各样的异常,保证你方案的可靠性,可恢复性就是我们需要思考的问题。今天来聊聊我们部门在 MYSQL 同步到ES的方案设计。

在面对复杂条件查询时,MYSQL往往显得力不从心,一般公司的做法会通过将mysql中的数据同步到ES,之后的查询就通过ES进行查询,ES在面对多条件复杂查询时,能较快的查询出结果集。

在MYSQL数据 到ES中的数据同步 方案设计上,就有多种选择,

1,最简单的便是直接在业务代码中对数据库进行修改,插入,删除时,同步修改ES中的数据。 但这种方案也是最不可靠的一种设计。在写入MYSQL后,业务服务宕机了,ES数据就会丢失。如果写入ES失败,重试逻辑将会嵌套在业务代码中,业务代码复杂性增加了,并且如果一直失败,要一直重试吗?

所以,对于这种方案,直接pass掉了。

2,第二种同步方案则是业界用的比较多的同步方案,通过binlog进行同步,目前业界已经有比较成熟的模拟mysql从库,拉取binlog的组件,例如阿里开源的canal。整个同步架构如下所示,canal组件充当mysql从库的角色,将mysql的binlog拉取下来,由客户端从canal拉取消息进行消费,再由客户端主动插入或者更新ES中的数据。

📢📢注意,这里我用的是客户端主动从cannal拉取binlog消息的方式,实际上还可以通过让cannal主动发送binlog消息到消息队列,然后client异步消费kafka中的消息。

image.png

所以,我们部门选择了第二种同步方案,并且由于数据量并不大,也没有接入kafka,直接采用客户端从cannal侧拉数据的方式。

canal 同步数据异常情况分析

接着我先来提几个问题,我们可以思考🤔看看当前的架构设计是否能满足数据同步的基本要求。

1,如果客户端消费数据失败,会造成数据丢失吗?

2,如果cannal崩溃了,那么会造成拉取的binlog没有被消费而造成数据丢失的情况吗?

3,canal会有重复推送消费消息的情况吗?

4,如果ES侧暂时宕机,要想不丢失数据,应该怎么做?

以上是我针对同步数据时 围绕这个设计方案的可靠性与可恢复 提出的几个问题,我们针对它们来看看同步数据应该如何来做。

第一个问题客户端如果从canal 拉取到了消息,但是本地由于异常,或者宕机 导致消费失败了,可以做到不丢失数据。因为canal 对于消息的消费模型提供了ACK机制,客户端在拉取完一批消息后,可以依次消费消息,然后发送对应消息的ACK,如果消费失败,或者本地宕机,那么下次拉取消息的时候依然能够拉取到没有消费完的消息。

第二个问题, cannal 如果异常崩溃,也是可以做到 消息不丢失,canal在从数据库拉取binlog时,会记录拉取的日志偏移量offset到内存,但是偏移量的持久化 其实是通过定时任务 考虑客户端ACK位点后,才进行记录的,可以选择记录到zookeeper或者本地文件。所以如果canal宕机了,那么重启后,会从zookeeper或者本地文件中读取客户端最后ack的位点,然后从这个位置开始从数据库拉取消息。为了让canal 快速恢复,还可以做canal集群,让集群中始终有备节点。

第三个问题canal的确会有重复推送消费消息的可能,正如第二问题说的那样 偏移量的持久化是通过定时任务记录的,所以存在客户端消费了消息,但是这个ack位点还没有持久化的情况,如果这个时候canal 宕机重启了,那么将会把客户端消费过的消息也再发一遍。所以客户端消费消息需要做幂等处理。

第四个问题, 如果ES侧的数据写入失败了,或者ES直接宕机,也是能够做到ES宕机恢复后,数据不丢失的,最简单的方式其实是客户端发现ES写入失败了,然后不ACK消息,直接不断重试,直到写入成功为止,不过这种做法其实不太好,因为不ACK,那么消息会一直存到canal的内存里,同时canal会不断dump 数据库的binlog日志,又塞到内存里等待被客户端拉取消费,这样造成的后果就是canal 的内存会越来越大,最终停止数据库的同步操作。

一个比较好点的方式是,客户端消费了canal的消息,直接在本地将消息保存起来,比如写入到磁盘文件上,写入成功后即可发起ACK,然后本地启一个协程慢慢将磁盘文件上的消息更新到ES中,所以,最后选用了leveldb 对做本地文件的写入,leveldb写入文件的操作是很快的,这样快速的ACK消息对canal的内存压力也会小很多。

综上,我们部门的数据同步模型就变成了下面这样,canal做了集群,保证宕机了还有其他节点可以继续同步,客户端则是消费消息后将先把消息写入到本地,然后开启定时任务写入到ES,如果有错误的话,会一直重试,直到成功为止。

image.png

总结

最后,我来总结下,采用canal 去做MySQL 到ES的数据同步,我们的确是可以做到高可靠性的,但是要注意的canal的消息消费是有可能出现重复消息的,不过由于目前我们部门没有对消息进行统计的需求,仅仅是将数据进行更新或者插入,存在即更新,没有即插入,所以是幂等,可以不用太过关注。

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

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

相关文章

机器视觉学习(六)—— 图像的颜色识别

目录 一、色彩空间 1.1 RGB色彩空间 1.2 HSV色彩空间 1.3 灰度 1.4 CMYK色彩空间 1.5 Lab色彩空间 二、色彩空间转换 三、识别颜色 3.1 识别一种特定的颜色 3.2 识别多种颜色 一、色彩空间 计算机视觉中常用的色彩空间有RGB色彩空间、HSV色彩空间、CMYK色彩空间、La…

windows DCMTK编译使用(qt) 医学图像

由于项目需要生成DICOM格式的图片,需要使用到第三方开源库DCMTK,于是研究了一番,该库是C编写的,DICOM主要用于医疗体系中,除了可以保存图片信息外,还可以储存患者信息,病例信息,医疗…

如何修复WordPress网站媒体库上传文件失败的问题

公司最近推出了一系列新产品,为了更新网站的视频和图片,我们需要将它们上传至网站媒体库。然而,在上传视频时,我们却遇到了一些问题。系统提示说,我们尝试上传的视频文件大小超出了站点的最大上传限制。尽管我们的视频…

vue3中使用cesium

vue3中使用cesium Cesium是一个开源的JavaScript库,专门用于创建3D地球和2D地图的Web应用程序。它提供了丰富的功能和工具,使得开发人员能够轻松地构建出高质量的地理空间可视化应用。 1. 安装cesium包 npm install cesium2. 复制node_modules中的Ces…

Java IO流(超详细!)上篇

目录 一、File类1、操作文件和目录 二、I/O流概述1、按流向划分:输入流和输出流2、按处理单元划分:字节流和字符流3、按流的角色划分:节点流和处理流 三、字节流1、字节输出流基类:OutputStream2、字节输出流FileOutputStream类3、…

通过fail2ban服务监控frps日志实现禁止非法IP

前言 服务器使用了frp作为了内网穿透软件,查看frps的日志,发现总有一些国外的ip在扫描这台服务器的端口信息,日志如下图,所以想通过fail2ban服务能够直接禁用这些ip扫描服务器。 1、安装fail2ban服务 yum install -y fail2ban2、…

rpc详解rpc框架

文章目录 概述rpc的优点组件工作流程&RPC的底层原理RPC的底层原理 RPC框架rpc框架优点RPC 的实现基础RPC的应用场景RPC使用了哪些关键技术rpc 调用异常一般怎么处理rpc和http的区别为什么RPC要比HTTP更快一些Dubbo和openfeign 区别远程调用RPC框架传输协议传输速度 概述 在…

解决idea粘贴空格时显示NBSP的问题并且在Registry中找不到editor.show.special.chars

1、解决java 复制代码NBSP问题 参考文章 原因:2020.2版本以后无法找到以上的选项来解决问题;之后的版本这个选项换地方了 解决办法:在设置中找到Advanced Settings,把Render special characters前面的对勾取消掉就好了。

CTF-辨别细菌

题目描述&#xff1a;try your best to find the flag. 进入靶场后发现是一个游戏&#xff0c;需要全部答对才可以得到最后的flag 查看了一下源码&#xff0c;发现有一个答案模板的模块 尝试解释一下代码 <!-- 答案模版 --> <script id"template_game_pi…

HarmonyOS ArkTS 开发基础/语言

目录 一、ArkUI (方舟开发框架) 概述 1.1 基本概念 1.2 两种开发范式 1.3 不同应用类型支持的开发范式 二、ArkTS 声明式开发范式 2.1 开发能力 2.2 整体架构 三、ArkTS 基础类型 3.1 Any 类型 3.2 数字类型 3.3 字符串类型 3.4 布尔类型 3.5 联合类型 3.6 数组类…

GPT2从放弃到入门(二)

引言 本文介绍如何利用GPT2从零训练一个多轮对话聊天机器人&#xff0c;按照本文的思路可以轻松地训练自己的数据。 数据处理 ⚠️ 这是本文的核心部分&#xff0c;其他的内容甚至可以不用看。 本小节阐述多轮对话数据的处理。 数据来自网上的一份开源数据&#xff1a;htt…

基于springboot的留守儿童爱心网站

技术&#xff1a;springbootmysqlvue 一、系统背景 现代社会&#xff0c;由于经济不断发展&#xff0c;旧物捐赠的数量也在不断的增加&#xff0c;人们对留守儿童爱心信息的需求也越来越高。 以往的留守儿童爱心的管理&#xff0c;一般都是纸质文件来管理留守儿童爱心信息&am…

堆(详解+例题)

一、定义 维护一个数据集合&#xff0c;堆是一个完全二叉树。 那么什么是二叉树呢&#xff1f; 如图&#xff1a; 二、关于小根堆实现 性质&#xff1a;每个根节点都小于等于左右两边&#xff0c;所以树根为最小值。 2.1、堆存储&#xff08;用一维数组来存&#xff09; 记住…

C# 设置AutoScroll为true没效果的原因分析和解决办法

C#中添加tabControl 分页&#xff0c;将autoscroll设置为true发现缩小窗口没有滚动条效果。该问题出现后&#xff0c;检索发现也有很多人询问了该问题&#xff0c;但是都没有给出解决方案。 原因是内部button的属性Anchor设置为top、left、right、bottom导致的缩小界面窗口也没…

浅谈C++20 协程那点事儿

协程概念 先介绍一点协程的概念&#xff0c;如果你已经理解和掌握了相关的背景知识就可以跳过这个章节&#xff08;或者快速浏览下&#xff0c;也许我们有些观念不一致可以讨论&#xff09;。这里我想稍微聊的深入一点&#xff0c;这涉及到入门后遇到复杂的协程问题时能不能正…

代码随想录算法训练营第十六天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

代码随想录算法训练营第十六天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数 104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数…

【计算机考研】杭电 vs 浙工大 怎么选?

想求稳上岸的话&#xff0c;其他几所学校也可以考虑&#xff0c;以留在本地工作的角度考虑&#xff0c;这几所学校都能满足你的需求。 如果之后想谋求一份好工作&#xff0c;肯定优先杭电是比较稳的&#xff0c;当然复习的时候也得加把劲。 这个也可以酌情考虑&#xff0c;报…

固定资产管理系统日常业务有哪些

固定资产管理是一个非常重要的阶段。它涉及公司的长期投资、资产保值和资产报表的准确性。许多企业选择固定资产管理系统来有效管理这些资产。那么&#xff0c;固定资产管理系统的日常业务有哪些呢&#xff1f;  我们必须明确什么是固定资产管理系统。简而言之&#xff0c;它…

MYSQL报 - Lock wait timeout exceeded; try restarting transaction

前言 今天在使用数据库编辑数据时&#xff0c;页面突然卡主&#xff0c;退出程序后重新编辑&#xff0c;发现报错&#xff0c;1205 - Lock wait timeout exceeded&#xff1b; try restarting transaction&#xff08;如下图&#xff09;&#xff0c;正巧在和同事开会&#xf…

基于Spring Boot+Vue的高校学科竞赛平台

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…