“双十一、二” 业务高峰如何扛住?韵达快递选择 TDengine

小 T 导读:

为了有效处理每日亿级的数据量,早在 2021 年,韵达就选择用 TDengine 替代了 MySQL,并在三台服务器上成功部署和上线了 TDengine 2.0 集群。如今,随着 TDengine 3.0 版本的逐渐成熟,韵达决定将现有的 2.0 版本升级到 3.0 版本,并基于本文为大家分享其在升级过程中所进行的优化措施以及升级后的性能表现。

作为一家头部物流公司,韵达每日的订单扫描量破亿级别,该类数据为典型的时序数据,这也是我们公司数据量最大的一块业务。系统需要汇总统计全国网点的扫描数据(韵达的所有订单数据),并实时反馈给用户。此外,这些数据也会给到网点、分拨中心的内部员工使用,用于个人工作量、站点扫描量等统计工作。在“双十一、二”期间,面对快递业务量的暴涨,TDengine 帮助我们很好地完成了既定规划,保障了“双十一、二”任务的顺利完成。

本文用于分享我司在 TDengine 上使用的历程和心得。

从 2.0 到 3.0

在早些年业务尚未扩张时,我们采用的是 MySQL 分区+索引方式进行扫描枪数据的处理,但随着企业的发展、业务量的增加,面对每日亿级的数据量,MySQL 显然已经无法满足当下的数据处理需求。

在这种背景下,我们决定进行时序数据库(Time Series Database)选型。经过严格的选项测试,我们最终选择了 TDengine 作为核心数据库处理该部分数据。在 2021 年,我们在三台 16C 64G 的服务器上部署上线了 TDengine 2.0 版本集群。(“一个扫描枪一张表”,韵达选择 TDengine 应对每日亿级数据量 - TDengine | 涛思数据)

该集群每天要承载日常 6 亿行数据的写入和一定量的查询,“双十一、二”等特殊业务期间,写入/查询量还要上涨 50% 左右,数据需要保留 2 个月。

我们的架构是 Spring Boot + MyBatis + MySQL + TDengine,TDengine 负责处理时序数据,MySQL 则负责非时序数据的存储及应用,如下:

“双十一、双十二” 业务高峰如何扛住?韵达选择 TDengine - TDengine Database 时序数据库

使用 2.0 的这两年数据库是很稳定的,但考虑到后期业务需求会用到 3.0 的新特性,所以我们自打 TDengine 3.0 发布之后,就一直在着手准备数据库的迁移工作。

数据迁移经验分享

数据库迁移是一项很重大的工作,在此期间,我们仔细梳理了 2.0 版本使用期间的一些使用情况,尝试做出针对性的优化。

在 2.0 时期,我们是根据“一个扫描枪一张表”的模型建表,把设备的地点和站点类型设置为标签。来到 3.0 时期后,我们和官方团队反复调试,选择了“一个站点一张表”的建模方式。这样一来,表数量从百万级直接缩减到了万级。

做这个改动的核心原因有两个:

  1. 我们有很多临时的虚拟扫描枪,由于只是临时使用,所以没有几条数据,但却单独占据了一个表。
  2. 虽然扫描枪写入频率较低,但是整个站点有很多扫描枪,这样的建模方式使得低频写入转化为了高频写入,降低了存储中碎片数据的比例。

2.x 超级表结构:

“双十一、双十二” 业务高峰如何扛住?韵达选择 TDengine - TDengine Database 时序数据库

优化过后,3.x 超级表的结构:

“双十一、双十二” 业务高峰如何扛住?韵达选择 TDengine - TDengine Database 时序数据库

除此之外,3.0 由于底层有很多的重构,因此和 2.0 相比出现了很多的参数改动,可以参考:配置参数 | TDengine 文档 | 涛思数据,数据库 | TDengine 文档 | 涛思数据。优化思路可以参考这篇文章中的内容:万字解读|怎样激活 TDengine 最高性价比? - TDengine | 涛思数据。

尤其是 3.0 关于数据入库频率、数据乱序、更新、建表等处理逻辑的变化,均需要投入一定量的学习测试时间。尤其是在数据量极大的情况下,每一次测试环境的搭建都需要较大的时间人力成本。我们在 TDengine 官方团队的协助下,断断续续大概用了 2 个月的时间才完成这个阶段。

优化效果显著

最终优化过后,我们的查询速度得到了进一步提升。尤其是下面这类查询优化效果十分明显,该查询的逻辑是:从 6 亿行的当天数据中,通过标签、普通列做出多次筛选,最终返回分页后的十条结果。其中,最为耗时的便是从标签过滤之后的 1.5 亿条数据的普通列筛选。

在 2.6 版本中,这个过程需要大约 10 秒的时间,升级到 3.x 之后,只需要 2-3 秒左右便会返回结果:

select waybill_barcode,location,scanning_person,equipment_code,scan_category,remark,weight_info weight,scan_time,volume,lower_location,lrfs from base.scan_data WHERE ts >= #{beginTime} and ts <= #{endTime} and site_type=#{siteType} and equipment_code = #{equipmentCode} limit 0,10;

“双十一、双十二” 业务高峰如何扛住?韵达选择 TDengine - TDengine Database 时序数据库

至此,我们从 TDengine 2.0 迁移到 3.0 版本的工作就圆满完成了。

写在最后

对于我们这种集快递、物流、电子商务配送和仓储服务为一体的快递企业,扫描枪设备产生的数据是相当庞大的,而 TDengine 可以轻松高效地处理和存储这些时序数据,它所具备的快速写入和查询的能力,使得我们的系统可以轻松应对高负载和大规模数据的需求。

落实到业务使用方面,通过实时了解包裹状态、配送进度等信息,我们能够更加方便地做出实时决策,物流运营的效率和效果也获得了大幅提高。

文章最后,祝 TDengine 越来越好,早日成为时序数据库领域的 NO.1。


了解更多 TDengine Database的具体细节,可在GitHub上查看相关源代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android实战之添加图标到项目中

引言 阿里云矢量库有很多图标&#xff0c;注册账号&#xff0c;下载下载选择的图标&#xff0c;下载时选择svg格式。 实现 1. androidstudio &#xff0c;drawable右键---new ----->vector asset&#xff0c;选择本地下载的资源。 点击next。完成

devops使用

官方文档 使用 Git 进行代码 - Azure DevOps | Microsoft Learn

libssh 服务端权限认证绕过(CVE-2018-10933)

漏洞描述&#xff1a; libssh 是一个提供 SSH 相关接口的开源库&#xff0c;包含服务端、客户端等。其服务端代码中存在一处逻辑错误&#xff0c;攻击者可以在认证成功前发送MSG_USERAUTH_SUCCESS消息&#xff0c;绕过认证过程&#xff0c;未授权访问目标 SSH 服务器。 复现过…

LeetCode——动态规划

动态规划 一、一维数组&#xff1a;斐波那契数列 爬楼梯70简单 dp定义&#xff1a; dp[i]表示爬到第i阶有多少种不同的方式 状态转移方程&#xff1a; dp[i] dp[i-1] dp[i-1] &#xff08;每次可以爬1或2个台阶&#xff09; 边界条件&#xff1a; dp[0] 1; dp[1] 1;&#…

易混淆的公式

a x − 1 ∼ x ln ⁡ a a^x-1\sim x\ln a ax−1∼xlna log ⁡ a ( 1 x ) ∼ x 1 ln ⁡ a \log _a(1x)\sim x\frac{1}{\ln a} loga​(1x)∼xlna1​ ( log ⁡ a x ) ′ 1 x ln ⁡ a (\log _ax) \frac{1}{x\ln a} (loga​x)′xlna1​

传统船检已经过时?AR智慧船检来助力!!

想象一下&#xff0c;在茫茫大海中&#xff0c;一艘巨型货轮正缓缓驶过。船上的工程师戴着一副先进的AR眼镜&#xff0c;他们不再需要反复翻阅厚重的手册&#xff0c;一切所需信息都实时显示在眼前。这不是科幻电影的场景&#xff0c;而是智慧船检技术带来的现实变革。那么问题…

[Linux]Ubuntu noVNC使用

又到了逛大型程序员交友 网站的时间了&#xff0c;今天你准备好了吗。 今天要推荐的一个有趣的项目是noVNC setup好以后是这个样子的&#xff0c;可以在浏览器登陆vnc&#xff0c;不需要再安装一个vnc client. setup的过程比较简单&#xff0c;分为以下几步&#xff1a; 1. v…

Linux操作系统——进程(六) 进程地址空间

进程地址空间 C/C程序员一般将我们所写的程序看成如下这种结构&#xff1a; 我们所写的程序通过编译编译之后就可以以这样的方式进行分布. 我们先通过编写一段C语言代码来进行验证&#xff1a; 运行结果&#xff1a; 我们可以看出来上述地址遵循的就是我们上面画的一种结构。…

059:vue中使用 AJAX来读取来自XML文件的信息

第059个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Java系列-HTTP和HTTPS 的实现原理

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是用于在网络上传输数据的两种协议&#xff0c;它们在实现原理和安全性上有一些关键的区别。 HTTP 的实现原理&#xff1a; 1. 无连接性&#xf…

【maven】setting.xml文件详解

Maven 的主要作用 我们使用 Maven 最主要的就是使用它的依赖管理功能。当 A jar 包用到了 B jar 包中的某些类时&#xff0c;A 就对 B 产生了依赖&#xff0c;那么我们就可以说 A 依赖 B。 依赖管理中要解决的具体问题&#xff1a; jar 包的下载&#xff1a;使用 Maven 之后…

mac 生成 本地.ssh

输入下面命令行 ssh-keygen 默认回车得到下面的 Generating public/private rsa key pair. Enter file in which to save the key (/Users/{用户名}/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has be…

Azure 学习总结

文章目录 1. Azure Function1.1 Azure Function 概念1.2 Azure Function 实现原理1.3 Azure Function 本地调试1.4 Azure Function 云部署 2. Azure API Managment 概念 以及使用2.1 Azure API 概念2.2 Azure API 基本使用 3. Service Bus 应用场景及相关特性3.1 Service Bus 基…

京东商家数据工具讲解(一):竞品数据如何监控与分析

京东平台的店铺众多&#xff0c;同行数不胜数。作为商家&#xff0c;如果连自己竞争对手的情况都不知道的话&#xff0c;很难在这个平台存活下去。那么&#xff0c;这次鲸参谋就来重点说一下“竞品分析”。 竞品分析&#xff0c;主要是对京东店铺运营期间竞争对手的市场经营状…

使用Vite创建React + TypeScript(pro和mobile,含完整的空项目结构资源可供下载)

PC端 安装指令&#xff1a; npm create vitelatest react-ts-pro -- --template react-tsVite是一个框架无关的前端工具链&#xff0c;可以快速的生成一个React TS的开发环境&#xff0c;并且可以提供快速的开发体验说明&#xff1a; 1. npm create vitelatest固定写法&#…

【docker实战】02 用docker安装mysql

本示例采用bitnami的镜像进行安装MySQL 一、镜像搜索 先搜索一下mysql有哪些镜像 [rootlocalhost ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql …

爬虫工作量由小到大的思维转变---<第二十九章 Scrapy的重试机制(避混淆)>

前言: 单纯讲重试的问题---因为今天有人私了我 他的代码,我忽然觉得这里有一个误区;顺便给哥们你混淆的理论里,再搅和搅和....哈哈哈 正文: 拨乱反正: 在Scrapy中&#xff0c;默认情况下&#xff0c;当一个请求失败时&#xff0c;会进行自动重试。重试次数的计算是基于原始请…

Android : 画布的使用 简单应用

示例图&#xff1a; MyView.java&#xff1a; package com.example.demo;import android.content.Context; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.Vi…

C++ 之LeetCode刷题记录(四)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅&#xff0c;多学多练&#xff0c;尽力而为。 先易后难&#xff0c;先刷简单的。 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共…

建筑覆膜板和传统木板有什么不同?

在建筑领域&#xff0c;选择合适的模板材料对于确保施工质量和效率至关重要。近年来&#xff0c;建筑覆膜板因其独特的优势越来越受到青睐&#xff0c;与传统木板相比&#xff0c;它们在多个方面展现出显著的差异。 材料和制作工艺 建筑覆膜板&#xff1a;这种板材是由木材切片…