翼鸥教育:从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将数据抽取到大数据的数仓系统中进行分析。
俗话说没有一款产品是万金油,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语句来并行进行回放,并观察目标端是否受到影响。
我们基于gopacket抓包。再进行mysql ps数据解析,经过解析的PS协议及其参数的结果存在Redis,最后通过Agent读取Redis回放。这样可以让我们提前发现业务迁移中可能存在的问题,比如执行计划是否变慢、是否有不兼容问题等。
在迁移前,我们通过sysbench压测观察OceanBase新版本相较于旧版本的性能提升度。我们的服务器规格都是64C/512G,但此处仅基于16C/96G的业务租户配置进行压测。从下图可见,OceanBase 4.2.1版本较OceanBase 3.1.4版本性能提升3倍左右,即使在读写比7:3的场景下,新版本的性能更优,也更为稳定。
此外,保险起见,我们基于JMeter,使用CSV动态生成参数的方式对生产线接口进行压测(线上租户配置为3节点16C/96G )。结果如下图所示,OceanBase 4.2.1版本较OceanBase 3.1.4性能提升2倍左右。
第三阶段:组件升级。
在确定版本升级后,我们先对组件进行升级,以下是我们在升级过程中的一些经验总结,供大家借鉴:
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问题。
第四阶段:集群升级。
在集群升级的过程中,我们仍然保持谨慎的态度,分为准备、生产上线、整体回归、收尾操作四个步骤,升级成功后整体效果满足预期:
- 新版本的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:字符串)
解题思路: i可以成段成段的跳,而不是简单的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判断当前环境是开发环境还是生产环境,一般用于链接测试服务器或者生产服务器的动态切换。在HX中,点击运行编译出来的代码是开发环境,点击发行编译…...
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模式 ÿ…...
学习笔记018——若依框架数据权限功能的实现
ps:本文所使用的若依是前后端分离的v3.6.0版本。 1、建表 建立业务表的时候,需要在表中添加user_id和dept_id两个字段。(字段一定要一样,下文能体现) user_id:表中该条记录的创建人id dept_id࿱…...
Nginx文件下载服务器搭建
Nginx文件下载服务器搭建 80端口启动下载服务器, 下载/var/www/downloads目录下的文件,nginx.conf如下: server {listen 80;location /downloads/ {root /var/www/downloads;autoindex on; # 显示目录autoindex_localtime on;} }浏览器中访问ÿ…...
AWD脚本编写_1
AWD脚本编写_1 shell.php(放在网站根目录下) <?php error_reporting(0); eval($_GET["yanxiao"]); ?>脚本编写成功 后门文件利用与解析 import requests import base64def get_flag(url, flag_url, method, passwd, flag_path):cmd…...
HarmonyOS 如何获取设备信息(系统、版本、网络连接状态)
文章目录 前言一、引入模块和基本设备信息的获取二、设备硬件和系统版本信息的获取三、获取安全相关的设备信息四、获取网络状态信息五、完整 Demo 代码1. 导入所需模块2. 获取设备基本信息代码解析 3. 检测网络连接状态4. 执行函数 总结 前言 HarmonyOS 提供了一个强大的 API…...
2411rust,1.80
1.80.0稳定版 LazyCell和LazyLock 这些"懒"类型会延迟初化其数据,直到第一次访问.它们类似1.70中稳定的OnceCell和OnceLock类型,但单元中包含初化函数. 这稳定化了从流行的lazy_static和once_cell中进入标准库. LazyLock是线安选项,使其适合静态值等位置.如,产生…...
FPGA 第6讲 简单组合逻辑多路选择器
时间:2024.11.11-11.14 一、学习内容 1.组合逻辑 组合逻辑是VerilgHDL设计中一个重要组成部分。从电路本质上讲,组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数,与其他时刻的输入状态无关,无存储电路,也没…...
Android Studio开发学习(五)———LinearLayout(线性布局)
一、布局 认识了解一下Android中的布局,分别是: LinearLayout(线性布局),RelativeLayout(相对布局),TableLayout(表格布局), FrameLayout(帧布局),AbsoluteLayout(绝对布局),GridLayout(网格布局) 等。 二、…...
大模型(LLMs)RAG 版面分析------文本分块面
一、为什么需要对文本分块? 使用大型语言模型(LLM)时,切勿忽略文本分块的重要性,其对处理结果的好坏有重大影响。 考虑以下场景:你面临一个几百页的文档,其中充满了文字,你希望对其…...
Web3游戏先锋 Big Time Studios 重磅推出 $OL 通证,赋能 Open Loot 游戏平台
作为 Web3 游戏领域的领军者,Big Time Studios 不仅创造了热门游戏《Big Time》,还开发了 Open Loot 平台,至今交易量已超过 5 亿美元。如今,Open Loot 平台的活跃用户可以获得 $OL 代币,这是该平台推出的首个实用型代…...
Linux—ln(link files)命令使用方法(How to create links on Linux)
Linux—ln(link files)命令使用方法 在 Linux 系统中工作时,需要在不同的目录中使用相同的文件时,不必在每个目录下都复制一份文件,这样不仅浪费磁盘空间,还会导致文件管理上的混乱。 ln(link files) 便是…...
学习日记_20241110_聚类方法(K-Means)
前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…...
河北住房和城乡建设网站/谷歌浏览器手机版免费官方下载
启动项目java -jar /目录 &例如 nohup java -jar /data/wwwroot/springboot.kingsuper.net/demo.jar & 重新启动项目,要先将之前的端口杀死查询端口netstat -tunlp 杀死端口 kill -9 端口例如 kill -9 18607转载于:https://www.cnblogs.com/SeaWxx/p/109377…...
wordpress好看的中文主题/营销网站类型
一、分析目的 通过分析2B产品中的团队协作管理软件的对比分析,用于为公司团队协作软件的选型做产考。 二、竞品归属市场概况 2.1.目标用户群及需求 主要面向企业用户,用于解决企业不同地域以及不同职能部门之间的团队协作难点。 2.2.市场规模 中国大概有…...
铁岭网站建设/seo01网站
TextView加载字体包在 Android 中,若需要使得某个TextView加载字体包,使用以下方式即可:Typeface typeFace Typeface.createFromAsset(getAssets(),"fonts/Bold.otf");textView.setTypeface(typeFace);至于字体包的位置:…...
建设网站比较好的公司/一个新手怎么去运营淘宝店铺
android开发中利用handler制作一个打地鼠小游戏发布时间:2020-11-25 15:21:11来源:亿速云阅读:136作者:Leah这期内容当中小编将会给大家带来有关android开发中利用handler制作一个打地鼠小游戏,文章内容丰富且以专业的…...
电子商城网站建议书/简述如何对网站进行推广
北京交通大学电气工程学院的研究人员诸斐琴、杨中平等,在2019年第3期《电工技术学报》上撰文指出,在城轨交通中安装地面式超级电容储能系统将有效回收列车再生制动能量,降低系统运行能耗。各个变电所、牵引/制动列车与储能系统通过牵引网进行实时能量交互…...
展示型网站制作公司/百度问答seo
郑重承诺:林哥团队15年分析经验,为大家做推荐,只为能和大家分享自己看好的比赛。希望大家多多关注,底部扫码添加好友,获取更多推荐。公推雷霆VS红队红队赢指没有命中,红队仅以两分优势险胜雷霆赢球输指。NB…...