京东云开发者|mysql基于binlake同步ES积压解决方案

京东,开发者,mysql,基于,binlake,同步,es,积压,解决方案 · 浏览次数 : 420

小编点评

**背景与目标** **背景:** * 国际财务泰国每月月初账单任务生成,或者重算账单数据。 * 数据同步方案为 MySQL 通过 binlake 同步 ES 数据。 **目标:** * 解决 binlake 到 JMQ 积压同步 ES 数据的问题。 **当前业务流程** **流程图:** ```mermaid graph LR A[运营端] --> B[binlake] B --> C[ES 解析] C --> D[MQ 消费] D --> E[ES 写入] E --> F[数据存储] F --> G[JMQ 消费] ``` **问题分析** **问题现象:** * JMQ 积压,报警国内站截图。 **分析原因:** * binlake写入量大,导致 ES 写入 QPS瓶颈。 * ES写入慢导致消费积压。 * 消费者并发数设置不合理,导致部分主题分片数量不足。 **临时处理方案** * 开启并行消费策略,以提高消费速率。 **提升消费速率的方法** **方案 1:MQ 增加消费速度** * 扩容消费端实例数量。 * 提高消费端批量大小。 * 考虑增加消费端实例增加批量大小。 **方案 2:并行有序消费** * 实现数据幂等性。 * 使用缓存来减少数据处理时间。 * 采用并行消费策略,以提高消费效率。 **性能分析** * 两种方案都可通过调整消费端并发数和批量大小来提升性能。 * 方案 2 的并行消费策略可扩展性,支持动态扩容。 * 两种方案的性能比较复杂,需要根据具体需求进行评估。

正文

1 背景与目标

1.1 背景

国际财务泰国每月月初账单任务生成,或者重算账单数据,数据同步方案为mysql通过binlake同步ES数据,在同步过程中发现计费事件表,计费结果表均有延迟,ES数据与Mysql数据不一致,导致业务页面查询数据不准确,部分核心计算通过ES校验失败

1.2目标

解决binlake到JMQ积压同步ES延迟问题

2 当前业务流程

2.1 流程图

现有业务基本流程如下图,包含运营端和外部数据接入,整体操作到数据存储流程

2.2 数据流

3 问题分析

3.1 问题现象

jmq积压,报警
国内站截图如下

3.2 筛查分析

普及:JMQ默认生产者发送消息QPS受到主题的broker数量影响,(8w/s)/broker

3.2.1 MQ积压分析

1)分析原因一、ES写入量大,导致ES写入QPS瓶颈

ES写入瓶颈需要进行压测,才能确定实际是否达到瓶颈;
通过查询集群负载,写入队列有无积压,cpu高不高,来定位
以下为调整MQ批量消费大小后的ES监控
写入队列无积压,CPU不高,写入QPS没有达到瓶颈

2)分析原因二、ES写入慢导致消费积压

ES解析服务解析慢,瓶颈在ES解析处
根据当前系统CPU、负载信息定位是否服务器性能满负荷,是否扩容
无报警信息,整体运行平稳,基本排除业务资源达到瓶颈问题引起写入慢

MQ消费端消费慢,瓶颈在消费并发处
当前主题分片数3,队列数为15,默认最大并发数为15*10,报警当时入队数500~700/s
定位问题,为MQ消费慢,其根本原因为受到ES-Parse业务系统处理速度影响

3.3 临时处理方案

开启mq并行消费策略,写入QPS显著增加

4 如何提升消费速率,提升写入ES速率

造成问题原因核心点是MQ积压,业务系统消费慢,MQ入队数大于出队数,导致积压

4.1 原理分析

4.1.1 存储流程解析

第一步:binlake订阅mysql binlog
第二步:发MQ,JMQ数据传输
第三步:消费JMQ数据,ES Paser数据解析,
第四步:数据存储

4.1.2 binlake基本原理

4.1.3 binlake发送MQ过程

4.1.4 JMQ消费原理

JMQ消费默认就是批量消费
消费原理如下图

批量消费与并行消费原理如下图

通过分析,在未开启并行消费前提下,当前主题最大处并发的消费处理能力即是队列数

4.2 提升消费速率的几种方案

4.2.1MQ增加消费速度方法

扩容,增加并发消费能力
针对MQ默认情况下,一切扩容都能解决问题,增大分片数,增加队列数
需要额外资源,申请扩容新的broker,同时考虑增加消费端实例

增加批量大小
首先保证,业务系统(ES-Parse)消费MQ消息,处理10条和处理100条速度基本一样
实践:国际财务针对此方法进行代码逻辑改造

开启并行数
理论上增加(并行数/批量数)的倍数并发处理能力
要求数据无序,针对乱序,数据存储,不影响业务

4.2.2 并行有序的方案

1)实现数据幂等性,增加缓存,并行消费策略

方案流程

基础实现流程:

1)根据binlake发送mq,在mq端开启并行消费,确保并行消费
2)根据业务单号对,单号加锁(如麦哲伦对运单号加锁,即对单号加分布式锁),根据对应的ID获取ES数据。
3)校验数据是否有效,若查询无数据,则直接新增;若查询的数据状态大于当前数据状态,则直接抛弃,若查询状态小于当前数据状态,则直接更新数据
4)更新缓存并释放锁

优点

  • 指定资源情况下,增大消费端并发
  • 可以开启并行消费,且保证顺序消费
  • 可以使得资源充分利用,增加消费性能

缺点

  • 增加毫秒级缓存额外开销

实践:麦哲伦运单中心针对此方案实现binlake数据同步ES

2)binlake主题分发子主题,显示增大并发策略

优点:

  • 逻辑相对简单,不需要开发复杂逻辑,无需引入额外中间件
  • 预估转发消息速率即是实际处理速率

提升速率计算:

  • 原主题单线程处理一条数据存储到ES时间为es_time,举例为50ms,每秒吞吐量是20条
  • 现单线程转发MQ一条数据时间为trans_time,举例为20ms,每秒转发吞吐量50条
  • 假设转发topic为N个子主题,则吞吐量理论为n*20实际小于转发吞吐量50,此处多子主题对cpu核数竞争
  • 提升吞吐量为=(1000ms/trans_time )转发吞吐量 - (1000ms/es_time)原有吞吐量

缺点

  • 扩展性不好,实际结果有待验证,小于预估值

实践:跨境赤道分发中心实现类似功能实践,消息转发,其他MQ实现

3)俩种方案对比

主题较少一个俩个主题情况下,且业务处理比较耗时情况下,不想额外开发,可选方案二
长期方案选择方案一,并行消费策略,可伸缩性,可扩展,支持动态扩容

5.总结

针对MQ积压问题,并行消费可以是解决问题的一大利器,本文从binlake同步ES进行分析,同时针对积压推荐俩种方案,并从性能合理利用及扩展性分析,简要介绍方案二并行有序消费策略,希望能够帮助大家,如有问题,请随时指出!

作者:任洪波

与京东云开发者|mysql基于binlake同步ES积压解决方案相似的内容:

京东云开发者|mysql基于binlake同步ES积压解决方案

1 背景与目标 1.1 背景 国际财务泰国每月月初账单任务生成,或者重算账单数据,数据同步方案为mysql通过binlake同步ES数据,在同步过程中发现计费事件表,计费结果表均有延迟,ES数据与Mysql数据不一致,导致业务页面查询数据不准确,部分核心计算通过ES校验失败 1.2目标 解决binl

Mysql到TiDB迁移,双写数据库兜底方案

作者:京东零售 石磊 TiDB 作为开源 NewSQL 数据库的典型代表之一,同样支持 SQL,支持事务 ACID 特性。在通讯协议上,TiDB 选择与 MySQL 完全兼容,并尽可能兼容 MySQL 的语法。因此,基于 MySQL 数据库开发的系统,大多数可以平滑迁移至 TiDB,而几乎不用修改代

MySQL 执行计划详解

本文从EXPLAIN分析SQL的执行计划开始,进行示例展示,并对输出结果进行解读,同时总结了EXPLAIN可产生额外的扩展信息以及EXPLAIN的估计查询性能,整篇文章基于MySQL 8.0编写,理论支持MySQL 5.0及更高版本。

我在前端写Java SpringBoot项目

本篇文章主要是使用 NestJs + Sequelize + MySQL 完成基础运行, 带大家了解 Node 服务端的基础搭建,也可以顺便看看 Java SpringBoot 项目的基础结构,它俩真的非常相似,不信你去问服务端开发同学。

高性能MySQL实战(二):索引 | 京东物流技术团队

我们在上篇 高性能MySQL实战(一):表结构 中已经建立好了表结构,这篇我们则是针对已有的表结构和搜索条件为表创建索引。 1. 根据搜索条件创建索引 我们还是先将表结构的初始化 SQL 拿过来: CREATE TABLE `service_log` ( `id` bigint UNSIGNED N

高性能MySQL实战(三):性能优化 | 京东物流技术团队

这篇主要介绍对慢 SQL 优化的一些手段,而在讲解具体的优化措施之前,我想先对 EXPLAIN 进行介绍,它是我们在分析查询时必要的操作,理解了它输出结果的内容更有利于我们优化 SQL。为了方便大家的阅读,在下文中规定类似 key1 的表示二级索引,key_part1 表示联合索引的第一部分,uni

数据库深分页介绍及优化方案 | 京东云技术团队

在前端页面显示,为了避免一次性展示全量数据,通过上下翻页或指定页码的方式查看部分数据,就像翻书一样,这就利用了MySQL的分页查询。

MySql索引下推知识分享

作者:刘邓忠 Mysql 是大家最常用的数据库,下面为大家带来 mysql 索引下推知识点的分享,以便巩固 mysql 基础知识,如有错误,还请各位大佬们指正。 1 什么是索引下推 索引下推 (Index Condition Pushdown,索引条件下推,简称 ICP),是 MySQL5.6 版本

文盘Rust -- 安全连接 TiDB/Mysql

最近在折腾rust与数据库集成,选了Tidb Cloud Serverless Tier 作为数据源。Tidb 无疑是近五年来最优秀的国产开源分布式数据库,Tidb Cloud Serverless Tier作为pingcap旗下的云产品方便又经济,这次使用还有一些小惊喜。

从一些常见的错误聊聊mysql服务端的关键配置

MySQL服务端配置对使用方来说是不可更改的,需要联系DBA进行操作。这些配置操作对我们来说是一个黑盒,但是了解核心配置可以帮助我们快速定位数据库问题原因。