当前位置: 首页 > news >正文

一个MySQL连接问题的优化过程

这是学习笔记的第 2008 篇文章


  今天有一个开发同事反馈说通过sqoop在大数据和MySQL之间同步数据的时候,报了一个连接失败的错误。 

org.apache.hadoop.mapred.YarnChild: Exception running child : java.io.IOException: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.

顺着这些错误日志定位发现是大数据集群的新增节点无法访问MySQL导致。 

经过梳理,发现这个连接的问题竟然和大数据集群操作有关。问题的过程是这样的:

大数据集群管理员新增了集群节点,对于分布式系统来说这是对业务透明的。

sqoop做数据流转的时候,恰好数据就在新增的节点上面,但是新增节点是没有访问MySQL的权限的,也就导致了我们开始时所说的问题。

640?wx_fmt=png

对于这个问题,我们划分了4个角色,也是归属于4个不同的小组,彼此独立:

1)大数据管理组,集群节点的操作对于业务来说应该是透明的。

2)数据分析组,他们使用大数据集群,同时做数据流转的工作,对他们来说对于大数据集群的节点也是不关心的

3)数据库管理组,因为涉及到大数据到数据库的数据流转,DBA不知道大数据新增节点会涉及哪些数据库的权限变更。 

4)数据业务组,他们使用最终的数据,对于他们来说只识别MySQL端

通过上面的一些角色和基本的分工,我们发现看起来是一个简单的问题,实际上是一个流程化的工作。上游不关心下游的使用,下游不知晓上游的变更,信息在流转中出现了缺失。

所以这个问题只是冰山一角,这映射出权限管理的一个通用的问题。对于上下游之间如何衔接和有效配合,我们多个小组做了讨论,初步的想法就是通过邮件的方式来建立这个流程,我们可以叫它是一个邮件链。信息由变更发起方通知,在这里就是大数据管理组,他们发布变更通知的时候,需要同时附带关联的MySQL集群,而这个信息显然不是大数据管理组来获得,而是应该有数据分析组来提供,对于他们来说应该需要明确数据流转的细节,而这个邮件信息初步确认之后,DBA收到这个邮件信息之后就会根据提供的信息开通相应的权限,而这个操作对于数据使用方来说是无感知的。 

   而这个问题仅仅是个开始,我们在处理权限问题的时候发现这个数据流转相关的单表有近400G,数据量在17亿左右。 对于MySQL来说,这个表的数据操作就是一颗不定时炸弹,一旦出现慢查询,那执行时间都会无限放大。 

经过分析,我们大体理解了这几个大表的业务逻辑,大数据集群会去做计算,把计算后的结果数据导入MySQL中,这个导入的频率是T+1,也就意味着这是一个延迟1天的数据流转操作,比如今天是6月13日,那么流转的数据是6月12日这一天的。 所以按照数据的生成规律来看,使用典型的周期表业务就可以支持这种数据管理方式。 

假设表为test_data,则周期表为:test_data_20190601,test_dat_20190602,test_data_20190603

和业务方做了初步的沟通,会发现周期表可以实现这个需求,但是对于目前的问题来说,需要相关的多方都改动业务逻辑代码,要完成这个联调还是需要花费一些时间的。 所以业务同学是倾向于通过删除数据的方式,尽可能保留原来的表名,我们经过沟通提出了潜在的问题,即数据流转写入的时候,假设数据有300万,则在binlog中会记录这300万的数据变化,而要删除以前的数据,假设也有300万,则binlog也会记录这300万的数据变化,这样一来数据的代价就是600万,而使用周期表的方式,我们就可以很容易的控制表的数据,确认删除的数据使用drop产生的binlog很少,所以从功能和性能角度来说,我们是不建议在一张大表中存放数据按照时间维度来删除的。

    在当前的情况下,尽可能让双方都不做变更,我们可以间接的实现周期表,即表test_data名字不变,在20190603的这一天,写入test_data的数据是20190602的数据,则DBA在数据流转之后,就可以把表test_data改名为20190602,而复制完整的表结构信息新建表test_data.

这样一来整个数据库中的列表信息如下:

test_data

test_data_20190601

test_data_20190602

test_data_20190603

使用这种方式之后,对于业务使用经过确认是不需要改动的,但是对于DBA来说可以更加有效的管理数据。

下午的时候经过确认把原来的近400G的大表做了rename操作,整个数据流转的过程就更加轻量了。

640?

相关文章:

  • 认知的偏差
  • 迁移到MySQL的架构演进(一)
  • K-Means算法原理和简单测试
  • 如何让你的工作能够大量输出
  • 数据生命周期管理的初步实现
  • MySQL分布式高可用的一个补充
  • MySQL锁
  • 难忘的三件苦差事
  • 千与千寻,真是一部给大人看的动画片
  • 聊聊高考分数线和选择
  • MySQL中间件的连接错误问题排查
  • 一次宕机问题的总结复盘
  • 所谓简单的事情
  • 数据分析上千部动漫作品
  • 生活中的一些文字调料
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • android 一些 utils
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • JavaScript的使用你知道几种?(上)
  • Javascript基础之Array数组API
  • jQuery(一)
  • linux安装openssl、swoole等扩展的具体步骤
  • Mysql优化
  • PHP 7 修改了什么呢 -- 2
  • React+TypeScript入门
  • STAR法则
  • Windows Containers 大冒险: 容器网络
  • 程序员最讨厌的9句话,你可有补充?
  • 从重复到重用
  • 基于遗传算法的优化问题求解
  • 记一次删除Git记录中的大文件的过程
  • 日剧·日综资源集合(建议收藏)
  • 与 ConTeXt MkIV 官方文档的接驳
  • Java性能优化之JVM GC(垃圾回收机制)
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 通过调用文摘列表API获取文摘
  • 我们雇佣了一只大猴子...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​什么是bug?bug的源头在哪里?
  • ​虚拟化系列介绍(十)
  • # 达梦数据库知识点
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四) Graphivz 颜色选择
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)前K大的和
  • (转)fock函数详解
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation