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

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

本文以安能物流作为案例,探讨了在数字化转型中,企业如何利用 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.rhkb.cn/news/118875.html

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

相关文章

第 3 章 栈和队列(单链队列)

1. 背景说明 队列(queue)是一种先进先出(first in first out,缩为 FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。 2. 示例代码 1)status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H/* 函数结果…

Arcface部署应用实战

1、概述 人脸识别的一个比较常用的网络arcface,依赖于其特殊设计的loss函数,使得模型在训练的时候能够实现类间距离增大,类内的距离不断减小,最终使得所训练的backbone能够获取鉴别性很高的特征,便于人脸识别。 本文…

Win11搭建 Elasticsearch 7 集群(一)

一: ES与JDK版本匹配一览表 elasticsearch从7.0开始默认安装了java运行环境,以便在没有安装java运行环境的机器上运行。如果配置了环境变量JAVA_HOME,则elasticsearh启动时会使用JAVA_HOME作为java路径,否则使用elasticsearch根目…

设计模式—简单工厂

目录 一、前言 二、简单工厂模式 1、计算器例子 2、优化后版本 3、结合面向对象进行优化(封装) 3.1、Operation运算类 3.2、客户端 4、利用面向对象三大特性(继承和多态) 4.1、Operation类 4.2、加法类 4.3、减法类 4…

【Unity】URP屏幕后处理UI模糊效果实现

这里Canvas(1)设置为Overlay能渲染出指定UI高清,其他UI模糊,然而这做法非常不好,如果此时再打开UI 以及 关闭模糊效果 要将这些置顶UI 恢复到原本Canvas里,也就是要管理2套Canvas using System; using System.Collections; using…

统一使用某一个包管理工具,比如yarn pnpm

原因:前端每个人的习性不一样,有人用npm 有人用yarn等包管理工具,混合下载插件容易出bug,就用个小工具锁住就行了,只能使用yarn或者pnpm反向下载依赖和下载插件。不然就报错 1.在项目主目录下创建preinstall.js // 如…

分类预测 | MATLAB实现GRNN广义回归神经网络多特征分类预测

分类预测 | MATLAB实现GRNN广义回归神经网络多特征分类预测 目录 分类预测 | MATLAB实现GRNN广义回归神经网络多特征分类预测分类效果基本介绍模型描述预测过程程序设计参考资料分类效果 基本介绍 MATLAB实现GRNN广义回归神经网络多特

Mybatis学习|多对一、一对多

有多个学生,没个学生都对应(关联)了一个老师,这叫(多对一) 对于每个老师而言,每个老师都有N个学生(学生集合),这叫(一对多) 测试环境…

【小沐学Unity3d】3ds Max 骨骼动画制作(Physique 修改器)

文章目录 1、简介2、Physique 工作流程3、Physique 对象类型4、Physique 增加骨骼5、Physique 应用和初始化6、Physique 顶点子对象7、Physique 封套子对象8、设置关键点和自动关键点模式的区别8.1 自动关键点8.2 设置关键点 结语 1、简介 官方网址: https://help.…

Python Opencv实践 - 轮廓检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/map.jpg") print(img.shape) plt.imshow(img[:,:,::-1])#Canny边缘检测 edges cv.Canny(img, 127, 255, 0) plt.imshow(edges, cmapplt.cm.gray)#查找轮廓 #c…

AI助乡行——点燃乡村振兴新引擎

随着数字化浪潮的袭来,乡村振兴战略的推进离不开数字化、智慧化等现代化治理能力和方式,人工智能等高新技术正不断与农村经济、社会、治理等加速融合。在智慧农业的背景下,我们可以解决一系列困扰农民的问题,包括如何增加经济作物…

【jvm】运行时数据区

目录 一、运行时数据区一、作用二、说明三、线程共用与私有区域 一、运行时数据区 一、作用 1.内存是非常重要的系统资源,是硬盘和CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策…

基于Gin框架的HTTP接口限速实践

在当今的微服务架构和RESTful API主导的时代,HTTP接口在各个业务模块之间扮演着重要的角色。随着业务规模的不断扩大,接口的访问频率和负载也随之增加。为了确保系统的稳定性和性能,接口限速成了一个重要的话题。 1 接口限速的使用场景 接口…

GA遗传算法

储备知识 GA算法主要解决数学模型中最优化的搜索算法,是进化算法中的一种,基因算法借鉴了自然界基因的遗传的主要现象,分别为遗传,变异,自然选择,杂交等。 GA算法参数 GA算法的参数如下所示。 种群规模…

通义千问部署搭建

文章目录 一、部署11.1 打开通义千问-7B-预训练-模型库-选择资源1.2 使用Netbook2.1 运行2.2 复制脚本2.2.1 问题1 :ImportError: This modeling file requires the following packages that were not found in your environment: transformers_stream_generator. R…

【请求报错:javax.net.ssl.SSLHandshakeException: No appropriate protocol】

1、问题描述 在请求服务时报错说SSL握手异常协议禁用啥的,而且我的连接数据库的url也加了useSSLfalse javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)2、解决方法 在网上查找了方法…

【C++笔记】C++内存管理

【C笔记】C内存管理 一、C中动态内存申请的方式二、new和delete的实现原理2.1、operator new和operator delete函数 一、C中动态内存申请的方式 在C语言中我们需要动态申请空间的时候我们通常都是用malloc函数,但是malloc函数对自定义类型是没什么问题的&#xff0…

Jenkins清理构建(自动)

需求背景实现方法 Dashboard-->Project-->配置-->General-->Discard old builds # 注意:自动清理构建历史将在下次构建时进行

【校招VIP】产品面试之职业规划

考点介绍: 对于刚入行的产品同学,由于行业知识和经验不足,只能执行上层的产品策略,但是与团队的沟通是非常重要的,产品经理就是沙丁鱼中的鲶鱼,必须要能够把控整个团队的开发节奏,知道如何最大化…

个微机器人开发接口

请求URL: http://域名地址/member/login域名地址开发者账号密码:后台系统自助开通 请求方式: POST 请求头Headers: Content-Type:application/json 参数: 参数名必选类型说明account是string开发者账号password…