为什么科拓停车选择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化建设的关键。即使在初期阶段,我们已经感受到了多租户特性为我们的业务带来的巨大价值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国内最具有影响力的三个 3D 视觉方向平台!

3D视觉工坊 我的朋友创办的「3D视觉工坊」公众号,由多名名校硕博士和大厂算法工程师共同运营,博主及合伙人参与研发过多种3D视觉产品,包括割草机、自动驾驶、工业3D相机等,有着非常丰富的落地经验。主要专注于3D高斯、工业3D视觉…

【Excel2LaTeX】复杂表格制作的解决方案

刚开始用LaTeX写论文,遇到的第一道坎就是绘制表格,较小的普通表格可以通过简单的语法实现,但是较大的复杂的表格却让我无从下手。 Excel2LaTeX插件 这里介绍一种我用到非常顺手的工具:Excel2LaTeX插件,下载地址&#x…

SSH协议的优缺点

SSH(Secure Shell)是一种用于在计算机网络上进行安全远程访问和执行命令的协议。提供加密通信通道,防止敏感信息在传输过程中被窃听或篡改。SSH还支持文件传输和端口转发等功能,使其成为广泛使用的安全远程管理工具。 1. 安全远程…

对桥接模式的理解

目录 一、背景二、桥接模式的demo1、类型A(形状类型)2、类型B(颜色类型)3、需求:类型A要使用类型B(如:红色的方形)4、Spring的方式 一、背景 在《对装饰器模式的理解》中&#xff0…

MySQL 基础使用

文章目录 一、Navicat 工具链接 Mysql二、数据库的使用1.常用数据类型2. 建表 create3. 删表 drop4. insert 插入数据5. select 查询数据6. update 修改数据7. delete 删除记录truncate table 删除数据 三、字段约束字段1. 主键 自增delete和truncate自增长字段的影响 2. 非空…

CS学习(九)—— 分支实现

if-else 18&#xff1a;若y<x&#xff0c;跳转L2 22&#xff1a;否则&#xff0c;跳转L3。 goto 可见&#xff0c;与if-else类似。但是用goto很low。 条件表达式 又是与if类似&#xff0c;那有没有区别&#xff1f; 当然&#xff0c;条件表达式两个式子都会计算&…

html、css、京东移动端静态页面,资源免费分享,可作为参考,提供InsCode在线运行演示

CSDN将我上传的免费资源私自变成VIP专享资源&#xff0c;且作为作者的我不可修改为免费资源&#xff0c;不可删除&#xff0c;寻找客服无果&#xff0c;很愤怒&#xff0c;&#xff08;我发布免费资源就是希望大家能免费一起用、一起学习&#xff09;&#xff0c;接下来继续寻找…

Leetcode 15. 三数之和(暴力->双指针)

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1…

git clone报错:error invalid path ‘dorisdockerthirdpartiesdocker-composexxxx‘

git clone报错&#xff1a;error: invalid path ‘doris/docker/thirdparties/docker-compose/xxxx’ 在周日晚上&#xff0c;我尝试从GitHub上克隆Doris的代码库&#xff0c;以便进行学习。在使用IntelliJ IDEA进行克隆时&#xff0c;我遇到了一个Git错误。具体操作如下&…

UbuntuServer22.04安装docker

通过ubuntuserver安装docker是搭建开发环境最便捷的方式之一。下面介绍一下再ubuntu22.04上如何安装docker。相关内容参考官网链接&#xff1a;Install Docker Engine on Ubuntu 根据官网推荐&#xff0c;利用apt命令的方式安装&#xff0c;首先需要设置docker仓库&#xff0c…

✌粤嵌—2024/4/3—合并K个升序链表

代码实现&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* merge(struct ListNode *l1, struct ListNode *l2) {if (l1 NULL) {return l2;}if (l2 NULL) {return l1;}struct Lis…

杰发科技AC7840——CAN通信简介(4)_过滤器设置

0. 简介 注意&#xff1a;过滤器最高三位用不到&#xff0c;因此最高位随意设置不影响过滤器。 1. 代码分析 注意设置过滤器数量 解释的有点看不懂 详细解释...也看不大懂 Mask的第0位是0&#xff0c;其他位都是1(就是F?)&#xff0c;那就指定了接收值就是这个数&#xff0c;…

深度强化学习(DRL)算法 附录 6 —— NLP 回顾之预训练模型篇

Self-Attention 模型结构 上图架构以 batch_size 为 1&#xff0c;两个时间步的 X 为例子&#xff0c;计算过程如下&#xff1a; 位置编码 根据 self-attention 的模型结构&#xff0c;改变 X 的输入顺序&#xff0c;不影响 attention 的结果&#xff0c;所以还需要引入额外的…

解决Linux根分区空间不足的方法:利用Home分区进行扩容

前言 在进行系统安装时&#xff0c;一个常见的困扰是默认分区设置可能导致home分区拥有过多的空间&#xff0c;而root分区却显得十分紧缺。这种情况下&#xff0c;用户往往会陷入无法继续安装软件或存储文件的困境。本文将向您展示如何通过合理的调整&#xff0c;将home分区中多…

《剑指 Offer》专项突破版 - 面试题 111 : 计算除法(C++ 实现)

题目链接&#xff1a;计算除法 题目&#xff1a; 输入两个数组 equations 和 values&#xff0c;其中&#xff0c;数组 equations 的每个元素包含两个表示变量名的字符串&#xff0c;数组 values 的每个元素是一个浮点数值。如果 equations[i] 的两个变量名分别是 和 &#…

接口测试——postman

一.下载与安装 https://www.getPostman.com/ 界面导航说明 二.get请求 第一个get请求 批量执行接口请求&#xff1a; 1. 右击run collection 2. 会出现runner标签页 携带参数的GET请求 所谓的查询参数&#xff0c;其实就是URL地址中问号&#xff08;?&#xff09;后面的部分…

易基因: MeRIP-seq揭示lncRNA甲基化通过lncRNA-miRNA/蛋白质轴抑制胃癌干细胞凋亡|文献解读

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 癌症一直是生物学研究的热门话题。关于癌症起源&#xff0c;一种主流观点是癌症干细胞&#xff08;Cancer Stem Cell&#xff0c;CSC&#xff09;的无限增殖。CSC是肿瘤内肿瘤细胞的一个…

textview允许长文本下滑

原本是用scroview textview的&#xff0c;结果长文本的时候&#xff0c;textview会把文本内容截断&#xff1b; 后面在网上找到直接使用textview就能解决长文本问题&#xff0c; 关键代码还是这两个 android:scrollbars“vertical” tv_message_message.setMovementMethod(…

5.HC-05蓝牙模块

配置蓝牙模块 注意需要将蓝牙模块接5v,实测接3.3v好像不太好使的样子 首先需要把蓝牙模块通过TTL串口模块接到我们的电脑,然后打开我们的串口助手 注意,我们现在是配置蓝牙模块,所以需要进入AT模式,需要按着蓝牙模块上的黑色小按钮再上电,这时候模块上的LED灯以一秒慢闪一次…

大数据平台搭建2024(三)

三&#xff1a;HBase安装 提前上传hbase安装包至虚拟机 1 上传、解压 tar -zxvf hbase-2.0.0-alpha2-bin.tar.gz -C /hadoop2 修改配置文件 在/hadoop/hbase-2.0.0-alpha2-bin/conf文件夹里 vi /hadoop/hbase-2.0.0-alpha2/conf/hbase-env.sh修改hbase-env.sh文件 export…