云集电商:如何通过 OceanBase 实现降本 87.5%|OceanBase案例
云集电商,一家聚焦于社交电商的电商公司,专注于‘精选’理念,致力于为会员提供超高性价比的全品类精选商品,以“批发价”让亿万消费者买到质量可靠的商品。面对近年来外部环境的变化,公司对成本控制提出了更高要求,尤其是服务器与人力成本两大领域。当前,服务器成本已占据公司总成本的85%以上,因此,优化成本结构,实现高效降本,已成为我们当前工作的重中之重。
作为 DBA,以更低的成本支撑公司的运营是一项重要的成就;对个人而言,可以学到很多知识和方法论,包括成本分析和评估方法、服务器优化和调整方法、人力成本优化和提升方法等。
业务痛点
在做成本优化前,我们需要对自身业务情况及现有痛点有全局的了解。目前很多互联网公司都面临着架构上的痛点,云集也不例外。如下图所示,最上层的应用层采用微服务架构,增加了一个缓存,这是因为电商场景会有秒杀需求,需要写入很快。

云集主要使用腾讯云上的CDB,业务微服务的架构导致数据库实例数很多。针对每一个微服务的数据库实例,会有基础的一主一从,另外还会有一个用户从库,一般一个系统会对应三个数据库实例。
从中间箭头再往下看,业务数据库通过Flink、Canal等组件输出到大数据以后,会做数据的统计分析,生成T+0、T+1的报表。同时,也会将部分大数据分析的数据同步回业务数据库,供用户查询,形成数据的循环。
右边的话有一个Cloud DB通过OMS到OceanBase的链路,比如有一个订单系统业务,分了32个实例,有个需求是业务需要做整个系统的聚合查询,在原来的分库分表架构下无法实现,因此同步到一个OceanBase集群里面,满足业务查询的需求。以上就是云集现在的整体架构。
那么这个架构存在哪些问题?总的来说,包括四个方面。
第一,数据孤岛。从公司整体角度来看,同一个查询理论上只需要执行一次即可,但由于业务需求不同,无形之中将一份数据在很多存储系统中存储多份。导致请求量放大很多,执行多次。而且数据也存放多份,导致成本上升。
第二,分库分表。分库分表主要依赖于一些中间件,而每个中间件有自己的特点和适用场景,更为关键的是分库分表中间件带来很多问题,需要从业务或运维侧避免:
- 业务侵入,业务需要设计多张表来满足不同的查询需求,所有的查询需求需要围绕分区键,增加了业务复杂度。
- 聚合查询和关联查询变得困难,当出现跨库查询或关联查询时,需要业务将数据收集到应用层进行处理,变得异常困难。
- 运维变得复杂,当需要扩容或缩容时,异常痛苦,需要大量运维操作进行扩容和数据搬迁, 另外当备份和恢复时,也会非常复杂和繁琐。
第三,运营成本,随着微服务进行水平拆分或者垂直拆分,导致数据库实例数大幅增加,资源成本直线升高,另外,每个实例的资源并没有得到充分利用,CPU 利用率未满20%。如果CPU 超过20%,一旦业务波动,服务器就难以支撑,需要预留一定的硬件资源。
第四,数据安全,因等保审核要求,云集需要满足至少两地三中心的容灾水平,这会带来成本的成倍上升。云集在腾讯云上为生产环境做本地备份和远程备份,在远处备份过程中,会遭遇大量运维问题,比如拉取容易失败、拉取耗时过长。另外,因为数据量过大,需要更高的流量,这也导致流量成本大幅上升。
成本优化方案
基于上述架构痛点,我们探索了几种成本优化的方案。
- 业务架构复杂,数据流循环和其他环节冗长,故障概率较高,决定舍弃分库分表架构。
- 在数据治理和数据归档方面,归档服务器存储容量有限,无法满足需求,通过将归档数据转移到OceanBase,利用其数据压缩率高的特性,在节省存储成本的同时,变相扩展容量上限,目前无明显瓶颈。
- 整合业务实例,在保证服务可用的情况下,尽量申请更少的服务器资源;增加服务器资源闲时利用率,比如电商业务主要在白天运行,晚上业务较少的时候就可以生成T0、T1报表数据,充分利用资源。
- 考虑使用具备HTAP特性的分布式数据库替代传统数据库,将在线和分析的业务集中在一套集群中完成,简化数据链路环节,降低业务架构复杂度,减少运维人力。并且在相同业务负载的情况下,发挥分布式数据库高性能的优势,使用更少的机器资源,优化成本。
上述的成本优化方案面临的阻力有哪些呢?
一个新的架构体系需要时间来验证是否能支持现有业务的发展,需要在架构替换前期证明它可以支持业务的发展,并且说服开发团队增加工作量以支持架构改造、学习和适应新技术是值得的。因此,人力和新技术的学习成本是云集架构改造面临的主要阻力。
云集+ OceanBase 的成本优化方案
在整个成本优化过程中,主要考虑了以下几个原则:
- 稳定性强,保证整体业务的稳定和无感知。
- 兼容性高,简化新技术和架构的应用,降低开发难度,减少学习成本。
- 不过度优化,避免因过度优化而降低业务的波动能力。
之所以选择 OceanBase 作为数据存储解决方案,主要是因为:
- OceanBase 与 MySQL 的兼容性,减少开发工作量和版本的稳定性。
- OceanBase 的吞吐量和生态系统的支持良好。
- HTAP 能力和水平扩展能够满足我们的 TP 和 AP 场景的业务需求。

通过引入OceanBase,业务由原来的CDB + ETL + 大数据的架构转变为一套OceanBase集群支撑HTAP业务,减少了数据链路的中间环节,同一套技术栈同时降低开发工作量,通过OceanBase RTO<8s、RPO=0的高可靠性也满足了等保审核的需求,实现了成本上的优化。

总结
本文介绍了基于目前大环境下降本的需要,云集的数据库架构以及使用痛点,探索了实施降本过程中的方案。最终通过引入OceanBase分布式数据库,在满足业务场景的基础上,通过其高性能、高压缩、高可靠、HTAP的特性,为云集节约了机器、存储、人力运维的成本。近几年的大环境变化使得云集业务流量减少了很多,由原来每月的服务器成本峰值达到800多万,降为现在不到100万。
这一成本降低的结果是非常显著的。通过技术的优化和适应环境变化,成功地实现了成本的大幅度减少。这不仅仅是对云集来说,也是对其他企业进行成本优化的一个启示。通过优化技术和适应环境,我们可以有效降低成本,提高效率,获得更好的经济效益。
未来,我们也会不断尝试OceanBase新的特性,比如最新的4.2.1 LTS版本,已经在测试当中,希望OceanBase在云集的业务场景里能带来更大的价值。
相关文章:
云集电商:如何通过 OceanBase 实现降本 87.5%|OceanBase案例
云集电商,一家聚焦于社交电商的电商公司,专注于‘精选’理念,致力于为会员提供超高性价比的全品类精选商品,以“批发价”让亿万消费者买到质量可靠的商品。面对近年来外部环境的变化,公司对成本控制提出了更高要求&…...
详解Rust标准库:BTreeMap
std::collections::BTreeMap定义 B树也称B-树,注意不是减号,是一棵多路平衡查找树;理论上,二叉搜索树 (BST) 是最佳的选择排序映射,但是每次查找时层数越多I/O次数越多,B 树使每个节…...
.NET WPF CommunityToolkit.Mvvm框架
文章目录 .NET WPF CommunityToolkit.Mvvm框架1 源生成器1.1 ObservablePropertyAttribute & RelayCommandAttribute1.2 INotifyPropertyChangedAttribute 2 可观测对象2.1 ObservableValidator2.2 ObservableRecipient .NET WPF CommunityToolkit.Mvvm框架 1 源生成器 1…...
微信小程序使用阿里巴巴矢量图标库正确姿势
1、打开官网:https://www.iconfont.cn/,把整理好的图标下载解压。 2、由于微信小程序不支持直接在wxss中引入.ttf/.woff/.woff2(在开发工具生效,手机不生效)。我们需要对下载的文件进一步处理。 eot:IE系列…...
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
在 Kubernetes 中,NodePort 类型的 Service 允许用户通过每个节点的 IP 地址和指定的端口访问应用程序。如果 NodePort 类型的 Service 无法通过节点的 IP 地址和指定端口进行访问,可能会导致用户无法访问应用。本文将详细分析该问题的常见原因及其解决方…...
Java基础Day-Thirteen
Java字符串 String类 创建String对象的方法 方法一:创建一个字符串对象imooc,名为s1 String s1"imooc"; 方法二:创建一个空字符串对象,名为s2 String s2new String(); 方法三:创建一个字符串对象imooc&a…...
LangChain实际应用
1、LangChain与RAG检索增强生成技术 LangChain是个开源框架,可以将大语言模型与本地数据源相结合,该框架目前以Python或JavaScript包的形式提供; 大语言模型:可以是GPT-4或HuggingFace的模型;本地数据源:…...
【数据结构】哈希/散列表
目录 一、哈希表的概念二、哈希冲突2.1 冲突概念2.2 冲突避免2.2.1 方式一哈希函数设计2.2.2 方式二负载因子调节 2.3 冲突解决2.3.1 闭散列2.3.2 开散列(哈希桶) 2.4 性能分析 三、实现简单hash桶3.1 内部类与成员变量3.2 插入3.3 获取value值3.4 总代码…...
flutter 项目初建碰到的控制台报错无法启动问题
在第一次运行flutter时,会碰见一直卡在Runing Gradle task assembleDebug的问题。其实出现这个问题的原因有两个。 一:如果你flutter -doctor 检测都很ok,而且环境配置都很正确,那么大概率就是需要多等一会,少则几十分…...
Java字符串深度解析:String的实现、常量池与性能优化
引言 在Java编程中,字符串操作是最常见的任务之一。String 类在 Java 中有着独特的实现和特性,理解其背后的原理对于编写高效、安全的代码至关重要。本文将深入探讨 String 的实现机制、字符串常量池、不可变性的优点,以及 String、StringBu…...
leetcode 2043.简易银行系统
1.题目要求: 示例: 输入: ["Bank", "withdraw", "transfer", "deposit", "transfer", "withdraw"] [[[10, 100, 20, 50, 30]], [3, 10], [5, 1, 20], [5, 20], [3, 4, 15], [10, 50]] 输出ÿ…...
基于SSM(Spring + Spring MVC + MyBatis)框架的文物管理系统
基于SSM(Spring Spring MVC MyBatis)框架的文物管理系统是一个综合性的Web应用程序,用于管理和保护文物资源。下面我将提供一个详细的案例程序概述,包括主要的功能模块和技术栈介绍。 项目概述 功能需求 用户管理:…...
yakit中的规则详细解释
官方文档 序列前置知识之高级配置 | Yak Program Language 本文章多以编写yaml模版的视角来解释 规则一览 匹配器 在编写yaml中会使用到这里两个东西 点击添加会在返回包的右下角出现匹配器 上面有三个过滤器模式,官方解释 丢弃:丢弃模式会在符合匹配…...
[c语言]strcmp函数的使用和模拟实现
1.strcmp函数的使用 int strcmp ( const char * str1, const char * str2 ); 如果 str1 小于 str2,返回一个负值。如果 str1 等于 str2,返回 0。如果 str1 大于 str2,返回一个正值。 实例: #include <stdio.h> #include &…...
如何把子组件的v-model修改数据,进行接收然后定义数据格式,子传父的实现
在 Vue 中,实现子组件通过 v-model 向父组件传递数据并接收后进行格式化,可以按照以下步骤来封装和实现: 步骤 1: 子组件实现 v-model 子组件需要定义一个 props 来接收 v-model 的值,并通过 emit 方法发出更新事件。 <!-- …...
linux dpkg 查看 安装 卸载 .deb
1、安装 sudo dpkg -i google-chrome-stable.deb # 如果您在安装过程中或安装和启动程序后遇到任何依赖项错误, # 您可以使用以下apt 命令使用-f标志解析和安装依赖项,该标志告诉程序修复损坏的依赖项。 # -y 表示自动回答“yes”,在安装…...
【算法】递归+深搜:105.从前序与中序遍历序列构造二叉树
目录 1、题目链接 2、题目介绍 3、解法 函数头-----找出重复子问题 函数体---解决子问题 4、代码 1、题目链接 105.从前序与中序遍历序列构造二叉树. - 力扣(LeetCode) 2、题目介绍 3、解法 前序遍历性质: 节点按照 [ 根节点 …...
ESP32 gptimer通用定时器初始化报错:assert failed: timer_ll_set_clock_prescale
背景:IDF版本V5.1.2 ,配置ESP32 通用定时器,实现100HZ,占空比50% 的PWM波形。 根据乐鑫官方的IDF指导文档设置内部计数器的分辨率,计数器每滴答一次相当于 1 / resolution_hz 秒。 (ESP-IDF编程指导文档&a…...
基于Python的旅游景点推荐系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
【开源社区】ELK 磁盘异常占用解决及优化实践
1、问题及场景描述 本文主要讨论在 CentOS环境下基于 rpm 包部署 ELK 系统磁盘异常占用的问题解析和解决方案。 生产问题描述:以下问题现实场景基于ELK体系下,ES服务的磁盘占用问题解析。默认情况下,基于 RPM 安装的 Elasticsearch 服务的安…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...
LeetCode 0386.字典序排数:细心总结条件
【LetMeFly】386.字典序排数:细心总结条件 力扣题目链接:https://leetcode.cn/problems/lexicographical-numbers/ 给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。…...
