TiDB x 安能物流丨打造一栈式物流数据平台

news2024/12/27 21:48:33

作者:李家林 安能物流数据库团队负责人

本文以安能物流作为案例,探讨了在数字化转型中,企业如何利用 TiDB 分布式数据库来应对复杂的业务需求和挑战。

安能物流作为中国领先的综合型物流集团,需要应对大规模的业务流程,面临着核心结算系统所带来的数据库挑战。安能将结算系统 all in TiDB,克服传统 MySQL 数据库所面临的瓶颈,实现平稳迁移和性能提升的同时,打造一栈式物流数据平台,加速数字化升级。

关于安能物流

安能物流(简称:安能)成立于 2010年,是中国领先的综合型物流集团,为企业组织及消费者提供安全、便捷、优质、高效的物流服务。截止到目前安能物流自有员工 20,000 多名,自建 136 个分拨转运中心,乡镇覆盖高达 98%以上,服务范围遍及全国。安能自 2010 年成立开始,前后经历了七轮国际顶级资本的融资,于 2021 年双 11 在港交所成功上市,成为“港股快运第一股”。在快运行业,安能拥有中国零担快运市场最大的加盟网络,全网有 30,000 多家末端加盟商网点,自营车头和车挂数量高达 9,000多台。在产品服务方面,安能提供多样化的产品和特色业务,以满足不同用户的需求 。


TiDB 在安能结算系统的应用

安能结算系统作为公司最核心的业务系统,承载了总部 与末端 加盟商网点所有费用结算业务,包括: 账户管理、充值、开票、交易、调账、对账、代收、代付、税差等全费用结算业务流程处理。 从系统的逻辑架构图来看,其功能及业务处理流程也是相对复杂的,目前该套系统承载业务量: 日均 450,000 票,出货量 48,000 吨,支持末端 36,000 家网点实时开单算费扣款和定时批处理调账,日均用户数 3,800,调用量 5,000 万以上。

安能在 2017 年对结算系统进行了重构,选择了当时较为通用主流的 MySQL+ 数据库代理中间件分库分表的数据库架构,截止到 2023 年切换到 TiDB 之前,这套 MySQL 伪分布式数据库集群已经运行了 6 年。在数据量方面:核心业务表 4 张,单表字段 360+,共分了 8 个库;单表数据 3 亿+,2TB 大小。系统并发情况:30,000 多家网点开单高峰期集中在 16:30 -19:30 三小时内完成,数据库 QPS 均值为每秒 20,000,系统平均响应时间在 80-100ms 内。

为了避免同一个网点查询或处理数据时出现跨库问题,采用以网点编码作为分库分表的路由规则。为了保证单库单表数据量的均衡,安能还将产粮区如华东、华南和非产粮区如东北、西北区域的网点进行相互组合后放在同一个库同一个表中。即便如此,由于业务的不断增长,地区产业布局的变化,网点货量的变化导致原结算系统 MySQL 数据库面临越来越大的挑战,主要表现在:基于网点编码的分库分表路由规则,导致单库单表数据分布不均,存在数据热点问题;基于网点编码的分库分表路由规则,当数据量不断增长,数据库主库节点扩展复杂度高;MySQL 5.7 不支持表结构在线变更,系统变更停机时间长,导致业务可用性降低;Mycat 不完全支持标准 SQL 语法,导致研发侧代码改动较大;数据同步到下游进行分析时需要解决多库多表数据合并问题。

基于以上面临的诸多挑战,安能在 2020 年开始考虑将现有的这套结算的 MySQL 伪分布式集群找一个真正的分布式数据库进行替换。除了要考虑到结算系统复杂的业务处理流程外,还要考虑数据的实时性、准确性、高可用等诸多要求,经过一系列考察评估,最终安能选择了 TiDB 作为替换结算 MySQL 的最佳产品。

为什么选择 TiDB?这和其他选择 TiDB 用户的关注点类似。首先,TiDB 支持一键水平扩容。第二,TiDB 提供金融级高可用。第三, 增加了在线数据的生命周期,同时保证系统响应时长。第四,TiDB 高度兼容 MySQL,原来的这套 MySQL 数据库在代码侧不做改动,可以做到平滑迁移。第五,TiDB 支持表结构的在线变更,减少了系统的停机时间,提高了业务可用性。TiDB 6.5 版本的 Online DDL 离业务的需求还有一定差距,安能也高兴地看到 TiDB 7.1 版本 Online DDL 的效率有了显著提升。此外,TiDB 内置了丰富的图形监控界面,提供了完整的闭环运维能力,包括故障分析等,降低了运维成本。

即便如此,TiDB 在安能从测试到切换上线还是经历了 3 年左右的时间,主要分为测试和数据校验两个阶段。在测试阶段,安能从 TiDB 3.0 版本开始测试,持续到 5.4 版本,在这个过程中充分测试了 TiDB 每一个重要版本的核心特性和重要功能,也测试了 TiDB 推出的诸多工具,见证了 TiDB 产品成长和打磨过程。

具体测试方法是将生产数据通过消息队列 1:1 引流到 TiDB 来模拟真实结算业务数据写入效率,同时针对不同业务场景及多业务场景组合下进行数据新增、删除、修改、查询功能及性能压测。在测试阶段,发现两个主要的问题:第一,在 TiDB 4.0 版本,数据量 800GB 时,同表使用分区表和普通表,分区表的性能比普通表大概降低了 20%-30%。第二,在某些业务场景下,例如 “查询时间范围内,扫描下一站为网点”对 TiDB 进行压测,发现较严重的数据热点问题,初期的 TPS 较低。后期,DBA 通过调整主键解决了一些数据热点,也通过调整集群的配置,TPS 均值达到了 10,000+。

在数据校验阶段使用 DM 将结算 MySQL 8 个库的数据实时同步到 TiDB 中,按照生产环境 1:1 搭建了一套完整的结算系统仿真环境,进行了为期将近一年的数据校验工作,最终于 2023 年春节,将原有运行六年的 MySQL 集群无缝平滑切换到 TiDB 上。虽然安能不是快递物流行业第一个使用 TiDB 的用户,但是所有结算业务 all in TiDB,在行业内安能是第一个。

TiDB 上线投产后,给安能带来的收益主要有几个方面:第一,结算系统应用代码几乎无改动,平滑迁移至 TiDB,只是做了数据源的替换。第二,解决了使用 MySQL 数据库时所面临的所有挑战。第三,原来 MySQL 环境下,在线数据只能保存 6-8 个月的时间,使用 TiDB 的结算系统在线数据的生命周期翻倍,可以保存 1 年 8 个月,当然两年也没有问题。现在,单表的数据量大概是 35 亿,5 TB 大小。TiDB 数据库平均响应时长比原来 MySQL 降低了一倍,这是在业务高峰的时候,正常情况下是 25 毫秒。QPS 从原来 20,000 提升到了 45,000。运维成本方面,综合来看整体大概降低 30% 左右。

同样,在切换到 TiDB 后,也不是没有任何问题。从业务场景角度,安能希望 TiDB 在后期的版本中解决以下几个问题:第一,在多表交易的时候,TiDB 的 SQL 优化器会出现执行计划稳定性的问题。第二,业务数据导出场景下,容易出现 OOM 的问题,这个问题在 7.1 版本有了解决方案,后续我们会进行深入的验证。第三,分区表性能与普通表存在 10% 性能差距。升级到 6.5 版本之后又进行了测试,结果还是有性能的差异。最后,TiDB 子查询的性能比 MySQL 要差一些。

安能在系统建设过程中,经历了从垂直大集中模式到拆分数据库,再到微服务架构下数据分布式集中存储这样一个过程。目前,安能正将业务全链路环节运营操作系统切换到 TiDB 上,从而降低系统数据交互的复杂度。未来计划将结算业务和运营操作合并到同一个 TiDB 集群,安能在上海有两个数据中心,双机房之间通过万兆专线网络直连,可实现双数据中心部署,实现业务流量双活。可能大家会问,如果把结算业务与核心运营操作业务都放到一个集群会不会有问题?答案是没有问题,为什么?第一,安能结算业务与核心运营操作业务的时间点是分开的。第二,安能对核心运营操作业务的底层数据模型经过了全面的设计,不会出现多表关联复杂 SQL 查询等,所以可以这样做。

一栈式物流数据平台成为数字化升级的突破点

最后谈谈 TiDB 是如何助力安能数字化升级的。下图是安能快运业务的全链路流程。相对于快递而言,快运业务的流程节点更多,业务逻辑更复杂。在每一个业务环节,不但会涉及到业务操作,还会涉及到一些管理的动作,因此每个业务节点都会产生大量数据,而这些数据又环环相扣,这对数据的实时性和准确性要求非常高。安能今天已经做到了全链路业务流程的数据可视化,但是随着公司管理赋能动作的前移和下沉,接下来安能计划使用算法模型在现有的数据上进行人、车、场、货的各种预测。

安能自 2017 年开始走数据运营路线,到目前为止,自主研发 52 套 IT 系统,开发了一系列部署于整个业务流程的专有数字化工具,通过全链路数字化运营和智能化决策来实现效率升级。也正是因为如此,在今天数字化升级的背景下面临非常大的挑战,主要表现在:第一,业务系统多,功能分散,导致数据分散。第二,多个业务系统的数据采集到下游去做统计分析的时候,因口径差异,不同系统、相同时点、"同一个数据"不一致。第三,原先在不同的业务场景下缺乏顶层的设计,导致在不同的业务场景使用了不同的技术栈,从而造成了复杂的系统架构。

除此以外,当业务增长后系统无法承载高峰期负载并发,如何解决?结构化及非结构化数据快速增长,数据查询和处理请求无法响应,又该怎么办?今天,在物流快递行业内,安能整个 IT 团队的人员是最少的,在降本增效的背景下,IT 团队如何高效支撑业务的发展?这些都是接下来需要面临的问题。

基于当前所面临的挑战,首先要解决的问题就是数据交互和统一的问题,因此构建新一代一栈式物流数据平台成为了安能数字化升级的突破点。如何使用最简单、最灵活、最高效的技术体系和最少的成本构建新一代数据平台,从而实现货物从下单到签收及结算的全闭环实时状态追踪。基于 TiDB 的应用实践,后续安能将借助 TiDB 分布式、高可用性、弹性伸缩、大规模数据处理和实时 HTAP 等能力来构建新一代一栈式物流数据平台,加速数字化升级。

具体的设想是使用 TiDB 作为一栈式物流数据平台的底座,把安能源端业务系统所采集的所有数据,按照业务主题和数据域统一进行存储,降低不同系统之间数据交互的复杂度,解决数据统一的问题。在一栈式物流数据平台的基础上,可以做相应的数据服务,统一对外提供数据服务平台和 API 接口,以及更高阶的数据应用产品。安能相信在 TiDB 的助力下,数字化升级将会更加便捷和高效。

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

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

相关文章

linux中dmesg命令用法

在Linux系统中,dmesg(diagnostic message)是一个非常有用的命令行工具,用于显示和控制内核环形缓冲区中的消息。这些消息通常包含系统启动时的内核生成的信息,例如硬件设备的状态,驱动程序的加载&#xff0…

【Python基础教程】快速找到多个字典中的公共键(key)的方法

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 方法一:for in循环 from random import randint, samplea1 {k: randint(1, 4) for k in abcdefg} a2 {k: randint(1, 4) for k in abc123456…

Qt应用开发(基础篇)——输入对话框 QInputDialog

一、前言 QInputDialog类继承于QDialog,是一个简单方便的对话框,用于从用户获取单个值。 对话框窗口 QDialog QInputDialog输入对话框带有一个文本标签、一个输入框和标准按钮。输入内容可以字符、数字和选项,文本标签用来告诉用户应该要输入…

一文看遍半监督学习模型(Semi-Supervised Learning)

一、半监督学习的总体框架 二、一致性正则化模型 该算法旨在:一个模型对于同一个未标记图像,在图像添加额外噪声前后的预测值应该保持一致。 添加噪声的方法,如图像增强(空间维度增强、像素维度增强)。 同样&#x…

线性DP问题

目录 数字三角形DP 动态规划 [自上向下二维数组]DP 动态规划 [自上向下一维数组]DP 动态规划 [自下而上二维数组]DP 动态规划 [自下而上一维数组]记忆化搜索 DFS 最长上升子序列一维状态数组实现扩展:最长序列输出 最长上升子序列 II贪心二分优化算法思路代码实现扩…

2023蓝帽杯初赛

比赛总结就是首先审题要仔细,确定题目意思再去找才不会找错。 内存取证vol工具的使用不够熟练 然后容易走进死胡同,如果一个软件不能得到答案可以换一个看看,说不定就有答案了。 还有服务器取证很生疏,还是要多花时间做点题 取…

黑客之批处理编写

文章目录 一、批处理作用二、如何创建批处理三、批处理语法 一、批处理作用 自上而下成批的处理每一条命令,直到执行最后一条。这里的命令指的是DOS命令,在之前的【黑客常用DOS命令】博客中,我介绍了大量的常用DOS命令。不过我们之前输入命令…

Lesson3-5:OpenCV图像处理---模版匹配和霍夫变换

学习目标 掌握模板匹配的原理,能完成模板匹配的应用理解霍夫线变换的原理,了解霍夫圆检测知道使用OpenCV如何进行线和圆的检测 1 模板匹配 1.1 原理 所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括…

C++之map,set,multimap,multiset的使用

map,set,multimap,multiset的使用 关联式容器键值对树形结构的关联式容器setset介绍set的使用set定义方式set各种操作函数 multiset mapmap的介绍map的使用insert函数find函数erase函数[ ]运算符重载map的迭代器遍历 multimap 关联式容器 在…

ARM编程模型-状态模式

ARM的两种工作状态 大部分的ARM处理器都实现了两种指令集,32位ARM指令集和16位Thumb指令集,看生成的机器码是32位的还是16位的 ARM v6引入了新的指令集Thumb-2,能够提供32位和16位的混合指令,在增强了灵活性的同时保持了代码的高密度。 ARM的…

Linux基础学习2

Linux基础学习2 popen函数 popen函数 https://blog.csdn.net/yzy1103203312/article/details/78483566 https://blog.csdn.net/xy1413_/article/details/127135608 典型用法: FILE * fp popen("ifconfig eth0", "r"); if (!fp) { fprintf…

再谈IOS开发环境配置(2023-09-01 新)

关于IOS的开发,需要配置证书、密钥、管理标识符、功能配置等等,很是繁杂,以前也配置过,这次因为重新购买了新的M1笔记本,准备重新配置下,顺便记录,以便查询。 如果要开发IOS,首先需要…

2023高教社杯数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模…

JVM学习(一)--程序计数器

作用:记住下一个jvm指令的执行地址 每一行java源代码,会被编译为多行jvm指令,上文所说的执行地址就是这里的0,3,4等 ,由于执行访问特别频繁,程序计数器的底层是有寄存器来实现的 特点: 线程私有&#xff…

爬虫进阶-反爬破解5(selenium的优势和点击操作+chrome的远程调试能力+通过Chrome隔离实现一台电脑登陆多个账号)

目录 一、selenium的优势和点击操作 二、chrome的远程调试能力 三、通过Chrome隔离实现一台电脑登陆多个账号 一、selenium的优势和点击操作 1.环境搭建 工具:Chrome浏览器chromedriverselenium win用户:chromedriver.exe放在python.exe旁边 MacO…

这段代码这么写有什么问题

这段代码这么写有什么问题? List<String> baseRelList1 new ArrayList<>();epmPersonList.forEach(Obj ->{interviewBacklogMessageList.forEach(t ->{if (!Obj.equals(t.getPsnNum())){baseRelList1.add(Obj);}});});这段代码存在一个问题&#xff0c;即…

transformer源码

1.传统RNN网络 每一层都需要上一层执行完才能执行 1.1 自注意力 在一句话中找到it_指代的是什么&#xff0c;它的上下文语境是什么&#xff1f; self-attetion计算 1.2 multi-header机制 1.3 堆叠多层self-attention&#xff0c;相当于再一次卷积 1.4 位置信息编码 1.5 残…

unity 场景烘焙问题之模型UV有重叠

问题现象&#xff1a;模型烘焙出来后&#xff0c;呈现黑色或布满脏斑&#xff0c;有可能是没有展UV&#xff0c;也有可能是UV重叠了 并且也会出现警告提示&#xff0c;如下图&#xff1a; 如果我们勾选了如下图,还在提示我们勾选&#xff0c;那可能就是 UV重叠了 解决方案 UV…

C++:输出系统时间(及报错处理)

#include <iostream> #include <ctime>using namespace std;int main() {// 基于当前系统的当前日期/时间time_t now time(0);cout << "1970 到目前经过秒数:" << now << endl;tm* ltm localtime(&now);// 输出 tm 结构的各个组…

【微服务】一张图搞懂微服务架构设计

一张图搞懂微服务架构设计 1.前言2.流量入口 Nginx3.网关4.业务组件5.服务注册中心6.缓存和分布式锁7.数据持久层8.结构型数据存储9.消息中间件10.日志收集11.任务调度中心12.分布式对象存储 1.前言 当前&#xff0c;微服务架构在很多公司都已经落地实施了&#xff0c;下面用一…