首页 > 数据库 >从 MySQL 到 Oracle 再到全面 TiDB ,云盛海宏的数据库架构实践

从 MySQL 到 Oracle 再到全面 TiDB ,云盛海宏的数据库架构实践

时间:2023-07-28 22:08:15浏览次数:41  
标签:架构 云盛海宏 数据库 MySQL TiDB Oracle

作者: TiDB社区小助手

导读

云盛海宏的零售系统是支持全渠道、全品类运动鞋服的零售服务平台,为全球 8000+ 多家线下门店提供零售服务支持。发展至今,云海零售系统的数据库经历了从 MySQL 到 Oracle 再到全面 TiDB 的架构演进。

本文由 InfoQ 主编赵钰莹撰写,与云盛海宏首席架构师洪亮共同探讨了云海零售系统整体架构从 MySQL 到原生分布式变迁的思路和收获,以及数据库设计在零售业业务发展中的重要性。

目前,国内某知名运动品牌在全球经营着 12 家鞋服运动品牌,在全国有近万家线下门店,耐克、阿迪达斯、彪马、匡威等品牌门店绝大部分都是其代理经营,注册会员达 6000 多万,这些业务由旗下科技公司云盛海宏全面支撑。过去十年间,云海零售系统是支撑全渠道、全品类运动鞋服的零售服务平台,支撑了 8000+ 线下门店的零售。

这样一家零售领域的老牌企业是如何一步步从 MySQL 转向原生分布式数据库的?整体的架构变迁思路是怎样的?实践过后又是如何从成本视角评价 Oracle 和国产分布式数据库的......近期,InfoQ 有幸采访到了云盛海宏首席架构师洪亮,就上述问题逐一进行了探讨。



1 | 背景介绍

在介绍云盛海宏的数据库架构设计之前,我们先了解下其整体的业务背景。云盛海宏的核心业务是零售系统,包括库存、终端零售以及用于集团内部的财务辅助系统三大模块。

自 2013 年起,云盛海宏就开始搭建整个数据库架构,中间因为业务的不断发展经历了多轮迭代。2016 年之前,云盛海宏基本还处于传统零售时代,内部各大区自建设信息化系统,维护自己的数据库架构,每天向总部上传业务数据,数据库采用集中式单库,这种方式的优点是架构简单,缺点则随着业务发展越来越明显,比如没有办法及时查看地区汇总数据,也无法跨大区查看全国的实时库存等。

为了解决这些问题,云盛海宏在 2016 年上线了全新的架构——云海零售系统,开启了数字化零售时代的架构演进之路。



2 | 从 MySQL 到 Oracle 再到全面 TiDB 的架构演进

发展至今,云海零售系统主要经历了三个阶段的演进。

阶段一:应用微服务化,实现数据共享,初步精细化运营,支撑数字化业务发展

在这一阶段,云盛海宏使用的是微服务+ MySQL 分库分表的方式。立项之初,团队调研时考虑到数据垂直切分的模式短时间内较稳定,MySQL 集群的开发难易程度对团队来说又比较好掌握,所以选定了 MySQL 。

随着业务的飞速发展,很多问题超出了团队的原始预期,MySQL 集群对于复杂报表分析支持不足,团队尝试引入 Oracle 分担这部分需求,再通过 Otter 进行数据的实时同步,保障两边的数据完整。对于 TOB 业务来说,内部报表非常关键,且对数据精度要求极高,冷热数据变化频繁,Oracle 的引入很好解决了实时报表方面的问题。

此后,云海零售系统支撑了业务高速发展的五年,实现了很多小目标,比如实现了全国各地区、各大区的海量数据的存储,实现了数据实时共享,也达到了业务可视化的目标。但是随着业务的扩展和需求难度的增加,慢慢地出现了一些新的挑战。首先,整个架构基于 MyCAT 做分库分表,在日常维护中,如果有新的业务,比如要增加表或者调整表,维护层面会增加人力成本,需要人工调整配置,然后再调用配置,需要花费很多精力。

其次,当时的 Otter 同步渠道已经有 110 +,使用起来也没有那么理想。比如源端加表,目标端没有加表,或者是仅仅是字段的调整也可能导致一些同步的中断,这需要大量人力维护。最主要的是 Oracle 也遇到了一些瓶颈,例如海量数据无法扩展、聚合库分析时效差等问题。

阶段二:解决数据爆发式增长导致聚合库分析时效性差

2020 年之前,Oracle 的单点性能已经无法横向扩展,团队开始积极寻求替代方案。此时,团队开始接触到 TiDB ,并于当时 InfoQ 举办的 ArchSummit 大会上听到了时任 PingCAP 联合创始人兼 CTO 黄东旭的详细讲解,后又经过详细的对比测试,主要集中在大数据量的查询以及复杂 SQL 的查询性能两方面,发现 TiDB 可以解决 Oracle 存在的问题并且非常便捷。在内部小规模试用取得显著效果之后,云盛海宏最终决定快速推进 TiDB 集群的部署工作。

从 MySQL 到 Oracle 再到全面 TiDB ,云盛海宏的数据库架构实践_MySQL

决定将 TiDB 部署到生产时的压测方案

                                                    (利用了 Percona 公司的开源工具 Percona-playback 实施的压测)

“2020 年,疫情爆发,这对我们的业务带来了很大冲击,我们开始发力做线上业务,技术侧最直接的压力来自于库存管理模块的变化。原本,从接到需要对接淘宝、京东、唯品会、抖音等平台的需求到最终落地需要三个月甚至半年的时间,但因为我们前期已经切换到了 TiDB ,技术栈层面做好了充足的准备,最终只用了两周时间就完成了单平台库存管理模块的调整”,洪亮如是说道。

从 MySQL 到 Oracle 再到全面 TiDB ,云盛海宏的数据库架构实践_运维_02

2020 年引入 TiDB 之后的架构图

就内部工程师而言,TiDB 的部署推进得也非常顺利。首先,云盛海宏的主要业务都是在 MySQL 的基础上构建的,TiDB 完全兼容 MySQL 协议,从 MySQL 迁移到 TiDB 是比较顺利的。其次,TiDB 的日常运维、扩容、缩容非常方便,原来 DBA 按月或者季度为周期需要在凌晨一次性完成十几个实例的数据迁移,维护工作量巨大,而且数据迁移风险极高,一旦出现问题后果非常严重,引入 TiDB 之后基本不需要做迁移动作,更别提 MySQL 日常巡检、归档和备份这些动作耗费的时间。最后,MySQL 分库分表带来的局限性无法让团队快速应对变化,公司组织架构的每一次调整都会对业务带来一定冲击,团队需要快速消化这种冲击,TiDB 的引入让整个技术栈更具弹性。

阶段三:向全面部署分布式数据库迈进,初步探索架构云化

目前,云盛海宏内部已经完成了 MySQL 到 TiDB 的迁移,从最初的 4.0 版本到目前线上的 5.4.2 版本,每一次升级 TiDB 都会带来比较实用的特性和功能。接下来,云盛海宏会尝试从 Oracle 到 TiDB 的迁移,逐渐收拢数据库集群,更进一步降低运维负担。在云盛海宏内部,Oracle 不会承担太多核心业务和写操作,迁移基本面向 AP 类的数据和业务,所以这部分相对来说比较容易,团队重心会放在前端数据迁移,包括数据准确性校验。

采访中,洪亮表示目前内部的 TiDB 集群的机器规模已经达到 100 台,已经部署了两个 TiDB 集群,分别承担前端和后台的业务负载,计划在 2024 年前完成第三个 TiDB 集群的部署,承担前文所述的 AP 类业务,也就是目前 Oracle 承担的财务报表分析负载。届时,云盛海宏的所有业务将全部运行至 TiDB 集群,Oracle 集群将逐渐停用。

除此之外,整体架构将会逐渐云化。当前,云盛海宏部分应用做了私有云化,未来会尝试将一些环境公有云化,比如开发、测试、培训、生产等。



3 | 数据库设计核心问题探讨

在零售行业,云盛海宏算得上是对技术投入较大的公司之一,而且结合其业务范围和体量,技术架构的搭建是存在一定难度的,数据库选型和架构演进需要考虑因素很多。在这个过程中,团队也摸索出了一些经验。

零售业有没有可能完全舍弃 Oracle ?

在零售领域,有一定历史的企业内部早期肯定部署着 Oracle 数据库,尤其是对精度要求极高的财务数据,那时可替代的国产数据库并不多。如今,国产数据库越来越成熟,可供选择的空间也越来越大,很多企业都开始尝试迁移至其他数据库。

从云盛海宏的经验来看,零售领域未来完全有机会舍弃 Oracle ,即便是要求极高的财务报表数据的处理也可以由国产数据库来负责。

选型上,企业需要提前根据业务特点做好压测,迁移之前也需要做好相关预案,云盛海宏从 MySQL 到 TiDB ,从 Oracle 到 TiDB 都做好了充分的备案。

从成本视角来看,分布式数据库值吗?

现在谈到成本,基本涵盖软件授权费用、软件服务费用、硬件采购费用以及日常维护费用等众多维度,企业内部情况不同也存在差异。

从云盛海宏的经验来看,TiDB 相比 Oracle 在软件授权费用上肯定是具备明显优势的;在软件服务费用方面,TiDB 本身的生态和社区建设(包括文档)相对比较完善,但不排除一些国产数据库因为成熟度不足而尚无法投入人力建设成熟的服务生态,这一点需要根据选型情况具体判断;在硬件采购费用方面,云盛海宏使用前后差异不大;在日常维护方面,TiDB 的门槛低、易维护节约了大量人力成本。

如果与管理 MySQL 集群相比,数据备份、硬件故障处理、主从节点管理等相对都比较麻烦,但 TiDB 基本可以做到轻量级维护,后期云化之后可能会更进一步降低运维成本。

要不要全面云化?

如前文言,云盛海宏其实未来会逐步云化,其团队内部对此也有很多考虑。

采访中,洪亮表示从整个集群而不是单个数据库的角度出发,云化在机房管理、网络安全、高可用、容灾等层面会比本地部署更有优势。如今,TiDB 和阿里云也有合作,云化是比较容易进行的,尤其是针对原有技术栈基于 MySQL 的企业。

智能化运维值不值得初期就考虑?

最近两年,很多数据库都在积极整合 AI 能力,以期让部署、运行、运维等全过程更具智能化。对云盛海宏而言,企业内部对落地 AI 的诉求相对而言没那么迫切。

“智能化运维或者说引入 AI 能力取决于底层的基础建设是否到位,如果存算分离或者是运维能力没有提升,AI 就像是空中楼阁。只有底层基础打好了,智能化运维才能发挥出更大作用。比如,MySQL 的一些指标监控肯定没有 TiDB 完善,没有这些指标,AI 监控就无从谈起了。”

标签:架构,云盛海宏,数据库,MySQL,TiDB,Oracle
From: https://blog.51cto.com/u_15550868/6887251

相关文章

  • 【TiDB v7.1.0 荣誉体验官招募】索尼 PS5 、索尼无线降噪耳机、倍轻松颈部按摩器等你
    TiDBv7.1是2023年度发布的首个LTS(LongTermSupport)版本,汇集了来自20+个真实场景带来的功能增强,累计优化和修复140+功能,旨在提升关键业务的稳定性和性能,帮助开发人员和数据库管理员提高生产力并进一步降低总体拥有成本(TCO)。大家可在生产环境中放心地使用TiDBv7.1.0。......
  • TiDB v7.1.0版本 相关(部署、在线扩容、数据迁移)测试
    作者:tomxuTiDBv7.1.0版本相关(部署、在线扩容、数据迁移)测试一、服务器信息参数|序号|服务器型号|主机名|配置||IP地址|用户名|密码||--|---------|---------------------------|--------------------------------------------------------------|-|......
  • 彻底搞定MySQL索引(从底层到应用)
    读者忠告由于本文内容篇幅较长,涵盖了大家学习上、工作上的绝大多数索引,建议大家每一小节都认真阅读并理解透彻,如有疑问可在评论区留言探讨;二、索引2.1索引概述索引是帮助数据库快速查询数据的一种数据结构,在数据库中,数据库系统除了存储数据之外还维护着一种特殊的数据结构,这种数据......
  • Linux源码安装mysql 5.5.x (cmake编译)
    以下五个软件包是在安装mysql5.5.x之前必须安装的,不然在进行cmake时会报错。这些软件可以通过下面的链接进行源码安装,也可以通过yum安装1.安装make编译器 下载地址: http://www.gnu.org/software/make/ tarzxvfmake-3.82.tar.gzcdmake-3.82./configuremakemakeinstall2.安装b......
  • 【Mysql】处理Json
    Mysql中处理JsonJSON_EXTRACTselectjson_extract('{"name":"Zhaim","tel":"13240133388"}',"$.tel");返回结果"13240133388"selectjson_extract('{"name":"Zhaim",......
  • MySQL-PHP语法
    MySQL可以很好地结合各种编程语言,如PERL、C、C++、JAVA和PHP。在这些语言中,PHP是最受欢迎的一种,因为它具有web应用程序开发功能。本教程主要关注在PHP环境中使用MySQL。如果对使用PERL的MySQL感兴趣,那么可以考虑阅读PERL教程。PHP提供了访问MySQL数据库和操作MySQL数据库中的数据记......
  • mysql基础架构
    基础架构Mysql基础架构图[1]mysql主要分为Service层和存储引擎一.Service层包含MySQL的大部分功能;请求进入后,到数据提取前的所有操作;包含连接器,查询缓存,分析器,优化器,执行器,还有所有的内置函数(日期,时间,数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程......
  • 基于 Kubernetes 部署 MySQL 数据库
    本文将介绍如何基于Kubernetes部署MySQL数据库。创建服务Service创建一个Service为即将部署的MySQL数据库固定连接的IP,同时提供负载均衡,下面是mysql-service.yaml文件的内容: yaml复制代码apiVersion:v1kind:Servicemetadata:name:mysqlspec:s......
  • mysql 中的 having 与 order by 的区别与联系举例说明
    HAVING和ORDERBY都是在查询语句中用于对结果进行排序的子句,但它们的使用场景和作用略有不同。区别:HAVING子句用于在GROUPBY子句后对分组结果进行筛选,只返回满足条件的分组。它通常与聚合函数一起使用,用于筛选分组后的结果集。HAVING子句是在分组后进行筛选,可以使用聚合函数和......
  • mysql 的左连结 右边结 内连结 外连结和全连结的区别及使用场景举例
    在MySQL中,左连接(LEFTJOIN)、右连接(RIGHTJOIN)、内连接(INNERJOIN)、外连接(OUTERJOIN)和全连接(FULLJOIN)是常用的连接操作,用于联接多个表。这些连接操作的区别如下:左连接(LEFTJOIN):返回左表中的所有记录,以及与右表中匹配的记录。如果右表没有匹配的记录,则返回NULL值。左连接使用L......