20亿条记录的MySQL大表,我们这样迁移的
上一篇:再见了,收费的Navicat
作者 | Kamil Charłampowicz
策划 | Tina
我们的一个客户遇到了一个 MySQL 问题,他们有一张大表,这张表有 20 多亿条记录,而且还在不断增加。如果不更换基础设施,就有磁盘空间被耗尽的风险,最终可能会破坏整个应用程序。而且,这么大的表还存在其他问题:糟糕的查询性能、糟糕的模式设计,因为记录太多而找不到简单的方法来进行数据分析。
我们希望有这么一个解决方案,既能解决这些问题,又不需要引入高成本的维护时间窗口,导致应用程序无法运行以及客户无法使用系统。在这篇文章中,我将介绍我们的解决方案,但我还想提醒一下,这并不是一个建议:不同的情况需要不同的解决方案,不过也许有人可以从我们的解决方案中得到一些有价值的见解。
1云解决方案会是解药吗?
在评估了几个备选解决方案之后,我们决定将数据迁移到云端,我们选择了 Google Big Query。我们之所以选择它,是因为我们的客户更喜欢谷歌的云解决方案,他们的数据具有结构化和可分析的特点,而且不要求低延迟,所以 BigQuery 似乎是一个完美的选择。经过测试,我们确信 Big Query 是一个足够好的解决方案,能够满足客户的需求,让他们能够使用分析工具,可以在几秒钟内进行数据分析。但是,正如你可能已经知道的那样,对 BigQuery 进行大量查询可能会产生很大的开销,因此我们希望避免直接通过应用程序进行查询,我们只将 BigQuery 作为分析和备份工具。
2将数据流到云端
说到流式传输数据,有很多方法可以实现,我们选择了非常简单的方法。我们使用了 Kafka,因为我们已经在项目中广泛使用它了,所以不需要再引入其他的解决方案。Kafka 给了我们另一个优势——我们可以将所有的数据推到 Kafka 上,并保留一段时间,然后再将它们传输到目的地,不会给 MySQL 集群增加很大的负载。如果 BigQuery 引入失败(比如执行请求查询的成本太高或太困难),这个办法为我们提供了某种退路。这是一个重要的决定,它给我们带来了很多好处,而开销很小。
3将数据从 MySQL 流到 Kafka
关于如何将数据从 MySQL 流到 Kafka,你可能会想到 Debezium(https://debezium.io)或 Kafka Connect。这两种解决方案都是很好的选择,但在我们的案例中,我们没有办法使用它们。MySQL 服务器版本太老了,Debezium 不支持,升级 MySQL 升级也不是办法。我们也不能使用 Kafka Connect,因为表中缺少自增列,Kafka Connect 就没办法保证在传输数据时不丢失数据。我们知道有可能可以使用时间戳,但这种方法有可能会丢失部分数据,因为 Kafka 查询数据时使用的时间戳精度低于表列中定义的精度。当然,这两种解决方案都很好,如果在你的项目中使用它们不会导致冲突,我推荐使用它们将数据库里的数据流到 Kafka。在我们的案例中,我们需要开发一个简单的 Kafka 生产者,它负责查询数据,并保证不丢失数据,然后将数据流到 Kafka,以及另一个消费者,它负责将数据发送到 BigQuery,如下图所示。在公众号互联网架构师后台回复“2T”,获取Java面试题和答案惊喜礼包。
将数据流到BigQuery
4通过分区来回收存储空间
我们将所有数据流到 Kafka(为了减少负载,我们使用了数据过滤),然后再将数据流到 BigQuery,这帮我们解决了查询性能问题,让我们可以在几秒钟内分析大量数据,但空间问题仍然存在。我们想设计一个解决方案,既能解决现在的问题,又能在将来方便使用。我们为数据表准备了新的 schema,使用序列 ID 作为主键,并将数据按月份进行分区。对大表进行分区,我们就能够备份旧分区,并在不再需要这些分区时将其删除,回收一些空间。因此,我们用新 schema 创建了新表,并使用来自 Kafka 的数据来填充新的分区表。在迁移了所有记录之后,我们部署了新版本的应用程序,它向新表进行插入,并删除了旧表,以便回收空间。当然,为了将旧数据迁移到新表中,你需要有足够的空闲可用空间。不过,在我们的案例中,我们在迁移过程中不断地备份和删除旧分区,确保有足够的空间来存储新数据。
将数据流到分区表中
5通过整理数据来回收存储空间
在将数据流到 BigQuery 之后,我们就可以轻松地对整个数据集进行分析,并验证一些新的想法,比如减少数据库中表所占用的空间。其中一个想法是验证不同类型的数据是如何在表中分布的。后来发现,几乎 90% 的数据是没有必要存在的,所以我们决定对数据进行整理。我开发了一个新的 Kafka 消费者,它将过滤掉不需要的记录,并将需要留下的记录插入到另一张表。我们把它叫作整理表,如下所示。
经过整理,类型 A 和 B 被过滤掉了:
将数据流入新表
整理好数据之后,我们更新了应用程序,让它从新的整理表读取数据。我们继续将数据写入之前所说的分区表,Kafka 不断地从这个表将数据推到整理表中。正如你所看到的,我们通过上述的解决方案解决了客户所面临的问题。因为使用了分区,存储空间不再是个问题,数据整理和索引解决了应用程序的一些查询性能问题。最后,我们将所有数据流到云端,让我们的客户能够轻松对所有数据进行分析。由于我们只对特定的分析查询使用 BigQuery,而来自用户其他应用程序的相关查询仍然由 MySQL 服务器处理,所以开销并不会很高。另一点很重要的是,所有这些都是在没有停机的情况下完成的,因此客户不会受到影响。
6总结
总的来说,我们使用 Kafka 将数据流到 BigQuery。因为将所有的数据都推到了 Kafka,我们有了足够的空间来开发其他的解决方案,这样我们就可以为我们的客户解决重要的问题,而不需要担心会出错。
原文链接:
https://blog.softwaremill.com/our-way-of-dealing-with-more-than-2-billion-records-in-sql-database-99deaff0d31
最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。
正文结束
推荐阅读 ↓↓↓
1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事
2.如何才能成为优秀的架构师?
3.从零开始搭建创业公司后台技术栈
4.程序员一般可以从什么平台接私活?
5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...
6.IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看
7.漫画:程序员相亲图鉴,笑屎我了~
8.15张图看懂瞎忙和高效的区别!
一个人学习、工作很迷茫?
点击「阅读原文」加入我们的小圈子!
20亿条记录的MySQL大表,我们这样迁移的相关推荐
- mysql一个表几亿数据_如何在mysql 造1亿条记录的大容量数据表?
背景及目标:现有数据1000w单表,为压力测试准备1亿条数据. 步骤: 1.将1000w条记录,除id外都导入到多个文件中: //DELIMITER DROP PROCEDURE if EXISTS ...
- mysql十亿_Mysql:表中有数十亿条记录
我需要在Mysql表中保存约78亿条记录.该表既读写又密集.我必须每小时至少保留20亿记录的插入率.而在桌子上搜索不应超过10秒钟. 我们有一个UI,用户可以根据不同的colums属性进行搜索. 大多 ...
- mysql一张表100亿条数据_一个表有100亿条记录,如何优化
我们的数据库还在设计阶段.我们预计数据量将会很大,一年的时间里,一张表,就会产生100亿条数据,表结构,如下id,userid,createddate,等等正常情况下,100亿条记录如果都存在一个表里 ...
- MySQL 快速构造一亿条记录的表
在上一次朋友问我如何快速构造一亿条记录的表后,我理出了实行的办法,见:https://blog.csdn.net/csdnhsh/article/details/95759379,但是因为录入一亿 ...
- 14亿条记录,12c 做不到2小时内变更表结构字段类型?
导读:本文详细讲述Oracle 12c 在2小时内完成一张14亿条记录的表结构字段类型变更的过程,希望可以帮到工作中的大家,如有任何疑问,欢迎在本文的评论区交流讨论. 概述 Oracle大表在线修改的 ...
- mysql 一对多 右表多条记录合并_MYSQL 单表一对多查询,将多条记录合并成一条记录...
一.描述: 在MySQL 5.6环境下,应工作需求:将一个表中多条某个相同字段的其他字段合并(不太会表达,有点绕,直接上图) 想要达到的效果: 实现SQL语句: SELECT a.books, GRO ...
- mysql 万亿数据_sql-server – 哪个数据库可以处理数十亿/数万亿条记录的存储?...
我们正在研究开发一种捕获和分析netflow数据的工具,我们收集了大量的数据.每天我们捕获大约14亿个流记录,这些记录在json格式中看起来像这样: { "tcp_flags": ...
- 将PostgreSQL数据库扩展到每个月12亿条记录的经验教训
这不是我第一次使用大型数据集.我为最大的英国公共Wi-Fi供应商设计的认证和产品管理数据库也有巨大的容量.我们每天跟踪数百万设备的身份认证.然而,该项目有资金,允许我们选择任何硬件.任何支持服务以及聘 ...
- delete mysql 大表_无语了,直到今天,我才揪出MySQL磁盘消耗迅猛的“真凶”!
作者:dbapower 链接:https://blog.51cto.com/suifu/2135599 背景 Part1:写在最前 当一张单表10亿数据量的表放在你面前,你将面临着什么? Part2: ...
- 史上最全MySQL 大表优化方案(长文)
转载自 史上最全MySQL 大表优化方案(长文) 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 一.单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑 ...
最新文章
- osgEarth3.0 加载天地图
- Go 语言编程 — 数据类型转换
- java gc会回收类么_Java GC 垃圾回收机制
- python函数后面有多个括号怎么理解?
- [转] 理解SVG transform坐标变换
- Web应用安全--攻防对抗发展趋势
- 送书《R语言数据分析和可视化》 | 这个为生信学习和生信作图打造的开源R教程真香!!!...
- ionic 配置java_Ionic 项目配置环境
- K8S_Google工作笔记0011---通过二进制方式_为APIServer生成自签证书
- 《数值分析》学习笔记 ·003——数值计算中应该注意的几个问题
- 将home多余的空间分配到/分区下
- java 多线程之间通信_java多线程之间的通信
- 后端分布式系列:分布式存储-MySQL 数据库事务与复制
- pandasql库学习使用之在Python中执行SQL语句
- 奈奎斯特稳定性判据的推导
- bootstrap 三级导航
- Java常量池简单认识
- 设置Centos7时区
- PDF文件中的图片导出
- PowerVR 三十周年:回顾与展望