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积压解决方案的更多相关文章

  1. 京东云开发者|京东云RDS数据迁移常见场景攻略

    云时代已经来临,云上很多场景下都需要数据的迁移.备份和流转,各大云厂商也大都提供了自己的迁移工具.本文主要介绍京东云数据库为解决用户数据迁移的常见场景所提供的解决方案. 场景一:数据迁移上云 数据迁移 ...

  2. 京东云开发者|ElasticSearch降本增效常见的方法

    Elasticsearch在db_ranking 的排名又(双叒叕)上升了一位,如图1-1所示;由此可见es在存储领域已经蔚然成风且占有非常重要的地位. 随着Elasticsearch越来越受欢迎,企 ...

  3. 京东云开发者|经典同态加密算法Paillier解读 - 原理、实现和应用

    摘要 随着云计算和人工智能的兴起,如何安全有效地利用数据,对持有大量数字资产的企业来说至关重要.同态加密,是解决云计算和分布式机器学习中数据安全问题的关键技术,也是隐私计算中,横跨多方安全计算,联邦学 ...

  4. 京东云开发者|关于“React 和 Vue 该用哪个”我真的栓Q

    一.前言:我全都要 面对当今前端界两座大山一样的主流框架,React和Vue,相信很多小伙伴都或多或少都产生过这样疑问,而这样的问题也往往很让人头疼和犹豫不决: 业务场景中是不是团队用什么我就用什么? ...

  5. 京东云开发者|软件架构可视化及C4模型:架构设计不仅仅是UML

    软件系统架构设计的目标不在于设计本身,而在于架构设计意图的传达.图形化有助于在团队间进行高效的信息同步,但不同的图形化方式需要语义一致性和效率间实现平衡.C4模型通过不同的抽象层级来表达系统的静态结构 ...

  6. 京东云开发者| Redis数据结构(二)-List、Hash、Set及Sorted Set的结构实现

    1 引言 之前介绍了Redis的数据存储及String类型的实现,接下来再来看下List.Hash.Set及Sorted Set的数据结构的实现. 2 List List类型通常被用作异步消息队列.文 ...

  7. 京东云开发者|IoT运维 - 如何部署一套高可用K8S集群

    环境 准备工作 配置ansible(deploy 主机执行) # ssh-keygen # for i in 192.168.3.{21..28}; do ssh-copy-id -i ~/.ssh/ ...

  8. 干货 | SSMS客户端连接京东云RDS SQL Server配置方法

    干货 | SSMS客户端连接京东云RDS SQL Server配置方法 原创: 于振江 京东云开发者社区  微软SQL Server, Oracle数据库以及MySQL系列占据了关系型数据库市场的绝对 ...

  9. 从单个系统到云翼一体化支撑,京东云DevOps推进中的一波三折

    作者:王利莹 采访嘉宾:京东云DevOps团队负责人 郑永宽 今年,IDC 特别针对中国地区发布了<IDC MarketScape:中国 DevOps 云市场2019,厂商评估>研究报告, ...

随机推荐

  1. HDU 6467 简单数学题 (组合数学推导)

    题意 题解 Step 1 把原式进行了最基本的变换,把 i 移到右边,并先枚举 j ,这里 i 从 0 开始枚举,并不影响答案,因为 C(j,0) 乘 0 后没有影响,但是这样方便后面的推导 Step ...

  2. c# 异步进阶————channel [一]

    前言 该系列为异步编程的进阶篇,其实也不能这么讲.世界上本没有进阶篇,只能说是高级篇(高级篇不能说多高级,是对底层的封装的意思),只要是加深理解都是进阶. 本章先介绍一下channel. 正文 下面没 ...

  3. MySQL插入重复数据

    MySQL中批量insert into时防止更新插入重复数据去重的方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法 方案一:使用ignore关键字 ...

  4. luogu [ZJOI2007] 矩阵游戏

    [ZJOI2007] 矩阵游戏 题目描述 小 Q 是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个 \(n \times n\) 黑白方阵进行(如同国际象棋 ...

  5. haodoop数据压缩

    压缩概述 压缩技术能够有效减少底层存储系统(HDFS)读写字节数.压缩提高了网络宽带和磁盘空间的效率.在运行MR程序时,I/O操作,网络数据传输,Shuffle和Merge要花大量的时间,尤其是数据规 ...

  6. 一步步搞懂MySQL元数据锁(MDL)

    某日,路上收到用户咨询,为了清除空间,想删除某200多G大表数据,且已经确认此表不再有业务访问,于是执行了一条命令'delete from bigtable',但好长时间也没删完,经过咨询后,获知dr ...

  7. k8s 中的 Pod 细节了解

    k8s中Pod的理解 基本概念 k8s 为什么使用 Pod 作为最小的管理单元 如何使用 Pod 1.自主式 Pod 2.控制器管理的 Pod 静态 Pod Pod的生命周期 Pod 如何直接暴露服务 ...

  8. 创建Grafana Dashboard

    输入表达式,获取数据 但是考虑到多台主机,需要添加变量来选择不同主机,从而出现相应的图表 点击右上角齿轮一样的图标,这个是设置 通过在prometheus界面查询可知,可以设置的变量有两个 考虑到这俩 ...

  9. 使用supervisor管理tomcat,nginx等进程详解

    1,介绍 官网:http://supervisord.org Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时 ...

  10. 使用Gitlab的CI/CD功能自动化推送docker镜像到Nexus仓库出现的问题

    在服务器中可以直接使用命令行登录,推送docker镜像等 但是在使用Gitlab的CI/CD功能中,gitlab-ci.yml文件执行过程中出现如下错误: 原因分析: 服务器上之前使用命令行登陆过Ne ...