当前位置: 首页 > news >正文

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言:自2021年起,翼鸥教育便开始应用OceanBase社区版,两年间,先后部署了总计12套生产集群,其中核心集群占比超过四分之三,所承载的数据量已突破30TB。自2022年10月,OceanBase 社区发布了4.2.x 版本,其单机效能、数据压缩实力及AP分析能力等核心功能进行了整体升级,深深吸引了我们的目光。于是,在4.2.1 LTS版正式面世后,我们立刻启动了升级计划,目前已经从最初的OceanBase 3.1.4升级到4.2.1 版本。
本文分享我们在版本升级过程中积累的一些经验,供大家参考。

家里有孩子的朋友或许对翼鸥教育的核心产品“ClassIn在线教室”比较熟悉。作为应用于150多个国家的全球教与学一体化平台,ClassIn 为学生提供从课前到课后的智慧服务,以及从软件到硬件的配套设施。此外,翼鸥教育旗下还有TeacherIn、NOBOOK 等众多优质的教育科技产品。

翼鸥教育应用OceanBase的起因是想解决MySQL带来的问题。众所周知,MySQL读出现瓶颈时,可以通过扩展从库轻松解决,但遇到写瓶颈的时候就比较难办了。尤其是单机数据增长到2TB以上,写能力愈发受限,数据处理效率也逐渐变低。这时我们会想到分库分表方案,但分库分表无法从根本解决问题。业务连续性也是一个问题,MySQL的高可用能力依赖外部组件,需要投入专门的人力去维护。因此,当我们了解到OceanBase多分区的灵活扩展能力、高数据压缩率以及金融级高可用后,我们怎么会不选择它呢?

我们为什么选择将OceanBase从 3.1.4版本升级到4.2.1版本?

在上线OceanBase 3.1.4版本后,我们陆续部署了12套生产集群,其中超过3/4的集群是核心集群,数据量超30TB。上线之后,OceanBase 3.1.4的确为我们解决了不少难题,在灵活扩展、数据库压缩和高可用等方面的表现优异。

OceanBase在翼鸥教育的应用场景如下图所示,翼鸥教育的应用通过访问SLB(服务器负载均衡)再连接到OceanBase生产集群。在大数据场景下,由于OceanBase 3.1.4版本AP性能较弱,我们将上游数据通过OMS工具同步至OceanBase集群,在实时场景使用OMS将数据同步至Kafka,在离线场景使用Data X将数据抽取到大数据的数仓系统中进行分析。

1723630763

俗话说没有一款产品是万金油,OceanBase 3.1.4在我们的业务场景中逐渐显现出一些不足。

1.      DDL支持不完善。OceanBase的DDL速度非常快,但在3.x版本支持不够完善,比如向上兼容不支持text-> medium text,再比如不支持int -> varchar的列类型修改。

2.      字符集支持不完善。由于历史原因,我们使用的字符集没有用OceanBase 支持的 utf8mb4_general_ci,而是 utf8mb4_bin字符集,导致我们使用OMS在上游加字段时,下游的大数据集群就会发生数据迁移任务的中断。

3.      大IN支持不友好。例如在MySQL中 IN 包含 80万个值,查询只需10ms,而在OceanBase 3.1.4版本中需要5s,是因为时间主要消耗在查询解析方面。OceanBase 4.2版本后对这方面做了优化,性能提升明显。

4.      分区数太多影响性能。当分区数超过30000后,响应时间下降明显。

5.      数据膨胀问题。OceanBase的降本增效的效果非常显著,原来MySQL集群中6TB数据迁移到OceanBase后缩减到了1TB。但我们发现集群使用一段时间后,数据存在空间放大的问题。比如本来一年增长1.5TB,但集群膨胀了4T。

6.      物理备份不支持S3。S3是可以充分利用网络带宽且价格优惠的存储方式,但OceanBase 3.1.4版本仅支持nfs,未支持S3。

基于上述使用方面的不足,我们决定升级到OceanBase 4.x版本。

升级至OceanBase 4.2.1版本的流程和效果

从版本选型到版本升级,我们历经四个阶段:版本选型、功能和性能测试、组件升级、集群升级。

第一阶段:版本选型。

选择版本时我们主要考虑五个因素。

  • 功能:新版本能否满足当前业务需求?
  • 性能:新版本性能相较于旧版本性能提升多少?
  • 稳定性:新版本是否足够稳定,有没有bug?
  • 兼容性:迁移后与旧的集群是否兼容?
  • 产品生命周期:新版本是否为官方长期支持版本?

针对上述问题,我们结合应用场景需求,对OceanBase 4.x版本特性与升级点进行了分析,认为新版本相较于旧版本性能有显著的提升,能够更好地满足当前场景的需求。且OceanBase 4.2版本是长期支持版本。长期支持版本经过多次迭代,遇到的问题较少;创新版本经过几个版本的迭代和修复,也会渐趋稳定。兼容性方面,因为我们是从OceanBase低版本升级到高版本,所以兼容性良好。

第二阶段:功能和性能测试。

在MySQL环境中,我们可以使用tcpcopy进行流量回放来进行业务验证。然而,在OceanBase中,业务是以租户为单位的,如果直接采集流量,会涉及多个租户。为了方便实现,我们自己开发了一个代理(Agent),实时将SQL_audit中的SQL同步到Kafka。在目标端,可以启动多个Agent读取select语句来并行进行回放,并观察目标端是否受到影响。

1723630789

我们基于gopacket抓包。再进行mysql ps数据解析,经过解析的PS协议及其参数的结果存在Redis,最后通过Agent读取Redis回放。这样可以让我们提前发现业务迁移中可能存在的问题,比如执行计划是否变慢、是否有不兼容问题等。

在迁移前,我们通过sysbench压测观察OceanBase新版本相较于旧版本的性能提升度。我们的服务器规格都是64C/512G,但此处仅基于16C/96G的业务租户配置进行压测。从下图可见,OceanBase 4.2.1版本较OceanBase 3.1.4版本性能提升3倍左右,即使在读写比7:3的场景下,新版本的性能更优,也更为稳定。

1723630834

此外,保险起见,我们基于JMeter,使用CSV动态生成参数的方式对生产线接口进行压测(线上租户配置为3节点16C/96G )。结果如下图所示,OceanBase 4.2.1版本较OceanBase 3.1.4性能提升2倍左右。

1723630855

第三阶段:组件升级。

在确定版本升级后,我们先对组件进行升级,以下是我们在升级过程中的一些经验总结,供大家借鉴:

1. 如何解决长期未使用的Agent导致升级OCP时报错的问题:

具体而言,显示ocp-server-ce:check_operation_task未通过,The Server have running task。这是因为我们升级OCP时使用的Agent经久未用导致无法回滚,所以我们在它的原数据库中更新状态就可以了:update task_instance set state='SUCCESSFUL' where id in (父任务id);

2. 如何针对OMS Store 进行性能调优:

作为OMS的重度用户,OMS store可以理解为一个binlogservice的webservice,并且store内部有OB CDC模块。该模块包括数据消费模块和拉取日志模块。消费日志线程(cdc)会从多个OBServer中拉取clog并排序,存储到内存中。此时,CDC拉取日志模块会消费内存中数据,并将其落盘。然而,由于最初使用的是机械硬盘,默认的storage即机械盘,导致落盘速度较慢。为了进行性能调优,我们将参数storage调整为内存,并且将OB CDC使用的内存限额从20G调整为40G。此外,为了及时更新心跳时间,我们还将DDL当前拉取日志的上限(progress_limit_sec_for_ddl)从3600秒调整为60秒。

3. 如何解决OMS迁移和同步任务延迟问题:

在OMS的迁移流程中,首先会启动OMS store,以保证后续DBA能成功取到增量数据。然后,全量迁移流程随之启动,待全量迁移和全量校验完成后,再启动增量数据迁移和校验流程。在这个流程中,我们经常遇到数据迁移慢、校验时间长的问题,以及数据同步到Kafka

延迟的问题。究其原因,不同场景采用默认参数,速度不及预期,我们可以通过调整参数来解决上述问题。

在数据迁移和校验场景,速度慢的时候我们通常会想到调整线程数或切片大小,以读取更多数据。但是读取更多数据就意味着内存需要更大的承载量,所以我们要把JVM参数调高。

常用调参:

•       workerNum | limitator.platform.threads.number

•       sliceBatchSize | limitator.select.batch.max

•       connectorJvmParam       | task.checker_jvm_param

应用场景调参:

•       sliceByMinMax: false(id不连续)

•       sliceByMinMax: true(id连续)

在数据同步sink到Kafka场景下,如果速度较慢,可能是由于分片算法的影响,导致OBServer的I/O较高。这是slicebyminmax的原因,通常情况下,我们的跑批操作类似数据库工具pt和ghost,它们基于范围100~~10000不断向前滚动。然而,有时我们的自身ID包括业务使用的UUID,它可能是不连续的,这会导致读取I/O较高。在这种情况下,需要关闭切片的slicebyminmax设置,这样可以提高数据同步速度。如果仍然无法满足预期,在机器的支持能力足够的情况下,还可以调整批处理的大小,每次读取更多的数据。

另外还需要调整JVM的内存。在这个场景下,开发人员都知道,对于插入操作,可以很容易地进行批量处理。但对于更新和删除操作,就不那么容易进行批量处理。因此,需要根据上游的情况如是否有大事务等,动态调整参数,尤其是针对insert和update的比例。首先消除最重要的瓶颈,然后再调整其它常用的参数,特别是在OMS中将增量同步到大数据库的情况下。我们采取了大数据库的lock_time默认值,并将OceanBase的ob_query_time参数设置得比较大,因为锁的释放时间根据ob_query_time来确定,可能会导致长时间被锁住的情况,进而使jdbc的writer的点位不更新。实际上,数据仍然会持续写入目标端。

常用调参

•       workerNum

•       maxRecordCapacity

•       connectorJvmParam

应用场景调参

•       splitThreshold(insert攥批效率高;update和delete不能批量,拆开效果好)

4.如何解决4018错误码报错:

在使用OceanBase的过程中,让我们最困扰的问题是4018错误码,这也是版本升级的直接原因。当出现4018错误码的时候,一个zone中两个机器只有一个机器节点报错,无法请求,导致业务报错。短期解决方法是重启报错的机器节点,而从长远来看,升级版本才能彻底解决问题。我们升级到OceanBase 4.2.1.3 版本后,再没有遇到过4018问题。

1723630907

第四阶段:集群升级。

在集群升级的过程中,我们仍然保持谨慎的态度,分为准备、生产上线、整体回归、收尾操作四个步骤,升级成功后整体效果满足预期:

  • 新版本的DDL支持完善,解决了旧版本的DDL问题,且性能得到较大提升;
  • 数据被进一步压缩,比如300GB数据迁移到新版本后压缩至200GB,存储空间得到释放;
  • 新版本的备份支持S3,使我们可以充分利用网络带宽;
  • 数据从OMS同步到Kafka,性能提升7倍。

至于上文提到的字符集支持问题,可能是OB server带来的,在OMS迁移的部分场景中仍会出现任务中断的现象。

总结与规划

目前,我们把8套核心集群都升级到了OceanBase 4.2.1版本,升级经验总结如上。而在我们从上线到使用OceanBase期间,有五点应用经验可供大家参考。

第一,   在我们使用OceanBase的过程中,跑批是业务经常做的工作。经验指出,跑批或数据更新时,尽量指定分区,避免跨节点分布式事务。

第二,   尽可能使用本地索引以节省开销,因为全局索引更新需要分布式事务,所以在唯一性或者多维场景下使用全局索引。

第三,   针对副本切主,OBServer事务查杀有重试逻辑,业务同学要能够及时捕获异常,利用分布式特性和发挥分区并行的优势,避免业务报错。

第四,   在OLAP环境下可以充分利用并行提升查询速度,建议单个分区小于50GB。

第五,   此前人工排查问题时速度比较慢,obdiag推出后,问题定位和日志分析都变得方便、简单,在此推荐大家充分利用这个工具。

后续,我们会把剩余OceanBase集群都升级到4.2.1版本。同时,随着OceanBase 4.3版本AP能力的提升,我们也考虑将大数据集群升级到该版本。


OceanBase 云数据库现已支持免费试用,现在申请,体验分布式数据库带来全新体验吧 ~

相关文章:

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言:自2021年起,翼鸥教育便开始应用OceanBase社区版,两年间,先后部署了总计12套生产集群,其中核心集群占比超过四分之三,所承载的数据量已突破30TB。自2022年10月,OceanBase 社区发布了4.2.x 版…...

WebGIS开发中不同坐标系坐标转换问题

在 JavaScript 中,使用 proj4 库进行坐标系转换是一个非常常见的操作。proj4 是一个支持多种坐标系的 JavaScript 库,提供了从一种坐标系到另一种坐标系的转换功能。 以下是使用 proj4 进行坐标系转换的基本步骤: 1. 安装 proj4 你可以通过…...

【青牛科技】视频监控器应用

1、简介: 我司安防产品广泛应用在视频监控器上,产品具有性能优良,可 靠性高等特点。 2、图示: 实物图如下: 3、具体应用: 标题:视频监控器应用 简介:视频监控器工作原理是光&#x…...

AWTK-WIDGET-WEB-VIEW 实现笔记 (3) - MacOS

MacOS 上实现 AWTK-WIDGET-WEB-VIEW 有点麻烦,主要原因是没有一个简单的办法将一个 WebView 嵌入到一个窗口中。所以,我们只能通过创建一个独立的窗口来实现。 1. 创建窗口 我对 Object-C 不熟悉,也不熟悉 Cocoa 框架,在 ChatGPT…...

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写,也就是说程序在执行的时候生成可以执行的代码,然后执行它。在介绍JIT之前,需要说下两种执行方式:解释执行和编译执行。其中解释执行是通过解释器,将代码逐…...

Go小记:使用Go实现ssh客户端

一、前言 SSH(Secure Shell)是一种用于在不安全网络上安全访问远程计算机的网络协议。它通过加密的方式提供远程登录会话和其他网络服务,保证通信的安全性和数据的完整性。 本文使用golang.org/x/crypto/ssh包来实现SSH客户端 可以通过go …...

Nginx Spring boot指定域名跨域设置

1、Nginx配置跨域: server {listen 80;server_name your-backend-service.com;location / {proxy_pass http://localhost:8080; # Spring Boot应用的内部地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-F…...

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因: (1)Redis有很高的性能; (2)Redis命令对此支持较好,实现起来比较方便 2、使用命令介绍: (1)SETNX SETNX …...

Database Advantages (数据库系统的优点)

数据库管理系统(DBMS)提供了一种结构化的方式来存储、管理和访问数据,与传统的文件处理系统相比,数据库提供了许多显著的优点。以下是数据库系统的主要优势: 1. Data Integrity (数据完整性) 概念:数据完整…...

Qt桌面应用开发 第五天(常用控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…...

初识Linux · 信号处理 · 续

目录 前言: 可重入函数 重谈进程等待和优化 前言: 在前文,我们已经介绍了信号产生,信号保存,信号处理的主题内容,本文作为信号处理的续篇,主要是介绍一些不那么重要的内容,第一个…...

【Linux】虚拟地址空间,页表,物理内存

目录 进程地址空间,页表,物理内存 什么叫作地址空间? 如何理解地址空间的区域划分? 地址空间结构体 为什么要有地址空间? 页表 cr3寄存器 权限标记位 位置标记位 其他 每个存储单元是一个字节,一…...

C++ 并发专题 - 线程安全的单例模式

一:概述: 在C编程中,call_once 是一种机制,用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C11 标准中,std::call_once 是由标准库提供的…...

Spring Boot汽车世界:资讯与技术的交汇

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

力扣 LeetCode 541. 反转字符串II(Day4:字符串)

解题思路&#xff1a; i可以成段成段的跳&#xff0c;而不是简单的i class Solution {public String reverseStr(String s, int k) {char[] ch s.toCharArray();// 1. 每隔 2k 个字符的前 k 个字符进行反转for (int i 0; i < ch.length; i 2 * k) {// 2. 剩余字符小于 …...

Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构

目录 一、Python Web框架要点二、Django流程2.1 Django介绍2.1.1 简介2.1.2 特点2.1.3 MVT模式2.1.4 Django新特性2.1.5 Django学习资料 2.2 搭建Django框架开发环境2.2.1 安装Python语言环境2.2.2 安装Django框架 2.3 创建Django项目2.4 Pycharm创建项目2.5 初试Django52.5.1 …...

Uniapp运行环境判断和解决跨端兼容性详解

Uniapp运行环境判断和解决跨端兼容性 开发环境和生产环境 uniapp可通过process.env.NODE_ENV判断当前环境是开发环境还是生产环境&#xff0c;一般用于链接测试服务器或者生产服务器的动态切换。在HX中&#xff0c;点击运行编译出来的代码是开发环境&#xff0c;点击发行编译…...

Linux设置开机自动执行脚本 rc-local

使用/etc/rc.local 1、启动rc-local服务 首先授予执行权限 chmod x /etc/rc.d/rc.local设置开启自启并启动 sudo systemctl enable rc-local sudo systemctl start rc-local查看状态 sudo systemctl status rc-local2、编写要执行的脚本 vim /home/start.sh #!/bin/bash…...

驱动开发小问题 -记录一下

1 D:\Windows Kits\10\Vsix\VS2022\10.0.26100.0\amd64 D:\Windows Kits\10\Vsix\VS2019 2 windows防火墙白板 无法设置通过powershell防火墙禁用 Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False 3 内核调试 vm虚拟机 设置成 NAT模式 &#xff…...

学习笔记018——若依框架数据权限功能的实现

ps&#xff1a;本文所使用的若依是前后端分离的v3.6.0版本。 1、建表 建立业务表的时候&#xff0c;需要在表中添加user_id和dept_id两个字段。&#xff08;字段一定要一样&#xff0c;下文能体现&#xff09; user_id&#xff1a;表中该条记录的创建人id dept_id&#xff1…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...