存储空间压缩6倍 ,多点DMALL零售SaaS场景降本实践

🧑‍💼 作者简介

冯光普:多点 DMALL 数据库团队负责人,负责数据库稳定性建设与 DB PaaS 平台建设,在多活数据库架构、数据同步方案等方面拥有丰富经验。

杨家鑫:多点高级 DBA,擅长故障分析与性能优化,喜欢探索新技术。

多点 DMALL 作为中国及亚洲最大的零售云解决方案数字零售服务商,是中国唯一的端到端全渠道零售云解决方案服务商,目前,其业务据点覆盖六个国家和地区,商业模式受到广泛验证,其发展历程可以说是中国乃至世界零售数字化进程的缩影。

但在业务高速增长、成果光鲜亮丽的背后,多点 DMALL 也面临着诸多来自零售 SaaS 场景和业务系统瓶颈的挑战,本文针对零售 SaaS 场景数据处理的痛点,从业务视角出发,讲述多点 DMALL 如何在做到保障业务数据库稳定可靠的同时,还能兼顾更高的读写性能与更低的存储成本。

图片

多点 DMALL 服务对象横跨国内、海外等众多零售商,在国内有物美、中百等大型商超,覆盖麦德龙、Seven Eleven 711 便利店等跨国零售商。同时,还为众多海内外品牌商提供服务,让品牌商、供应商、零售商能够链接起来,让数据和信息更好地流动,让服务对象能够更好地支撑服务 C 端用户。

从生产商、品牌商、供应商,再到各个商场门店的零售商,最后到消费者,不难想象,超长的服务链路会产生超级庞大的数据量,系统的复杂度也将随着数据量呈指数级增长。在此背景下,多点零售 SaaS 系统数据库面临三大难题:

第一,运维复杂度高。多点 DMALL 使用微服务架构,全流程业务环节多,系统应用规模大,对应数据库的数量超过了 500 个。且随着系统不断迭代,数据的规模还在持续增加,运维管理难度越来越大。

第二,业务增长快,水平扩展需求增多。随着业务的增长,我们制定了出海战略,需要在海外展开业务,基于地区数据安全法的要求,需要独立部署一整套全新的系统去承接海外业务流量。在初始的部署阶段,对后期业务规模及数据增长速度是难以准确预估的。因此,数据库资源在初始阶段的分配就变得十分困难。为了节约成本,常见的做法是给到较少的部署资源。但很快我们发现,业务的快速增长,数据的增长特别迅猛,带给我们的是如何快速扩容这一难题。

第三,需要在同一个集群中服务大量商家。便利店/连锁商超的 SKU(最小存货单位)规模,从几千到几万,我们很难做到给每个商家独立部署一套系统。因此,我们 SaaS 系统支持上百个中小商家客户,所有商家产生的数据,在底层共享数据库资源。还有一个显著特点,在我们系统中存在非常大的单个租户,比如大型连锁商超,我们希望能让大型连锁商超所在的租户与其他租户有一定的资源隔离。

综上,我们希望数据库能够支撑庞大数据规模,还能应对数据快速增长。

图片

为了解决上述难题,我们开始了数据库选型。由于分布式数据库支持更大的容量规模,具备透明扩展的能力,提供金融级数据安全,并且可以提高开发效率以及降低运维成本,能够更好地支撑业务发展。因此,我们坚定地认为它是数据库未来的趋势,此次选型仅调研了分布式数据库产品。

(一)基于业务的选型考虑因素

首先,从扩展性考虑,我们有很多 MySQL 单库数据量超过了 4TB,并且还在快速增长。我们将最大 MySQL 切换到分布式数据库后,数据增长到了 29TB。对于数据快速增长及面临的 MySQL 容量瓶颈,DBA 非常担忧:

  • 要么我们不断推动研发清理数据,做数据归档,然而结果往往很被动,因为研发的重点工作是业务需求迭代;

  • 要么继续扩展磁盘,如果是在云上,扩展空间比较容易,云厂商提供的块存储单盘可以达到 32TB 甚至更大,但数据继续增长,仅仅是将风险延后, 治标不治本, 后续会更加被动。

当然,我们还可以选择分库分表的方案,但这是一件操作繁琐、风险很高的事情,且需要耗时数月,因为 SQL 能力有损,代码改造不可避免。

因此,我们希望利用分布式数据库透明可扩展的能力,平滑支撑业务快速增长。

首先,从运维成本考虑,在保证系统稳定性前提下,降低运维复杂度。假设 MySQL 中的一个 database 是一颗蛋,一个 MySQL 实例是一个篮子,那么部署 1000 个 database,应该放到多少 MySQL 实例中?把哪些库放在同一个实例中?如果把两个对资源要求都很高的重要库放在同一个实例中,就有可能会互相抢占资源。还有,例如支付类的数据量虽然不大,但对业务的要求很高,也不能和其他库放在同一个实例中。

因为业务不同,优先级不同,数据增长速度不同,QPS 要求不同,所以 DBA 常常需要 “挪蛋”。哪怕抛开资源成本不谈,本身的运维挑战就很大,我们希望分布式数据库可以解决这个问题,帮助 DBA 去自动 “挪蛋”。

图片

其次,从高可用考虑,期望保证集群高可用能力。运维 MySQL 集群,我们基本都是使用 MHA、Orchestrator 去实现高可用,但他们都是“外挂”形式的,本质上是解决不了网络分区导致的脑裂问题,因为数据库和 HA 组件之间,是两个独立的软件,不在同一个进程里,他们之间没有一致性协同控制。

对于 MySQL,Group Replication 这类高可用架构,其内置实现的高可用是可靠的,它与 OceanBase 或者 TiDB 等分布式数据库一样,是基于Paxos 或者 Raft 分布式一致性协议,可以实现 RPO=0,RTO<30s。

图片

(二)产品选型测试数据

基于上述选型因素,我们选择了原生分布式数据库 OceanBase,并进一步对比了 OceanBase 与MySQL 在表读写、表只读、表只写等方面 QPS 的表现,以及二者在存储成本方面的表现。下表为此次测试相关配置。

OceanBase

MySQL

社区版本

v4.1.0

v5.7.16

内存配置

租户memory_size 16G

innodb_buffer_pool_size 16G

单机器配置

32C RAID10 SSD

32C RAID10 SSD

刷盘配置

默认强制刷盘

sync_binlog=1

innodb_flush_log_at_trx_commit=2

并发数

5,10,20,30,60,120

5,10,20,30,60,120

测试模式

read_write,read_only,write_only

read_write,read_only,write_only

单次测试时间

300s,共18种测试(并发数x测试模式)

300s,共18种测试(并发数x测试模式)

每种测试方法

obd test sysbench(obd自带)

会先 prepare、再 run、再cleanup

sysbench prepare

sysbench run

sysbench cleanup

在 OceanBase 与 MySQL 配置相同的情况下,对比 10 张 3 千万 sysbench,我们发现当并发数小于 200 的时候,MySQL 的表现略好于 OceanBase。但无论是 QPS 还是延迟,随着并发数的上涨,OceanBase 的性能都会逐渐接近 MySQL。

(三)OceanBase 不同配置的对比

对于单机部署的模式,选择通过连接 OBProxy 访问 OBServer 还是直接 OBServer,也会影响其在 10 张 3 千万 Sysbench 表读写 QPS 的表现。

我们来看选择连接 OBProxy 和选择直连 OBServer 时的表现,可以看到直连 OBServer 性能比通过 OBProxy 连接的性能高 30-50%。

所以对于单机部署的模式来说,我们建议直接 OBServer,避免通过 OBProxy 访问 OBServer 多走一次网络带来的额外代价。

图片

在不同租户内存配置下,性能也会有所不同。可以看到 32GB 租户内存相比 16GB 租户内存,性能提升约 14%。

(四)OceanBase 与 MySQL 表空间对比

在生产环境监控快照场景,将 20 张表共 5 亿数据量从 MySQL 迁移 OceanBase,表空间占用降低 6 倍。 

图片

基于上述测试数据,我们最终决定上线 OceanBase,总的来说:

  • 生产环境监控快照场景 MySQL 存储(单副本)对比 OceanBase 存储(单副本),数据压缩率为 6:1,OceanBase 的数据压缩比优秀;

  • 单机部署并且连接 obproxy,在并发度较低时,OceanBase QPS 和平均延迟表现稍逊 MySQL(最低 QPS 也过万,租户内存越高 QPS 性能越好;最低平均延迟 3ms)。在并发度逐渐上升的过程中,OceanBase 各项性能的提升比例会高于 MySQL(当并发度超过 200 之后,OceanBase 各项性能会逼近甚至超过 MySQL);

  • MySQL 一层架构、OceanBase 二层架构(obproxy + observer,单机部署时直连 observer 比连 obproxy 性能会提升 30%~50%)。每多一层,网络层面的延迟消耗会增加。

图片

第一,OceanBase 是单机分布式一体化数据库。从两个方面来讲:单机是指性能可以像 MySQL 单机一样做到低延迟、高性能;分布式是指当我们需要去规模化扩容时可以轻松扩展。那这两个特性可以帮我们解决什么问题呢?

从业务发展阶段及价值来看,在业务初期,数据量较小,享受 MySQL 般极致性能;在业务高速增长期,可以透明扩展,几乎不限容量;在业务的全生命周期里,可以轻松做到不改代码、不停机迁移,并保证高性能。

第二,OceanBase 作为原生的分布式数据库,天然具备分片自动迁移、负载均衡的可扩展能力,可以在业务无感知的情况下透明扩缩容。基于 Paxos 协议的极致追求,OceanBase 4.x 版本进一步的极致优化,可以做到 RPO=0,RTO<8s,保证系统高可用。

第三,OceanBase 通过最小化分布式开销的架构设计保证数据库高性能,而 OceanBase 的高压缩比相对 MySQL 节省成本6倍以上。同时 OceanBase 多租户十分契合 SaaS 客户的业务场景,资源隔离、扩缩容非常容易。

分布式数据库的数据处理涉及内存、磁盘、网络交互,在延迟方面,内存中读写数据在 0.1 微秒级别,SSD 延迟约为 0.1 毫秒,机房内网络延迟约为 0.1 毫秒,同城机房间延迟约 3 毫秒。整体来看,内存的读写延迟与 SSD、网络之间,相差了 100-1000 倍;吞吐方面,内存读写可达到 100GB/s,而 SSD 约为 1~2 GB/s,万兆网络约为 1.2GB/s,内存与 SSD、网络之间,吞吐能力相差约 100 倍,差了两个数量级。

MySQL 作为单机数据库,InnoDB 和 Server 层是在同一进程中,数据交互非常高效,在性能和延迟方面,基本是无敌的。但对于分布式数据库来说,往往采用了计算存储分离架构,由于计算和存储层之间网络 I/O 开销不可避免,这种设计上就带来的性能瓶颈很难被优化。

OceanBase 的架构设计独特之处就是 SQL引擎,存储引擎,事务引擎实现在一个进程里,OBServer 既做计算又做存储。应用通过 OBProxy 连接 OBServer 集群,OBSever 节点会把数据路由信息上报给 OBProxy,OBProxy 在接收到应用层 SQL后,根据路由信息,直接转发 SQL 到最合适的 OBSever 上去执行。如果数据都在 1 个 OBServer 节点上,那么 SQL 执行过程就是单机的,类似于 MySQL,最大程度减少了网络 I/O 。

图片

(一)为什么 OceanBase 性能更好

当数据量大时或者更高并发时, OceanBase 性能明显优于MySQL, 于是我们对OceanBase 架构进行深入研究。

第一,OceanBase 同时兼具单机低延时、分布式高吞吐特性。在面对生产业务数据时,OceanBase 单机事务占比可以达到 80% 以上,因为 OceanBase 中,数据分片的粒度是一个表或分区。因此,如果更新的只是一张非分区表,或者分区表的单个分区,那么它必定是一个单机事务。更进一步,如果事务中涉及的多个表,都在同一台机器中,也会是单机事务。

第二,通过 Table group 优化跨机 join,可以将跨机事务优化成单机事务。分区粒度的设计,可以保证 80% 的事务是单机的,再通过 Table group 机制优化高频的跨机 join 后,单机事务占比可以进一步提升,如果整个业务中有 90% 以上的事务都是单机事务,性能肯定会很好。

第三,系统会通过 Query 优先级的区分,使得小查询优先,大查询最多占用 30% 工作线程,通过 arge_query_worker_percentage 配置,在没有小查询时,大查询可用到 100% 工作线程。整个机制类似于高速公路通行规则,例如,高速公路有 3 条车道,如果 3 条车道都有车,那么后车很难超车。如果制定一个规则,大车只能走最右侧车道,小车还有两个车道可以通行,这样的运行机制就能很好地预防慢 SQL、大查询堵塞或拖垮系统。

以上三点,来自于架构设计,以及实践中的优化,是保证 OceanBase 高性能的原因。那么,为什么 OceanBase 能够在拥有更高性能的同时,成本却更低呢?

(二)为什么 OceanBase 成本更低?

OceanBase 使用 LSM-Tree 存储引擎,同时支持编码压缩和通用压缩,具有高压缩比,根据我们的测试数据(见下图)可看出集群存储空间相比 MySQL节省 75%,成本更低。

图片

随着多点 DMALL 业务的发展,数据量激增,节点数也在呈指数级变化,眼看着MySQL 的成本很快将超过 OceanBase。如下图所示,6 倍压缩是我们在真实生产环境中得到的测试结论。未来业务数据一直增长,OceanBase 可以不停地加新的节点,而对应的存储成本的增长却是远远慢于 MySQL的。

图片

(三)OceanBase 的多租户和资源隔离能力

OceanBase 的多租户特性更契合 SaaS 场景,从租户间的资源隔离能力与租户的弹性伸缩能力可见一斑。

  • 租户之间的资源隔离能力:OceanBase 的多租户是从CPU、 内存、I/O 上进行物理隔离,这非常关键,保证了业务之间不会出现资源争抢,相互影响,不会因为一个业务而影响其他的租户。

  • 租户的快速弹性伸缩能力:对于一个租户而言,假设有 3 个 Zone,每个 Zone 有 2 台机器,一共 6 台机器,每台机器 有 1 个资源单元。如果想去扩容,只需要一条 SQL语句,就可以加上 Zone 4、加上 Zone 5,变成更多的 Zone,从 6 个资源单元变成了 10 个,轻松完成水平扩容。同时垂直类的扩容也很简单,比如初期给定的资源是 2C8G,业务增长后,又不想加机器,可以把资源单元从 2C8G 变更为 6C12G,整个过程是动态无损的,业务无感知。这对 DBA 来讲也是一条 SQL 就能搞定,极大降低了工作量。因此,多租户能力很好地解决了 SaaS 场景需要部署一套系统,想要节省成本且方便后期扩容的需求。

图片

图片

多点 DMALL作为 SaaS 场景服务商,本身面临着数据库多、数据增速快、资源成本高、运维难度大等诸多痛点。分布式数据库可以很好地支撑业务增长,提升开发效率,解放 DBA,是未来数据库转型坚定的方向。经过探索测试,验证了 OceanBase 在扩展性、性能、成本方面的优势,符合当前业务发展的需求,且多租户能力方面与零售 SaaS 场景非常契合,后续必定会有更加深入的合作。

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

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

相关文章

GPT引领前沿热点、AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域&#xff1a; 1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。 2、数据可…

深度入门 Android 车机核心 CarService 的构成和链路

作者&#xff1a;TechMerger 本文将结合 Android 系统整体&#xff0c;对 CarService 的构成和链路对其做一个全面的分析和理解。 构成 1. CarServiceHelperService 系统服务 SystemServer 中专门为了 Automotive OS 设立的系统服务&#xff0c;用来管理车机的核心服务 CarS…

【Nginx24】Nginx学习:压缩模块Gzip

Nginx学习&#xff1a;压缩模块Gzip 又是一个非常常见的模块&#xff0c;Gzip 现在也是事实上的 Web 应用压缩标准了。随便打开一个网站&#xff0c;在请求的响应头中都会看到 Content-Encoding: gzip 这样的内容&#xff0c;这就表明当前这个请求的页面或资源使用了 Gzip 压缩…

Java基础——反射

1 概述 Java反射提供了一种动态获取类信息及动态修改运行规则的机制。 反射指运行时获取一个类中的信息&#xff0c;并控制其行为。运行时可以获取构造器对象Constructor&#xff0c;可以获取成员变量对象Field&#xff0c;可以获取方法对象Method 2 获取类对象的方式 获取C…

看完这篇 教你玩转渗透测试靶机Vulnhub——Momentum:2

Vulnhub靶机Momentum:2渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;漏洞发现&#xff1a;③&#xff1a;文件上传漏洞利用&#xff1a;…

Mysql--事务

事务 开始之前&#xff0c;让我们先想一个场景&#xff0c;有的时候&#xff0c;为了完成某个工作&#xff0c;需要完成多种sql操作 比如转账 再比如下单 第一步 我的账户余额减少 第二步 商品的库存要减少 第三步 订单表中要新增一项 事务的本质&#xff0c;就是为了把多个操…

jmeter While控制器

一种常见的循环控制语句&#xff0c;用于重复执行一段代码块&#xff0c;直到指定的条件不再满足。 参数&#xff1a; 空LASTJMeter变量、函数、属性或任意其他可用表达式 &#xff08;jmeter提供的方法&#xff09;。判断变量值count_num小于等于20&#xff0c;推荐简单的几…

Django+Nginx+uWSGI+Supervisor实战

大家好&#xff0c;真的是许久没有更新文章了&#xff0c;甚是想念&#xff0c;最近这段时间事情很多&#xff0c;家里的事情、工作的事情&#xff0c;真没有太多时间去码文章&#xff0c;其实已经搁置了些许文章&#xff0c;没有整理&#xff0c;趁着这段时间风平浪静&#xf…

sublime text 格式化json快捷键配置

以 controlcommandj 为例。 打开Sublime Text&#xff0c;依次点击左上角菜单Sublime Text->Preferences->Key Bindings&#xff0c;出现以下文件&#xff1a; 左边的是Sublime Text默认的快捷键&#xff0c;不可编辑。右边是我们自定义快捷键的地方&#xff0c;在中括号…

Ubuntu-22.04通过RDP协议连接远程桌面

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、RDP是什么&#xff1f;二、配置1.打开远程桌面功能2.验证服务3.防火墙配置4.测试效果 总结 前言 由于一些特殊需要&#xff0c;我需要通过远程桌面连接到U…

谈论浏览器内核

浏览器内核是指浏览器使用的渲染引擎&#xff0c;用于解析并显示网页的内容。主要有以下几种浏览器内核&#xff1a; Trident&#xff08;IE内核&#xff09;&#xff1a;由Microsoft开发&#xff0c;被用于Internet Explorer浏览器。目前已经被Edge取代。 Gecko&#xff1a;…

解密外贸邮箱:揭秘其优势与出奇招!

外贸业务需要面对来自全球范围内的客户和供应商&#xff0c;因此&#xff0c;拥有一个高效可靠的通讯工具非常重要。在这方面&#xff0c;外贸邮箱无疑成为了外贸业务中不可或缺的一部分。那么&#xff0c;外贸邮箱有哪些优势呢&#xff1f;在这篇文章中&#xff0c;我们将会全…

2672. 有相同颜色的相邻元素数目;1947. 最大兼容性评分和;958. 二叉树的完全性检验

2672. 有相同颜色的相邻元素数目 核心思想&#xff1a;枚举。每次操作只会影响index左右两边的数&#xff0c;所以我们只需要判断操作前index左右是否存在相同的数&#xff0c;然后减少一&#xff1b;然后将颜色修改&#xff0c;然后判断修改后index左右相邻的数是否是相同的&…

帆软报表简单设置分组汇总

前言 接手之前同事留下的一个胶膜产品入库登记表&#xff08;帆软报表&#xff09;&#xff0c;结果手滑把原来的报表行删除了。用户反馈需要恢复按报表中 “型号” “卷数” 分组汇总一下 “件数” 字段的值、也就是按每种同型号同卷数分组、相同分组的要有一行汇总&#xf…

路由缓存问题 | vue-router的导航守卫

路由缓存问题 带参路由&#xff0c;当参数发生变化时&#xff0c;相同的组件实例将被复用&#xff0c;组件的生命周期钩子不会被调用&#xff0c;导致数据无法更新。 两种解决方法&#xff1a; 1. 给 RouterView绑定key值&#xff0c;即 <RouterView :key"$route.ful…

软件测试中的43个功能测试点总结

功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。针对web系统的常用测试方法如下&#xff1a; 1、页面链接检查&#xff1a; 每一个链接是否都有对应的页面&#xff0c;并且页面之间切换正…

计算机竞赛 基于深度学习的人脸表情识别

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸表情识别 该项目较…

C#使用proto

写多了go代码&#xff0c;被go mod tidy惯坏了&#xff0c;还以为全天下的都很好用呢&#xff0c;结果发现并不是这样。尤其是项目组的proto还是又封了个工具直接就能跑得&#xff0c;导致以为没那么复杂的事情变得复杂了起来。是有两套生成的规则&#xff0c;时间有点晚&#…

Leetcode 1572.矩阵对角线元素之和

给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线的和为&#xff…

Boost电路实战详解!(高效率同步整流,PID闭环追踪)

文章目录 寄语什么是BOOST电路BOOST同步升压电路设计要求设计方案驱动电路电压采样电路 总体电路代码实物图总结 寄语 提示&#xff1a;若想实战演练&#xff0c;请先熟悉文章操作流程哦&#xff0c;不然会有危险&#xff01;&#xff01; 我建了一个群&#xff0c;分享我个人…