作业帮 x TiDB丨多元化海量数据业务的支撑

导读

作业帮是一家成立于 2015 年的在线教育品牌,致力于用科技手段助力教育普惠。经过近十年的积累,作业帮运用人工智能、大数据等技术,为学生、老师、家长提供学习、教育解决方案,智能硬件产品等。随着公司产品和业务场景越来越丰富,数据量越来越大,业务方对数据库的使用需求也越来越多元化。本文介绍了作业帮对 TiDB 的探索历程,以及逐渐落地多个业务场景的使用实践。

TiDB 在作业帮的探索和推广

作业帮内部最开始接触的版本是 TiDB v4.0.9。相较于 TiDB v3.x,v4.0.9 在性能、管理、易用性等方面都有了质的提升,同时 TiDB 的生态组件以及社区也都达到了非常完善的程度,可以说是一个标志性的版本。2020 年,我们正式开始调研测试 TiDB v4.0.9, 以实现团队在分布式数据库的技术储备,从而更好地服务公司的业务需求。

1. 探索期: 使用 TiDB 隔离对在线 MySQL 集群有性能影响的查询请求

研发人员需要不定时查询线上实时数据,以此来确定业务数据的情况或者对部分业务数据做汇总分析。

● 引入 TiDB 之前:业务人员是直连到 MySQL 从库查询数据,如果扫描的数据量太大经常会引起线上 MySQL 节点性能抖动甚至机器的 io/cpu 资源瓶颈。

● 引入 TiDB 之后:通过数据同步工具 DM 将 MySQL 的数据以全量+实时增量的方式同步到 TiDB 中,实现在线、离线请求的隔离性。

在这个探索阶段,一方面满足了离线查询的隔离性的要求,另一方面也熟悉了 TiDB 及其生态组件的特性以及使用方法。

2、推广期:内部分享+主动出击

经过半年左右时间的使用,在对 TiDB 有一定了解的基础上,我们开始在公司内部进行 TiDB 相关的技术分享,向研发人员介绍 TiDB 的一些特性和在大数据量场景下的优势,并主动接触各个业务线去寻找合适的使用场景。研发人员也陆续将一些业务 内部使用的报表服务 接入到离线 TiDB 集群中。

在线业务落地从 0-1

在各个团队使用和熟悉 TiDB 一段时间后,我们开始针对已有业务的痛点或者未来新业务的规划,逐渐将视野转移到 TiDB。通过配合业务一起测试验证,开始正式将在线业务迁移到 TiDB 中。

1、报表平台使用 TiDB 突破存储&性能瓶颈

作业帮的报表服务每天要导入大量来自各个业务线的文件数据,来实现最终的数据大盘展示。随着业务线越来越多以及 MySQL 单实例主机的磁盘限制,报表服务平台逐渐显现出存储受限以及数据展示响应慢,甚至无法响应等问题。

我们通过 DM 将数据同步到 TiDB 中,经过业务验证,TiDB 对 SQL 达到了高度兼容性。同时,对比使用 MySQL 的耗时,TiDB 减少 80% 的时间,效果远超预期。随着 DM 同步稳定性的提高,报表平台也将一些直连线上 MySQL 的报表服务改成使用 TiDB 作为数据源。

经过改造,报表服务最终架构如下:

2、业务流水数据

业务流水数据业务的主要特点是每日写入数据量特别大,而且需要保存时间比较长。在公司的多个业务线中,只要是发展到一定阶段,使用 MySQL 存储的数据最终都会遇到存储瓶颈。此时 TiDB 便是非常好的一种解决方案。

在线业务落地从1-N

得益于 DM 同步数据的可靠性以及后面 TiDB-5.x 版本的兼容性、稳定性,作业帮有些业务逐渐将性能采集数据、用户访问记录、业务日志等业务也迁移到 TiDB。同时,在人工智能爆发的背景下,越来越多的探索性业务天然需要存储海量的数据,TiDB 自然成为首选方案。当然,线上还有很多核心业务不会轻易更换数据存储方案,那么对历史数据的归档使用 TiDB 也是目前的标准方案。

从 TiDB 4.0 版本开始,TiDB 加入了 TiFlash 列存引擎,并且在之后的版本中不断增强。如果业务有任何复杂查询需求,直接就可以在 TiDB 集群里通过增加 TiFlash 节点解决一些比较复杂的查询。

总结以及未来展望

现在,TiDB 在作业帮内部使用中已经可以独当一面了。目前,作业帮已经部署了几十套 TiDB 集群,总体数据量规模超过百 TB。在这些集群中,大部分采用的是 TiDB 5.4 版本,有一半已经升级到 6.5 版本。如果大家还在用 v3.x 版本的话,建议可以采用一些比较保险的方法测试升级到新的版本。作业帮从 v4.0.9 版本一路不断升级上来,整体感受是越来越稳定,让人比较安心,升级过程也非常丝滑,业务几乎没有任何感知。

最近有看到消息说杭州银行已经在核心账务系统上线 TiDB 6.5.6 版本,到 2024 年我们应该也会全部升级到这个版本。

最后,也说一下对 TiDB 的希望:

  1. 希望 TiDB 能有不依赖于 CDC 的主备集群方案,一方面可以做异地机房的灾备,另一方面可以作为升级回滚的方案,避免升级之后出现业务不兼容的情况;
  2. 探索使用资源管控方案 (Resource Control)。对于 MySQL 分库分表的业务,无法将多个分集群同步到同一个 TiDB 集群,会出现库名冲突的情况;
  3. SQL 限流或者拦截功能:对于资源消耗异常高的 SQL,可以自动进行降级处理,避免将集群资源耗尽,集群雪崩。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马程序员——移动Web——day03

目录: 移动Web基础 谷歌模拟器屏幕分辨率视口二倍图适配方案rem 简介媒体查询rem布局flexible.jsrem移动适配less 注释运算嵌套变量导入导出禁止导出综合案例-极速问诊 准备工作头部布局头部内容banner区域问诊类型布局问诊类型内容 1.移动 Web 基础 谷歌模拟器 …

软件实例分享,家具生产出库管理系统软件教程

软件实例分享,家具生产出库管理系统软件教程 一、前言 以下软件程序教程以 佳易王家具行业生产出库管理系统软件V16.1为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 销售管理——产品状态查询变更,可以根据生产进度变更…

每日OJ题_二叉树dfs①_力扣2331. 计算布尔二叉树的值

目录 力扣2331. 计算布尔二叉树的值 解析代码 力扣2331. 计算布尔二叉树的值 2331. 计算布尔二叉树的值 难度 简单 给你一棵 完整二叉树 的根,这棵树有以下特征: 叶子节点 要么值为 0 要么值为 1 ,其中 0 表示 False ,1 表示…

七天入门大模型 :来,亲手做一个AI应用!

内容提纲 七天入门大模型已完成了6篇,喜欢记得收藏、关注、点赞。 七天入门大模型 :LLM大模型基础知识最全汇总七天入门大模型 :提示词工程 Prompt Engineering,最全的总结来了!七天入门大模型 :LLM和多模…

74HC373使用方法

74HC373属于D锁存器 OC:输出控制,低电平输出使能 LE:锁存使能输入,低电平直通,高电平锁存 Q:数据输出引脚 D:数据输入引脚

推荐系统|召回04_离散特征处理

离散特征处理 离散特征是什么 怎么处理离散特征 One-hot编码 Embedding嵌入 从one-hot到Embedding,已经节省了很多的存储空间,但当数据量大的时候,还是占空间,所以工业界仍会对Embedding进行优化 而一个物品所对应的Embedding参数…

使用Python编写脚本-根据端口号杀掉进程

我的GitHub:Powerveil - GitHub 我的Gitee:Powercs12 - Gitee 皮卡丘每天学Java 从前段开始遇到一个问题,服务在启动的时候总是端口被占用,发现还是Java程序,但是当时并没有启动Java程序,电脑出问题了。 一…

Vue项目-创建

Vue项目-创建 创建一个工程化的Vue项目,执行命令:npm init vuelatest 第一次执行npm init vuelatest命令,会出现以下提示,输入y即可安装create-vue最新版本。 随后create-vue脚手架会给出项目的众多选项 根据提示输入命令 cd…

WebServer 之 http连接处理(下)

目录 ✊请求报文--解析 流程图 && 状态机 状态机 -- 状态转移图 主状态机 从状态机 http 报文解析 HTTP_CODE 含义 从状态机 逻辑 主状态机 逻辑 🐞请求报文--响应 基础API stat mmap iovec writev 流程图 HTTP_CODE 含义(2) 代码分析 …

CV | Segment Anything论文详解及代码实现

本文主要是详解解释了SAM的论文部分以及代码实现~ 论文:2023.04.05_Segment Anything 论文地址:2304.02643.pdf (arxiv.org) 代码地址:facebookresearch/segment-anything: The repository provides code for running inference with the Seg…

鲜为人知的python位运算

位运算&#xff0c;计算机内所有的数都以二进制存储&#xff0c;位运算就是对二进制位的操作 位运算符说明<<按位左移&#xff0c;左移n位相当于乘以2的n次方>>按位右移 &#xff0c;左移n位相当于除以2的n次方&按位与&#xff0c;二进制位数同且为1结果位为1…

RK3399平台开发系列讲解(USB篇)USB控制传输方式介绍

🚀返回专栏总目录 文章目录 一、控制传输详解二、Setup阶段和Data阶段三、Setup 事务格式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢USB控制传输是USB通信中的一种基本传输类型,用于控制USB设备的配置和操作。它由 Setup 阶段和 Data 阶段组成,可用于发送命令…

Vulnhub靶机:DC5

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;DC5&#xff08;10.0.2.58&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/dc/DC-5.zi…

Mysql第二关之存储引擎

简介 所有关于Mysql数据库优化的介绍仿佛都有存储引擎的身影。本文介绍Mysql常用的有MyISAM存储引擎和Innodb存储引擎&#xff0c;还有常见的索引。 Mysql有两种常见的存储引擎&#xff0c;MyISAM和Innodb&#xff0c;它们各有优劣&#xff0c;经过多次优化和迭代&#xff0c;…

数据库数据加密的 4 种常见思路的对比

应用层加解密方案数据库前置处理方案磁盘存取环节&#xff1a;透明数据加密DB 后置处理 最近由于工作需要&#xff0c;我对欧洲的通用数据保护条例做了调研和学习&#xff0c;其中有非常重要的一点&#xff0c;也是常识性的一条&#xff0c;就是需要对用户的个人隐私数据做好加…

Jetson下的i2c、spi、gpio、can、uart、485代码示例使用说明

适用于刚接触新设备的同学参考。 UART 演示代码 目前&#xff0c;这是一个简单的 Python 3 脚本&#xff0c;用于与 NVIDIA Jetson Nano 开发套件的 J41 头上的 UART 进行交互。当然只要是jetson都可以用&#xff0c;改一下程序里面的设备节点就行 JetsonHacks 上的原始文章&…

智能摄像头prv文件恢复案例

家用智能摄像头一般采用的是mp4或者mov视频方案&#xff0c;常见的是mp4&#xff0c;对于部分有开发能力的厂商可能会采用自定义方案&#xff08;如360的bin文件&#xff09;,今天我们来看一个小厂的PRV自定义文件的恢复案例。 故障存储: 32G TF卡/fat32/ 簇&#xff08;块)大…

stl~string

迭代器 typedef char* iterator;typedef const char* const_iterator;iterator begin(){return _str;}iterator end(){return _str _size;}const_iterator begin() const//左值const{return _str;}const_iterator end() const{return _str _size;} for&#xff08;auto e : …

Nginx (window)2024版 笔记 下载 安装 配置

前言 Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理&#xff08;Reverse Proxy&#xff09;服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。 反向代理方式是指以代理服务器来接受 internet 上的连接请求&#xff0c;然后将请求转发给内部网络上的服…

【IO流】32.IO流

IO流 1. IO流1.1 概述1.2 作用1.3 分类1.4 注意事项 1. IO流 IO流&#xff1a;存储和读取数据的解决方案。 I&#xff1a;input O&#xff1a;output 流&#xff1a;像水流一样传输数据 1.1 概述 IO&#xff08;Input/Output&#xff09;流是计算机程序用于与外部设备进行数据…