为什么科拓停车选择OceanBase来构建智慧停车SaaS应用

本文来自OceanBase的客户——拓客停车的实践分享

科拓停车简介与业务背景

作为智慧停车行业的佼佼者,科拓停车致力于提供全方位的智慧停车解决方案。服务涵盖车场运营管理、互联网智慧停车平台以及停车场增值服务等。通过不断研发创新,打造出了多样化的硬件设备和软件系统,助力客户实现对车场的高效经营与管理。尤其对于拥有众多车场的集团客户而言,其经营管理平台能够从更高层面出发,帮助客户实现车场的统一管理。

今年,我们对集团级经营管理平台进行了重大升级,旨在帮助客户对车场进行深度经营。在业务升级过程中,我们对整个平台的技术架构进行了重构和升级,并引入了OceanBase技术栈。这一引入为集团客户提供了先进的数据管理和处理能力,稳定可靠的数据库解决方案。利用OceanBase的多租户特性,我们成功推动了平台的SAAS化演进,并实现了集团间数据的相互隔离。此外,OceanBase的分布式架构也为未来的系统扩展和业务发展提供了有力支持。

业务痛点

我们旧版的经营管理平台的技术架构核心是基于MySQL和Elasticsearch作为数据存储。平台所需的业务数据大部分是车场的日常运营数据,通过车场的接口上报到平台。整体架构如下图所示:

​​

1700533996

随着经营时间的增加,以及今年业务流量回升甚至超过往年的情况,现有系统架构在性能和扩展性已无法满足业务的发展需求。从上图的数据流向可以清楚地看到所有集团和车场的数据最终都汇聚到Elasticsearch(8核32G、IO吞吐为大概350M/s的SSD盘)中。其中进出车明细索引已经达到近20亿条数据,kt-data应用在处理上报的数据时并发大概是100的TPS,因为需要处理的数据和打宽所需要拼接的数据都会从Elasticsearch查询出来,处理后再写入Elasticsearch,不同数据的逻辑复杂度也不一样,所以实际落到Elasticsearch上的并发操作远大于100。最终导致整个平台存在以下四个痛点。

痛点1:数据不够准确。

整个集团经营管理平台的核心数据依托于车场的业务数据,旧平台采用的是车场业务系统通过接口上报的方式,会有接口异常,以及车场业务调整导致数据不兼容等情况,从而引起数据质量问题,影响客户使用。

痛点2:Elasticsearch磁盘I/O性能出现瓶颈。

因Elasticsearch并不支持传统的SQL中的JOIN操作,在针对业务设计相应索引的时候,我们都是按照大宽表的方式进行设计的。根据接口上报的实时数据,去Elasticsearch中查询多个索引的数据,然后在内存中组装成大宽表写回Elasticsearch不同的索引中,随着流业务量的增加,整体并发升高,Elasticsearch磁盘I/O等各方面出现性能瓶颈。

痛点3:重度依赖Elasticsearch,OLTP场景支持不够友好。

在旧版平台上,我们主要侧重于数据分析和报表制作,以及基础的管理功能,此时Elasticsearch很好地支持了大多数的OLAP场景需求。然而,业务的深入发展促使OLTP的需求也逐渐增加,继续使用Elasticsearch变得不那么理想。例如,当我们为集团客户提供车牌修正功能时,需要同时记录修改操作的详细过程,在这种情况下由于Elasticsearch缺乏事务支持,对于同时保证修改成功并保存操作记录的要求变得难以满足。

痛点4:无法支撑平台SAAS化。

整个平台SAAS架构的升级,因素主要有以下几方面:

  • 每个集团都是独立的,数据没有交互,部分集团也有数据隔离这样的需求,SAAS化后能减轻部分私有化部署和后期运维的成本。
  • 进行资源隔离后,每个集团的数据体量相对所有集团聚合到一起会更小,系统就能拥有更好的性能和稳定性,以及扩展性。
  • 可以根据集团的规模,选择不同规格的租户,能够更加清晰地计算每个集团使用的资源和费用预估。
  • 私有化场景下,我们可以使用MySQL代替OceanBase,把MySQL当成是OceanBase的一个租户,简化私有化的部署和运营。

而Elasticsearch是无法支持多租户、SAAS化架构的,在Elasticsearch已经出现性能问题再进行节点扩容时,所需要的时间也较长,在扩展性上,也不满足我们随时可能会有新的集团接入的情景。

技术选型

上述痛点已经对客户日常使用和体验造成了一些不好的影响。同时随着业务的全面升级,我们考虑对整体的架构和数据存储组件重新设计和选型。其中的考虑因素包括以下4点。

  • 兼容SQL语法:能够支持常规的join、sum等查询。
  • 方便的多租户能力:为了满足客户资源隔离的需求和平台SAAS化的改造。
  • 具备一定的OLTP能力:虽然有统计分析类的新增业务需求,但是分租户后一个集团的数据不再像以前所有数据汇聚到一个索引,每个租户下的数据量相对就小一些。
  • 扩容要简单:客户是逐渐接入的,初期我们不会建设过大的服务集群(资源),希望能够随客户的不断接入,逐步去增加数据库的资源。

最终我们把目光投向了分布式数据库,前期我们对OceanBase、TiDB、openGauss等数据库进行了简单的预研,最终选择OceanBase的主要原因有三点。

其一,OceanBase和TiDB都支持多租户和兼容MySQL,而OceanBase的SQL兼容性更高。

其二,OceanBase架构简单,核心组件就OBServer;openGauss开源版本其实是一个单机数据库(通过其它组件实现分布式部署);TiDB的组件更多,如果出现问题后期维护成本可能更大。

其三,OceanBase的binlog接入相对TiDB简单,提供oblogproxy和canal-for-obd插件,Canal是我们公司采集binlog的主要工具。

功能和性能验证

环境准备

•          服务器配置:总共2台,1台 8核16g 磁盘(data:500G,redo:200g),1台 4核 8g

•          租户test:4核8G (1zone 1unit)

•          OceanBase Version:4.1.0.1(社区版)

•          OceanBase Release:102000042023061314.el7

部署结构如下图所示:

1700534074

​​

基础功能验证 

首先,我们进行了MySQL基础功能验证。对INSERT、UPDATE、DELETE、CREATE TABLE、DROP TABLE、ALTER、CREATE INDEX等系列操作进行了简单的功能验证,均能正常使用。

其次,Canal-adapter数据写入功能验证。因为我们已经基于Canal做了比较完善的数据同步服务,所以并没有花更多的时间去研究OceanBase提供的相关服务。使用测试环境数据和线上业务数据分别进行了验证,均能支持MySQL历史数据和实时数据同步到OceanBase。唯一的问题是有些异常信息与MySQL的不一致,通过调整adapter的代码进行了适配。

最后做了Canal拉取binlog功能验证。OceanBase社区版并没有binlog,Canal也无法直接接入,最终通过oblogproxy和canal-for-obd配合完成binlog拉取。在这个过程中遇到了两个问题:一是oblogproxy的版本和OceanBase不完全兼容,一定要按照官方要求的版本进行配合使用;二是canal-for-obd是单独部署的单节点,前期和oblogproxy都没有设置监控,不是特定稳定。

性能测试情况

我们只是在测试环境按照官方提供的TPCH性能测试方案进行了简单的测试,测试数据如下:

​​

1700534090

测试结果表示,总共执行了20个sql语句,90%的sql语句执行时间小于1s,整体上能够满足业务需求。

落地实现

系统架构

在整个平台基于OceanBase实现SAAS化的落地过程中,我们要遇到两个问题。

第一个问题是平台的基础业务数据(车场的真实业务数据),如何按租户实现数据同步链路隔离,最终保障准确的将数据落到各自的租户。

数据同步方面,我们在Canal这个体系上有丰富的经验,我们通过Canal把原始的业务数据汇聚到一个又一个的topic里面,当集团需要数据的时候我们又从topic中将其分离出来写入不同的租户中。这一步我们是通过自研的一个数据过滤/分发程序,结合MQ和Canal同步组件实现整个数据同步链路的建设。从这一步就保障了租户的数据隔离,数据同步链路上各租户间互不影响。

第二个问题是我们的应用程序如何与OceanBase交互实现租户间的切换访问。我们最开始以为OBProxy提供类似的功能,了解后发现好像并不支持,最后通过对几个中间件的了解,最终发现mycat2很契合这种场景,操作也非常简单。我们只需要按照租户在mycat2中创建对应的数据源,然后使用mycat2的透传功能,就能实现租户间的切换,mycat2的注解功能也减轻了我们上层应用SAAS实现AOP(切面)的逻辑。

      /*+ MYCAT:TARGET(c0) */select * from db1.travelrecord;
整体架构如下图所示:

整体架构如下图所示:

​​

1700534110

租户和资源规划

从我们公司整体业务来看,关键在于车场,车辆进出场和缴费是绝对核心,对管理平台的可用性要求较低,对不可避免的故障或短暂中断有一定的容忍度。虽然OceanBase的故障恢复很快,比如重启方便,重启恢复的时间比较短,但我们也需要考虑极端情况,平台核心数据来自于车场的业务数据,如果OceanBase出现数据损坏,或者数据丢失的情况,我们能够重新全量同步对应车场的业务数据到OceanBase,因此,我们在使用OceanBase集群时,一直是单zone的模式,每个租户也是单Unit,这种模式是不具备高可用的,

当然,如果对系统的可用性有很高的要求,在资源允许的情况下,还是建议按照多zone,每个zone下多OBServer,甚至建设多Region的集群。

对于每个租户资源划分的问题,我们有两种方案:一个集团一个租户,根据集团的规模来规划租户资源的大小;一个租户多个集群,规模很小同时没有明确数据隔离需求的就规划到一个租户中。通过这两种方案实现资源的合理规划和充分利用。

集群扩容

我们创建的初始集群资源使用是比较少的:3台OBServer(4核16G),随着业务的发展,我们首先升级了服务器的硬件资源,直到每个OBServer升级到16核64G,再横向扩展OBServer节点以扩展整个集群的资源(添加节点可参考文档)。

其中需要注意的是

  • oceanbase-ce的版本要选择相同的,同时因服务器的版本不同也有所区别。
  • 启动时memory_limit、log_disk_size、cpu_count等参数需要更具实际情况规划好。

总结

尽管我们仍处于对OceanBase的初步使用阶段,但已经显现出令人满意的效果。OceanBase在整个平台的业务升级和技术重构方面扮演着关键角色。其优秀的SQL兼容性和高性能使我们能够回避各种大宽表和统计汇总表的场景。通过常规的关联查询和聚合函数,能够满足绝大部分业务需求,使整体业务实现更加简单、清晰。

同时,多租户提供的强大资源隔离和管理能力是我们成功实施整个平台的SAAS化建设的关键。即使在初期阶段,我们已经感受到了多租户特性为我们的业务带来的巨大价值。

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

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

相关文章

回归损失函数

目录 1 MAE 2 MSE 3 MAPE 4 Quantile Loss分位数损失 回归损失函数也可以做为评价指标使用,但是有没有想过数据分布与损失函数之间的关系呢! 使用特定损失函数的前提是我们对标签的分布进行了某种假设,在这种假设的前提下通过极大似然法推…

Eclipse中 Maven安装与配置步骤,2024年最新面试总结

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞…

vscode如何方便地添加todo和管理todo

如果想在vscode中更加方便的添加和管理TODO标签,比如添加高亮提醒和查看哪里有TODO标签等,就可以通过安装插件快速实现。 安装插件 VSCode关于TODO使用人数最多的插件是TODO Height和Todo Tree 按住 CtrlShiftX按键进入应用扩展商店,输入to…

基于stm32_h5的freertos编程示例

目录 基于stm32_h5的freertos编程示例实验目的添加FreeRTOS配置FreeRTOS测试工程本文中使用的测试工程 基于stm32_h5的freertos编程示例 本文目标:基于stm32_h5的freertos编程示例 按照本文的描述,应该可以在对应的硬件上通实验并举一反三。 先决条件…

十大远程控制软件排名

远程控制软件在现代计算环境中扮演着至关重要的角色,它们使得用户能够轻松地访问和管理远程计算机或设备。随着技术的不断进步,市场上涌现出许多优秀的远程控制工具。以下是对当前市场上十大远程控制软件的简要排名和介绍,以帮助您选择最适合…

上位机图像处理和嵌入式模块部署(树莓派4b实现xmlrpc通信)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面,我们也用纯API实现过上位机和开发板之间的通信。当时使用的方法,就是用windows自带的网络sdk和linux自带的api函数来完…

微软提供用于测试框架的SDK

微软发布了 MSTest SDK。 MSTest SDK基于 MSBuild Project SDK 系统构建并基于MSTest 运行程序,旨在为开发人员提供更好的使用 Microsoft 单元测试框架 MSTest 进行测试的体验。 微软表示, 4 月 11 日发布的MSTest SDK通过合理的默认设置和灵活的选项使…

Git回滚操作,工作区和暂存区恢复修改删除的文件

在利用git协作过程中,经常需要进行代码的撤销操作,这个行为可能发生在工作区,暂存区或者仓库区(或版本库)。 我们先讨论在工作区与暂存区发生的撤销行为,这里会有两个命令提供帮助,git restore…

uni-app学习

目录 一、安装HBuilderX 二、创第一个uni-app 三、项目目录和文件作用 四、全局配置文件(pages.json) 4.1 globalStyle(全局样式) 导航栏:背景颜色、标题颜色、标题文本 导航栏:开启下拉刷新、下拉背…

【GDAL-Python】10-在Python中可视化多波段卫星影像

文章目录 1-介绍1.1 主要内容1.2 线性拉伸介绍 2-代码实现2.1 数据介绍2.2 代码实现2.3 效果显示 4-参考资料 1-介绍 1.1 主要内容 (1)在本教程中,主要介绍如何使用 Python 和 matplotlib 可视化多波段 Landsat 8 卫星影像组成的真彩色影像…

Python也可以合并和拆分PDF,批量高效!

PDF是最方便的文档格式,可以在任何设备原样且无损的打开,但因为PDF不可编辑,所以很难去拆分合并。 知乎上也有人问,如何对PDF进行合并和拆分? 看很多回答推荐了各种PDF编辑器或者网站,确实方法比较多。 …

DRF APIView源码分析

【三】APIView源码分析 【1】Response和JsonResponse的区别 (1)Django REST framework的Response DRF的Response类是专门为构建RESTful API设计的。 它不仅仅是一个简单的JSON响应,而是包含了一系列与RESTful API交互有关的功能。 内容类型…