OceanBase 的探索与实践

作者:来自 vivo 互联网数据库团队- Xu Shaohui

本文总结了目前我们遇到的痛点问题并通过 OceanBase 的技术方案解决了这些痛点问题,完整的描述了 OceanBase 的实施落地,通过迁移到 OceanBase 实践案例中遇到的问题与解决方案让大家能更好的了解 OceanBase 功能与特性,最后总结了 OceanBase 优缺点与展望。

一、背景

vivo 作为一家以设计驱动创造伟大产品,以智能终端和智慧服务为核心的科技公司,服务全球5亿+用户,用户持续增长,同时数据量也持续增长,在数据库运维过程中遇到如下问题:

  • 分库分表:随着业务数据量的不断增长,MySQL 实例数据量超过了单机容量限制,业务分库分表的需求越来越多,分库分表的改造成本和风险比较高,需要能够兼容 MySQL 的分布式数据库解决分库分表的问题。

  • 成本压力:业务用户基数比较大,每年的数据自然增长规模也很大,需要持续采购新的服务器来满足数据增长需求,存在一定的成本管理压力。

基于上述问题,我们调研了目前市面上兼容 MySQL 且较为成熟的分布式数据库产品后,最终选择了 OceanBase,期待其原生分布式和分区表特性解决 MySQL 的分库分表问题;其极致的数据压缩能力与组户级资源隔离节省存储成本、运维成本。

1.1 原生分布式和分区表特性

OceanBase 的原生分布式架构分为 OBProxy 层, OBServer  层,前者负责数据路由转发,后者负责数据存储与计算。OceanBase 通过可用区(Zone)来划分节点,以便集群内的自动容灾处理和优化策略能更好地工作,根据不同的场景部署不同高可用方案,如:同城三机房三副本部署,三地五中心五副本部署等,同时,通过增加节点实现透明水平扩展,支持业务快速的扩容和缩容,解除我们的单机容量限制。

图片

OceanBase 分布式架构

(图片来源: OceanBase 官网)

1.2 数据压缩能力与组户级资源隔离

OceanBase 的表可设计为分区表,每个分区均衡分布到不同的 OBServer 节点上,每个物理分区有一个用于存储数据的存储层对象,叫做 Tablet,Tablet 有多个副本分布在不同的 OBSever 节点,使用日志流(Log Stream)来做数据持久化和副本之间的数据同步,正常情况下主副本提供服务,当主副本故障时会自动切换从副本,从而保证数据的安全性与可用性,一个集群可创建多个互相之间隔离的数据库"实例",叫做租户(Tenant),可为多个独立业务提供服务,租户间数据隔离,降低部署和运维成本。此外,得益于 LSM-Tree 的存储引擎,OceanBase 具备极致的数据压缩能力,据官方文档及企业案例介绍,可以使存储成本降低60%以上。

总的来说,OceanBase 的原生分区表能很好地解决业务架构中分库分表带来的问题,分区表对上层业务无感知,可以节省大量的改造成本与时间,并降低风险,提高业务可用性,数据压缩能力可以极大地节省我们的存储空间,此外,OceanBase 的性能、可用性、安全性、社区支持等方面也都符合运维预期,满足业务需求。

二、OceanBase 落地实践

为了更顺畅的实现迁移和运维 OceanBase 数据库,在正式迁移前,我们部署了 OceanBase 运维 OCP 平台、日志代理工具 oblogproxy、迁移工具 OMS,具备了集群部署管理、监控报警、备份恢复、日志采集、迁移等运维能力,结合内部数据库运维管理平台,实现了元数据管理、数据查询、数据变更等能力,能够满足 DBA 运维和业务查询变更需要,具备生产上线的条件。

2.1 OCP 平台部署

OceanBase 云平台(OceanBase Cloud Platform,OCP)是一款以 OceanBase 为核心的企业级数据库管理平台,提供对 OceanBase 集群和租户等组件的全生命周期管理服务,也对 OceanBase 相关的资源(主机、网络和软件包等)提供管理服务,能够更加高效地管理 OceanBase 集群,降低企业的 IT 运维成本。

图片

OCP 架构

(图片来源: OceanBase 官网)

OceanBase 云平台包括管理 Agent(Management Agent)、管理服务(Management Service)、元信息数据库(Metadata Repository)、监控数据库(Monitor Repository)、管理控制台(Management Console)和 OBProxy(OceanBase 专用反向代理) 这六个模块,每个模板之前协同工作。OCP 还提供高可用方案,一主多备,解决单点故障问题。

在部署时,我们将 OCP 元数据,管理服务等均使用三节点跨机房部署,避免单一节点故障,实现高可用性。由于公司已有一套告警平台,所以在部署时,我们通过 OCP 的告警通道自定义脚本功能实现 OCP 与公司告警服务的对接,让 OCP 的告警能更好地兼容到公司的告警平台。

OCP 工具的另一项重要功能是备份与恢复。在 OCP 中,物理备份由基线数据、日志归档数据两种数据组成,数据备份优先选择 Follower 副本进行备份,当用户发起数据备份请求时,该请求会首先被转发到 RS 所在的节点上,RS 会根据当前的租户和租户包含的 PG 生成备份数据的任务,然后把备份任务分发到 OBServer 节点上并行地执行备份任务,把备份文件数据存放在指定的网络存储,如NFS、S3等。

图片

OCP 备份架构

(图片来源: OceanBase 官网)

OceanBase 数据库支持的备份介质丰富,包括 NFS、阿里云 OSS、腾讯云 COS、AWS S3 ,以及兼容 S3 协议的对象存储。此处值得一提的是,在 OCP上创建备份策略,存储介质为S3,集群发起备份时要把备份文件存放在指定S3目录,如下图所示。

图片

2.2 oblogproxy 工具部署

oblogproxy(OceanBase LogProxy,即 OceanBase 日志代理)是 OceanBase 的增量日志代理,它可以与 OceanBase 数据库建立连接并进行增量日志读取,为下游服务提供变更数据捕获(CDC)的能力。其 Binlog 模式为兼容 MySQL binlog 而诞生,支持现有的 MySQL binlog 生态工具来同步 OceanBase,现有的 MySQL binlog 生态工具可以平滑切换至 OceanBase 数据库。

图片

oblogproxy 架构

(图片来源: OceanBase 官网)

oblogproxy 启动 bc 模块用于拉取 OceanBase clog 并将其转换为 binlog 格式,转换后将其写入到文件,即 binlog 文件,MySQL binlog 生态工具(图中为 Canal 或 Flink-CDC)发起 binlog 订阅请求到 OBProxy,OBProxy 收到 binlog 订阅请求后将其转发至 oblogproxy,接收到 OBProxy 转发的 binlog 订阅请求后启动 bd 模块,bd 模块启动后读取 binlog 文件并对外提供订阅服务,即 binlog dump 。我们通过网络共享存储存放元数据的方式实现oblogproxy 多节点部署,避免单一节点故障,实现高可用。

2.3 OMS 工具部署

OceanBase 迁移服务(OceanBase Migration Service,OMS)是 OceanBase 数据库提供的一种支持同构或异构数据源与 OceanBase 数据库之间进行数据交互的服务,具备在线迁移存量数据和实时同步增量数据的能力。

图片

OMS架构

(图片来源: OceanBase 官网)

OMS 主要服务包含:

  • DBCat,数据对象采集和转换组件。

  • 增量拉取组件 Store、增量同步组件 Incr-Sync、全量导入组件 Full-Import 和全量校验组件 Full-Verification。

  • 基础服务组件,包括集群管理、资源池管理、高可用组件和元数据管理等多个组件,以保证迁移模块的高效调度和稳定运行。

  • 管理控制台,进行一站式迁移调度。

在部署 OMS 时,我们对于 OMS 元数据、迁移服务均使用三节点跨机房部署,避免单一节点故障,实现高可用。在使用 OMS 进行数据迁移、同步等监控与告警方面, OMS 没有重复实现相关组件,而是通过调用 OCP 的告警通道来发送告警。

三、数据库迁移方案与实践

3.1 MySQL 迁移 OceanBase 实践

为了防止迁移过程出现难以解决的问题,我们对迁移可行性进行了评估。经过性能压测、兼容性测试(表结构,查询 SQL,账号等)均符合要求。在进行分区适应性测试时,发现业务使用分区表时,表结构需要做兼容性修改,查询 SQL 也要适配分区表,但结合业务改造成本评估,结果也符合预期。

我们使用 OMS 将 MySQL 数据迁移到 OceanBase,迁移链路支持全量和增量,保证数据的实时同步和全量校验并提供反向增量同步,迁移异常时业务能快速回滚,保证业务可用性。

图片

OMS 数据迁移项目

迁移流程分为8个步骤:

  • 第一步,迁移前配置校验。

  • 第二步,验证 OceanBase租 户与账号。

  • 第三步,数据一致性校验。

  • 第四步,DDL 表结构修改暂停。

  • 第五步,数据同步延迟校验。

  • 第六步,应用切换数据库连接配置,或者修改域名解析。

  • 第七步,KILL 源库残余连接,确保应用连接到OceanBase。

  • 第八步,停止 OMS 数据正向同步,开启反向同步,用于回滚。

图片

以上流程是为确保切换成功,减少迁移风险,并提供了回退预案,最大程度保证业务的可用性与安全性。

迁移了5套 MySQL 集群近20T的数据到 OceanBase 集群,带来如下收益:

  • 云服务存储了海量数据并且数据还在持续快速增长,原本 MySQL 分库分表方案的维护与管理需要巨大成本,而且存在较大的可用性风险。OceanBase 分区表替代了分库分表方案,不仅解除了维护管理成本,高压缩特性也节省了存储成本。

  • 风控集群数据写入量较大,导致主从延迟一直居高不下,存在数据丢失风险,OceanBase 数据强一致性很好的解决这个问题并且存储空间节省70%。

  • 金服归档库使用 tukodb 存储,存在唯一索引失效的问题,tukodb 官方也不再维护,可用性得不到保证,迁移 OceanBase 后,该问题迎刃而解,查询与 DDL 性能有大幅度的提升,分布式水平扩展解决单机容量问题。

3.2 某分布式数据库迁移 OceanBase 实践

由于此前在一些边缘业务应用某分布式数据库,自 OceanBase 上线后,我们也决定将这部分业务统一迁移到 OceanBase。我们考虑了两种迁移方案,第一种方案是基于某分布式数据库的增量同步工具和 KAFKA+OMS,第二种方案是基于 CloudCanal,并进行了方案对比,如下:

图片

CloudCanal 虽然架构简单,但不支持反向同步,增量同步性能较差,不满足业务迁移需求;CDC+KAFKA+OMS 架构虽较复杂,但其与 OceanBase 兼容性更好,支持反向同步便于业务回退,整体性能也更好。因此,最终选择基于 CDC+KAFKA+OMS 的架构方案进行全量迁移和增量同步,同时进行全量校验,并提供反向增量同步。

图片

CDC 把集群的增量数据解析为有序的行级变更数据输出到下游的 Kafka,OMS 通过消费 Kafka 的增量数据写入 OceanBase 完成增量同步。Kafka的数据默认保留7天,如果考虑到数据延迟较大的情况,可以适当调整 Kafka 数据保留时间,同时,OMS 也可以通过增加并发等配置来提高同步速度。

在进行近500亿全量数据同步时,RPS(行/秒)非常低,只有 6000-8000,需要几周才能迁移完成,这显然是不符合预期的。经过分析,发现数据源与目标端均无压力和异常,OMS 服务主机负载也正常,显然问题不在这里。继续分析发现源表的自增主键ID不是连续的,且跨度很大, OMS 默认使用主键来做数据分片,导致全量同步时每次只同步到少量的有效数据,致使 RPS 比较低。

我们修改 source.sliceBatchSize(每个分片记录数)为12000,并把内存调大,调整之后RPS有明显的提高:39,257 /39,254,但仍未达到预期。

通过分析 OMS 的全量同步的 msg/metrics.log 日志,发现wait_dispatch_record_size": 157690,这个指标很高,显示异常:wait_dispatch_record_size 大于 0,表示 OMS 内部计算数据归属分区存在瓶颈,分区表情况下一般都会有积压,分区计算比较耗时,关闭分区计算  sink.enablePartitionBucket=false,并调大 srink.workerNum,RPS 平均能达到50-60W左右,至此迁移性能基本符合预期。

此外,在数据迁移时,我们也遇到三个问题,以下列出问题及解决方案,供大家参考。

  • 问题1

OMS 迁移任务提示  The response from the CM service is not success 。

解决方案

分析任务 connector.log 日志,提示  CM service is not success,但查看CM服务状态是正常的,分析同步任务的内存使用情况,发现内存严重不足,FGC 次数非常高,导致服务异常,调整CM内存:进入 OMS 容器,修改:/home/admin/conf/command/start_oms_cm.sh,jvm修改为 -server -Xmx16g -Xms16g -Xmn8g

  • 问题2

增量同步 RPS 过低,加大并发后基本也就是 8000 左右,而且数据库与 OMS 并没有明显的压力。

解决方案

分析增量任务 connector.log 日志,发现增量追平全量同步位点时还一直提示有大量的 PRIMARY 冲突,但发现源和目标端的数据并没有异常,不存在数据冲突问题,最后发现是 CDC 写入重复数据的原因,进而使 OMS 无法批量写入,导致 RPS 过低。目前 OMS 版本还没有针对这个场景优化,只能加大写入并发数让 RPS 有一定的提升。

  • 问题3

索引空间放大问题,在集群空间使用率只有50%左右,空间充裕时创建索引时报空间不足:ERROR 4184 (53100): Server out of disk space。

解决方案

分析集群节点空间使用率,集群的节点剩余空间还有一半,空间还是比较充裕的,正常来说不应该会空间不足。从 OBServer 日志可见,索引创建时空间放大了5.5 倍,需要5.41TB,而目前集群只剩余1.4TB,明显空间不足。

OceanBase 4.2.3之前的版本存在索引放大的原因是:

  • 排序时落盘的中间结果,同时有元数据记录;

  • 外部排序有两轮数据记录;

  • 排序的时候,数据是解压缩解码的。

OceanBase 4.2.3及更高版本进行了优化,使用紧凑格式存放中间结果并做压缩,同时,让数据一边写一边释放空间。目前,索引空间放大优化到1.5倍,因此,对于数据较大且增量数据较大的场景可以使用4.2.3之后的版本。

四、总结

总体而言,vivo 互联网业务使用 OceanBase 解决了使用 MySQL 遇到的痛点问题。OceanBase 的性能与数据压缩能力比较优秀,其丰富的生态工具也提供了较为完善的运维能力。后续我们将持续深入 OceanBase 的能力探索,同时期待 OceanBase 对于运维工具的功能细节更加完善,开放更多功能,解决我们遇到的问题。

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

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

相关文章

【开源免费】基于Vue和SpringBoot的服装生产管理系统(附论文)

博主说明:本文项目编号 T 066 ,文末自助获取源码 \color{red}{T066,文末自助获取源码} T066,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

租赁小程序的优势与应用场景解析

内容概要 租赁小程序,听起来是不是很酷?其实,它就是一个让你可以方便地租借各种高成本但用得不频繁的商品的平台。想象一下,当你需要租一件派对用的华丽小礼服,或是想体验一下超酷的运动器材,租赁小程序就…

MySQL 权限管理分配详解

MySQL 权限管理分配详解 MySQL权限系统的工作原理权限表的存取用户通过权限认证、进行权限分配的流程账号管理我们常用的授权all privileges到底有哪些权限呢?以及带来的安全隐患有哪些?创建账户的时候最好分配指定的权限,这样子安全也高管理…

使用C#开发VTK笔记(一)-VTK开发环境搭建

一.使用C#开发VTK的背景 因为C#开发的友好性,一直都比较习惯于从C#开发程序。而长期以来,都希望有一个稳定可靠的三位工程数模的开发演示平台,经过多次对比之后,感觉VTK和OpenCasCade这两个开源项目是比较好的,但它们都是用C++编写的,我用C#形式开发,只能找到发布的C#组…

React 组件中 State 的定义、使用及正确更新方式

​🌈个人主页:前端青山 🔥系列专栏:React篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容React 组件中 State 的定义、使用及正确更新方式 前言 在 React 应用开发中,state …

长沙市的科技查新机构有哪些

中南大学图书馆科技查新站: 中南大学图书馆科技查新站成立于2003年12月,中南大学图书馆科技查新站作为教育部首批批准的科技查新工作站之一,具备了在全国范围内开展科技查新工作的专业资质。 长沙理工大学科技查新工作站: 长沙理…

数组 - 八皇后 - 困难

************* C topic: 面试题 08.12. 八皇后 - 力扣(LeetCode) ************* Good morning, gays, Fridary angin and try the hard to celebrate. Inspect the topic: This topic I can understand it in a second. And I do rethink a movie, …

IDEA的service窗口中启动类是灰色且容易消失

大家在学习Spring Cloud的过程中,随着项目的深入,会分出很多个微服务,当我们的服务数量大于等于三个的时候,IDEA会给我们的服务整理起来,类似于这样 但是当我们的微服务数量达到5个以上的时候,再启动服务的时候,服务的启动类就会变成灰色,而且还容易丢失 解决方法 我们按住…

threejs相机辅助对象cameraHelper

为指定相机创建一个辅助对象,显示这个相机的视锥。 想要在场景里面显示相机的视锥,需要创建两个相机。 举个例子,场景中有个相机A,想要显示相机A的视锥,那么需要一个相机B,把B放在A的后面,两个…

应用层协议/传输层协议(UDP)

目录 应用层 如何自定义应用层协议? 序列化方式 1.基于行文本的方式来传输 2.基于xml的方式 3.基于json的方式 4.yml的形式 5.protobuffer(pb)形式 传输层 端口号 协议 UDP 校验和 CRC TCP TCP/IP五层协议 应用层 -- 传输层 -- 网络层 -- 数据链路层…

cocotb value cocotb—基础语法对照篇

cocotb—基础语法对照篇 import cocotb from cocotb.triggers import Timer from adder_model import adder_model from cocotb.clock import Clock from cocotb.triggers import RisingEdge import randomcocotb.test() async def adder_basic_test(dut):"""Te…

【NoSQL数据库】Hbase基本操作——数据库表的增删改查

目录 一、Hbase原理 二、HBase数据库操作 三、遇到的问题和解决方法 一、Hbase原理 HBase的数据模型: 行键 时间戳 列族:contents 列族:anchor 列族:mime “com.cnn.www” T9 Achor:cnnsi.com”CNN” T8 Achor:…

【NLP高频面题 - LLM架构篇】大模型使用SwiGLU相对于ReLU有什么好处?

【NLP高频面题 - LLM架构篇】大模型使用SwiGLU相对于ReLU有什么好处? 重要性:★★★ 💯 NLP Github 项目: NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化…

ElementUI 问题清单

1、form 下面只有一个 input 时回车键刷新页面 原因是触发了表单默认的提交行为&#xff0c;给el-form 加上submit.native.prevent就行了。 <el-form inline submit.native.prevent><el-form-item label"订单号"><el-inputv-model"query.order…

AWS 机器学习,推动 AI 技术的健康发展

目录 一、AI 正在改变生产方式二、从炒作走向务实1、选对场景2、重视数据3、产品思维4、持续优化 三、人才是最稀缺的资源四、负责任的 AI 开发五、未来已来六、启示与思考七、结语 如果说传统软件开发是手工作坊&#xff0c;那么 AI 就像工业革命带来的机器生产。 在最新的一…

【第 1 章 初识 C 语言】1.8 使用 C 语言的 7 个步骤

目录 1.8 使用 C 语言的 7 个步骤 1.8.1 第 1 步&#xff1a;定义程序的目标 1.8.2 第 2 步&#xff1a;设计程序 1.8.3 第 3 步&#xff1a;编写代码 1.8.4 第 4 步&#xff1a;编译 1.8.5 第 5 步&#xff1a;运行程序 1.8.6 第 6 步&#xff1a;测试和调试程序 1.8.…

C++知识整理day4内存管理——new和delete详解

文章目录 1.C/C内存分布2.C语言中动态内存管理&#xff1a;malloc/realloc/calloc3.C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4.malloc/free和new/delete到底什么区别&#xff1f;4.1 对于自定义类型4.2 对于自定义类型4.3 总结&#xff1a;它们…

实现跨平台 SSH 连接:从 macOS 到 Windows WSL 的完整解决方案20241203

&#x1f310; 实现跨平台 SSH 连接&#xff1a;从 macOS 到 Windows WSL 的完整解决方案 ✨ 引言 随着跨平台开发的普及&#xff0c;开发者经常需要在多系统环境中切换和协作。尤其是在 macOS 和 Windows 混合使用的开发环境中&#xff0c;通过 SSH 远程访问和管理 Windows …

检索增强生成RAG与知识图谱

检索增强生成RAG与知识图谱 一、检索增强生成&#xff08;RAG&#xff09;1、简介2、RAG 的优点3、RAG的应用场景4、RAG增强原理 二、知识图谱介绍1、简介2、知识图谱的应用场景3、优劣势分析a、优点:b、缺点: 4、应用实例5、知识图谱和图数据库的关系 一、检索增强生成&#x…

Vue前端开发-路由跳转及带参数跳转

在Vue 3中&#xff0c;由于没有实例化对象this&#xff0c;因此&#xff0c;无法通过this去访问 $route对象&#xff0c;而是通过导入一个名为 useRouter 的方法&#xff0c;执行这个方法后&#xff0c;返回一个路由对象&#xff0c;通过这个路由对象就可以获取到当前路由中的信…